jquery - 动态启用/禁用 jquery 可排序项目

标签 jquery jquery-ui jquery-ui-sortable

我的表格行可以根据是否选中某些单选按钮进行排序。可排序在 document.ready 上初始化,如下所示:

$(document).ready(function() {
    // Return a helper with preserved width of cells
    // handy code I got from http://lanitdev.wordpress.com/2009/07/23/make-table-rows-sortable-using-jquery-ui-sortable/
    var fixHelper = function(e, ui) {
        ui.children().each(function() {
            $(this).width($(this).width());
        });
        return ui;
    };
    // #opts = table id; tr.ui-state-disabled class = rows not sortable
    $("#opts tbody").sortable({
        items: 'tr:not(.ui-state-disabled)',
        cursor: 'crosshair',
        helper: fixHelper
    }).disableSelection();
});

我将以下函数附加到单选按钮(ID 前缀为“active_”)onchange,它可以从表中添加或删除 ui-state-disabled 类属性行(动态 ID 前缀为“opt_”):

    var toggleDrag = function(i){
    if ($('#active_'+i+'-0').is(':checked')) {
        $('#opt_'+i).addClass('ui-state-disabled');
    }
    if ($('#active_'+i+'-1').is(':checked')) {
        $('#opt_'+i).removeClass();
    }
    $("#opts tbody").sortable("option", "items", "tr:not(.ui-state-disabled)");
    //$("#opts tbody").sortable("refresh");
    //alert($('#opt_'+i).attr('class')); - alert indicates that the class attribute is being changed
    //$("#opts tbody").sortable("option", "cursor", "auto"); - this works!
}

如果我选择一个单选按钮来使先前不可排序的行变得可排序,它就会起作用,并且我可以拖放该行。问题是,如果我选择一个单选按钮来创建以前可排序、不可排序的行,我仍然可以拖放它。如果先前可排序, setter .sortable("option", "items", "tr:​​not..etc") 不会出现“取消注册”行。我也尝试过 .sortable("refresh") 但没有运气。我已经检查过类属性是否正在通过警报进行更改,确实如此。

任何有关此问题的帮助将不胜感激。

最佳答案

我遇到了同样的问题,items 选项似乎没有删除之前启用的项目。

但是,取消选项可以。请注意,禁用的项目将四处移动,为可排序的项目腾出空间(该位置仍可用作放置目标),但拖动禁用的项目本身将不起作用。使用 disabled 类还可以根据项目是否可排序轻松更改样式(请参阅 jsfiddle )。

这里的代码部分基于 Bah Bah the Lamb 的答案,但已被大大整理和简化。

HTML:

<ul id="sorted-list">
   <li>
       <p><input type="checkbox" checked="true" /> Item 1</p>
    </li>
   <li>
       <p class="disabled"><input type="checkbox" /> Item 2</p>
   </li>
   <li>
       <p><input type="checkbox" checked="true" /> Item 3</p>
   </li>
</ul>

jQuery:

$("#sorted-list").sortable({
    cancel:".disabled"
});

// add or remove the 'disabled' class based on the value of the checkbox
$("#sorted-list input").click(function() {
    if (this.checked) {
        $(this.parentElement).removeClass("disabled");
    } else { 
        $(this.parentElement).addClass("disabled");
    }
});

CSS:

li {
  border: 1px solid #aaa;
  background-color: #eee;
  color:#555;
  padding: 5px;
}

.disabled {
  color:#ddd;
}

关于jquery - 动态启用/禁用 jquery 可排序项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4360904/

相关文章:

jquery - 自定义 jQuery-UI Accordion

javascript - 使用 jquery 可排序和 css 变换/过渡

javascript - updatepanel (JavaScript) 回发后,jQuery 可排序不起作用

javascript - 使用 jQuery ui sortable 将项目排序到固定容器中

jquery - 更改谷歌翻译悬停颜色

jquery - 首先设置一个事件链接css并动态更改它

javascript - JQuery 日期选择器年份范围

javascript - jQuery 日期选择器随 maxDate 范围变化

Javascript:点击缩略图切换大图。最好的方法?

javascript - 如何为多种 Accordion 样式缩短我的 JQuery 脚本?