jQuery mouseleave 在拖动时无法正确触发
我有一个可排序列表,其中的 mouseleave 事件监听器行为不正确。
如果我将鼠标移入和移出可排序列表,mouseleave 会正确触发。
如果我第一次单击并拖动可排序的子项之一,则 mouseleave 会错误地触发 - 偶尔或根本不触发。
有什么想法吗?
谢谢。
更新:鼠标悬停事件也会发生这种情况。
<style>
#sortable { list-style-type: none; margin: 0; padding: 0; float: left; margin-right: 10px; background-color: #CCC; }
#sortable li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 120px; }
</style>
<script>
$(function(){
$("#sortable").sortable().disableSelection();
$("#sortable").mouseleave(function(){ console.log("mouseleave"); });
});
</script>
<ul id="sortable">
<li class="ui-state-default">Item 1</li>
<li class="ui-state-default">Item 2</li>
<li class="ui-state-default">Item 3</li>
</ul>
更新 我使用以下方法来检测孩子何时被完全拖到可排序之外:
$("#sortable li").mousemove(function() {
if ($(this).offset().left > $(this).parent().outerWidth() + $(this).parent().offset().left ||
$(this).offset().top > $(this).parent().outerHeight() + $(this).parent().offset().top ||
$(this).offset().left + $(this).outerWidth() < $(this).parent().offset().left ||
$(this).offset().top + $(this).outerHeight() < $(this).parent().offset().top ){
console.log("child is outside parent");
}
});
I have a sortable list with a mouseleave event listener that is behaving incorrectly.
If I move the mouse in and out of the sortable list, mouseleave fires correctly.
If I first click and drag one of the sortable's children, mouseleave fires incorrectly - sporadically or not at all.
Any ideas?
Thanks.
update: This occurs for mouseout events as well.
<style>
#sortable { list-style-type: none; margin: 0; padding: 0; float: left; margin-right: 10px; background-color: #CCC; }
#sortable li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 120px; }
</style>
<script>
$(function(){
$("#sortable").sortable().disableSelection();
$("#sortable").mouseleave(function(){ console.log("mouseleave"); });
});
</script>
<ul id="sortable">
<li class="ui-state-default">Item 1</li>
<li class="ui-state-default">Item 2</li>
<li class="ui-state-default">Item 3</li>
</ul>
update
I have used the following to detect when a child has been dragged fully outside of the sortable:
$("#sortable li").mousemove(function() {
if ($(this).offset().left > $(this).parent().outerWidth() + $(this).parent().offset().left ||
$(this).offset().top > $(this).parent().outerHeight() + $(this).parent().offset().top ||
$(this).offset().left + $(this).outerWidth() < $(this).parent().offset().left ||
$(this).offset().top + $(this).outerHeight() < $(this).parent().offset().top ){
console.log("child is outside parent");
}
});
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我将做出一个假设,并说您正在尝试捕获元素在视觉上离开可排序区域时的事件。正如您所发现的,mouseleave 和 mouseout 并不是实现此目的的最佳方法,因为它们跟踪鼠标相对于 DOM 元素的移动。由于您拖动这些列表项,它们实际上从未离开无序列表,因此您不会获得预期的结果。
然而,这应该对你有用:
I'm going to make an assumption and say that you are trying to capture the event when the element visually leaves the sortable area. As you found out, mouseleave and mouseout are not the best ways to do that because they track mouse movement relative to the DOM elements. Since you are dragging these list items they never actually leave the unordered list so you aren't getting the results you expect.
This however should work for you: