拖动时jQuery mouseleave无法正确触发

时间:2011-07-22 03:24:56

标签: javascript jquery jquery-ui-sortable mouseleave

我有一个带有mouseleave事件监听器的可排序列表,其行为不正确。

如果我将鼠标移入和移出可排序列表,则mouseleave会正确触发。

如果我第一次单击并拖动其中一个可排序的子项,则mouseleave会错误地触发 - 偶尔发生或根本不发生。

有什么想法吗?

感谢。

更新:这也适用于mouseout事件。

<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");
            }
    });

1 个答案:

答案 0 :(得分:5)

我将做出一个假设,并说当你的元素在视觉上离开可排序区域时,你正试图捕获事件。正如您所知,mouseleave和mouseout不是最好的方法,因为它们跟踪相对于DOM元素的鼠标移动。由于您拖动这些列表项,因此它们实际上从未离开无序列表,因此您无法获得预期的结果。

然而,这应该适合你:

$("#sortable").sortable().disableSelection();
$("#sortable li").mousemove(function() {
    if (parseInt($(this).css("left")) > $("#sortable").width() ||
        parseInt($(this).css("top")) > $("#sortable").height()) {
        //This is when the element is out of bounds
    }
});