这个问题似乎是由于jQuery UI的droppable组件在处理拖动事件时存在一些困难。当你在拖动一个元素并放入另一个droppable元素时,它可能无法正确地触发那个元素的"over"事件。
你可以尝试使用一个叫做"activate"的事件来代替"over"。这个事件在元素被放置并且是目标元素的时候被触发,所以它可能能解决你的问题。以下是你如何修改你的代码的一个示例:
$("#Div").droppable({
accept: "#ball",
activate: function(event, ui) {
var circle = $(event.target).find("#circle");
if(circle.length > 0) {
circle.droppable("option", "over", function(event, ui) {
// 这里写你的"进球了"函数
console.log("进球了");
});
}
}
});
在这个例子中,当#ball被拖动到#Div并且#circle被创建时,我们检查#circle是否存在,如果存在,我们就在#circle上设置"over"事件。这样,当你将#ball拖到#circle时,应该能够立即触发"进球了"函数。
然而,这个解决方案有一个局限性,就是当#ball被放入#circle后,如果你再把#ball从#circle中取出,#circle的"over"事件将不会被触发,除非你再次将#ball放入#circle。这是因为droppable组件在初始化的时候会为每个可接受的元素创建一个新的"over"事件监听器,而这个监听器只在元素第一次被放置的时候被触发。
为了解决这个问题,你可能需要使用一个自定义的事件处理器,而这个处理器可以在每次#ball被放入#Div和#circle的时候被触发。这样,无论何时#ball被移动到#Div或者#circle,你都能确保你的"进球了"函数会被正确地触发。
我最终通过使用draggble元素的refreshPositions属性解决了这个问题,当refreshPositions为true时,拖拽draggable元素会使其计算所有可放置的位置,从而解决了新创建的circle无法被检测到的问题。然而,据我所知,当div内的circle数量过多时,这会大幅影响到性能。如果任何人有更高的方法解决这个问题,我非常欢迎!