【问题标题】:jQuery sortable() is not working after $(document).unbind('mousemove')jQuery sortable() 在 $(document).unbind('mousemove') 之后不起作用
【发布时间】:2013-05-26 18:44:09
【问题描述】:

jQuery Sortable() 运行良好,如果我尝试销毁和创建可排序对象,也运行良好。 但如果尝试$(document).unbind('mousemove') 并重新创建可排序的,它只能工作一次,然后永远不会工作。 我知道我可以更改代码;但我想知道为什么。

这是下面的代码,也在 jsfiddle (http://jsfiddle.net/webjjin/YJEf5/)

<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css">
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>

<div id="container"> 
<ul id="sortable">
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
</ul>
</div>
<button id="btn">Destroy and create</button>
<button id="unbind">Unbind</button>

<script>$("#sortable").sortable();</script>
<script>
var html = $('#container').html();
$('#btn').click(function(){
    $("#sortable").sortable('destroy');
    $('#container').empty();
    setTimeout(function(){
        $('#container').append(html);
        
        $("#sortable").sortable();
    }, 500);
});
$('#unbind').click(function(){
    jQuery(document).unbind('mousemove').unbind('mouseup');
})
</script>

【问题讨论】:

  • Sortable 需要跟踪鼠标位置,以便您拖动对象。与单击和文件输入框返回 false 相同,它们停止工作。如果你有一个跟踪鼠标的函数,你可以添加一个全局变量来启用/禁用你的函数。 IE。 window.notrack=true;,在您的函数中(在其最顶部):if (window.notrack) { return false; }
  • 仅供参考,从 jQuery 1.7 开始,.off() 方法优于 .unbind() 方法来删​​除元素上的事件处理程序。
  • @你为什么要删除所有的事件处理程序,你为什么不能只是disable可排序
  • 我在 1 个答案的评论中回复。
  • 为了测试,去jsfiddle.net/webjjin/YJEf5然后尝试排序(工作良好)-> 销毁按钮-> 排序(工作一次)-> 销毁并创建按钮(应该工作,但不是)

标签: jquery jquery-ui-sortable jquery-events unbind


【解决方案1】:

终于找到原因了。

在 jQuery-ui 文件中。有这个代码。

var mouseHandled = false;
$( document ).mouseup( function() {
mouseHandled = false;
});

和_mouseDown函数检查这样,

if( mouseHandled ) { return; }

这就是为什么如果尝试 jQuery(document).unbind('mouseup'),可排序小部件不起作用,包括其他 jquery-ui 小部件。

谢谢大家。

【讨论】:

  • 但这里还有其他问题。无论如何,有些人可以使用 jQuery(document).unbind('mouseup')。为什么jquery-ui没有提供重新注册上面的mouseup事件?
  • 执行一次 jQuery(document).unbind('mouseup')。它永远不会回来了...... -_-!
【解决方案2】:

使用此代码,

jQuery(document).unbind('mousemove').unbind('mouseup');

您正在删除页面上的 ALL mousemove 和 mouseup 事件侦听器,这对于 jQuery 可排序 至关重要。它用于跟踪拖动元素悬停或放下的位置等功能。所以解除绑定会破坏整个过程。

如果你想解除绑定这些事件监听器,使用特定的选择器:

$('#test').unbind('mousemove').unbind('mouseup');

【讨论】:

  • 然后再次调用.sortable() 应该重新注册这些事件对吗?
  • 由于某些原因,sortable() 不绑定mouseup。即使在 sortable() 被调用后,它仍然是未绑定的。
  • 它应该在解除绑定后重新排序()。为什么我需要 jQuery(document).unbind('mousemove') 是因为还有其他几个组件没有提供销毁方法。但我需要销毁并清空所有这些,然后重绘/重绘。所以我使用了 jQuery(document).unbind('mousemove') 因为我不想介意事件附加在哪里。
猜你喜欢
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
相关资源
最近更新 更多