为什么负面选择器在jQuery UI可排序'取消'属性中不起作用?

时间:2011-12-21 14:21:03

标签: jquery jquery-ui jquery-ui-sortable

我希望jQuery UI Sortable中的一行只有在具有cansort类时才可排序。我将它设置为cancel: ':not(.cansort)'但它拒绝让我对任何内容进行排序,包括具有cansort类的行。

我知道我可以显式地添加一个禁用类,但我将cansort类用于其他目的,这意味着每次我做出可排序的东西时我都必须删除已禁用的类并添加{{1 } .class。每次我切换一些可以排序的东西时,我都不想添加和删除一个类。

我不想限制cansort属性中可排序的内容,因为每个元素都可以排序,我只能使用items类动态切换它。

1 个答案:

答案 0 :(得分:1)

这样做的原因是cancel窗口小部件处理ui.mouse选项的方式(几个jQueryUI窗口小部件用来处理鼠标事件的窗口小部件)。查看this line of code

elIsCancel = (typeof this.options.cancel == "string" 
    && event.target.nodeName ? 
        $(event.target).closest(this.options.cancel).length : false);

这意味着您的选择器会在closest的元素上使用mousedown运行。所以我们来一个li.cansort可排序的项目。这将生成一个类似于以下内容的jQuery选择器:

$("li.cansort").closest(":not(.cansort)").length;

这将总是返回1的长度,因为所有可排序的ul的父li都没有.cansort类。这意味着使用这种选择器,排序总是被取消。

幸运的是,如果您只在cancel选择器中添加标记名称,这很容易解决:

cancel: "li:not(.cansort)"

以下是一个示例: http://jsfiddle.net/7hSnc/(尝试从li选择器中移除cancel