如何在 $.unbind 后重新启用/绑定 jQuery UI Sortable?

6

$('div.something').sortable(options)可以正常工作,但在执行$('div.something').unbind();后出现错误。尝试重新运行$('div.something').sortable(options);或者$('div.something').sortable('refresh');,但是并没有帮助。

我使用$.unbind来取消插件并从应用插件的元素中删除事件,然而这种技术会对$.sortable产生不利影响。有什么方法可以重新激活sortable吗?

我正在使用最新版本的jQuery和jQuery UI。


你究竟想要停用什么?调用解绑所有事件处理程序的操作有些危险,因为你正在放弃对你所解绑的内容的控制。 - Ruben Infante
@RubenInfante 我正在解除一个插件(lots of jQuery code + backbone)的绑定,因为它做了太多的事情,所以编写一个“destroy”等效方法来逐个清除其代码变得很复杂。其他事件如点击在解除绑定后运行良好,但是排序功能却有问题。 - Steve
你想要禁用 sortable 插件还是禁用元素的所有事件? - Arun P Johny
1
当我们无法看到受到.unbind()调用影响的代码(插件)时,隔离问题变得困难。无论如何,您可以尝试在调用.unbind()之前调用.sortable("destroy")。然后,您应该能够使用最初声明的方法重新创建可排序列表。 - Ruben Infante
在调用 $.unbind 以及 $.sortable(options) 之前,先调用 $.sortable('destroy') 可以解决这个问题。谢谢!请把它添加为答案,我会接受它。 - Steve
2个回答

9
在调用.unbind()之前先调用.sortable('destroy')将完全从元素中删除可排序功能。这可以确保在执行有点危险的.unbind()调用之前进行适当的拆除,该调用会删除元素上绑定的所有处理程序。然后,您可以重新初始化可排序功能。
// Initialization of the sortable feature
$('div.something').sortable(options);
...
// Remove the sortable feature to prevent bad state caused by unbinding all
$('div.something').sortable('destroy');
// Unbind all event handlers!
$('div.something').unbind();
...
// Re-initialize the sortable feature
$('div.something').sortable(options);

1
.sortable('destroy') 真是太棒了。我花了很长时间才找到它 :) - user3311522

7
如果你想停用sortable插件,我建议使用destroy方法。
$('div.something').sortable(options)//Activate
....
$('div.something').sortable('destroy')//Remove the plugin functionality
....
$('div.something').sortable(options)//Reactivate

演示: Fiddle

我正在尝试在 $.unbind() 后重新激活 $.sortable()。问题已解决(请参见:https://dev59.com/lm_Xa4cB1Zd3GeqP4sEi#Y5EHoYgBc1ULPQZFlSLq)。你的想法是正确的。 - Steve
@Max 看起来你添加了一个引用我的答案。 - Arun P Johny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接