jQuery UI可对动态添加的项进行排序

时间:2015-02-26 14:29:20

标签: javascript jquery html css jquery-ui

我有HTML标记,通过点击添加行按钮,然后在其之前克隆并插入一个视觉上隐藏的HTML元素,该元素是添加新按钮的兄弟。

<div class='wrapper'>
<div class="container">
    <div class="sortable">
        <div class="ui-state-default">
            <div class="container">
                <div class="sortable">
                    <div class="ui-state-default">Item 1</div>
                    <div class="ui-state-default">Item 2</div>
                    <div class="ui-state-default hidden">Hidden</div> <a href="#" class="add-button"> Add New Sub </a>

                </div>
            </div>
        </div>
        <div class="ui-state-default hidden">
            <div class="container">
                <div class="sortable">
                    <div class="ui-state-default">Item 1</div>
                    <div class="ui-state-default">Item 2</div>
                    <div class="ui-state-default hidden">Hidden</div> <a href="#" class="add-button"> Add New Sub </a>

                </div>
            </div>
        </div> <a href="#" class="add-button"> Add New </a>

    </div>
</div>

这是JS代码:

function sortableInit(container) {
container.find('.sortable').sortable({
    axis: 'y',
    cursor: 'move',
    items: '> .ui-state-default',
});
}
$(function () {
$(".container").each(function () {
    sortableInit($(this));
});
$('.wrapper').on('click', '.add-button', function (e) {
    e.preventDefault();
    e.stopPropagation();
    var hidden = $(e.target).siblings('.hidden').clone(true).removeClass('hidden');
    hidden.insertBefore($(e.target));
});
});

这是jsfiddle link,让我更加了解我想要做的事情。

当您运行jsfiddle时,单击Add New按钮,对于新添加的元素,尝试对元素Item 1和Item 2进行排序。虽然它们可以被拖动,但无法排序。

注意: div.ui-state-default元素可以包含任何深度级别的div.container元素(嵌套的可重复字段组)。

1 个答案:

答案 0 :(得分:2)

你使它变得比它需要的更复杂。而不是尝试进行深度克隆(.clone(true)),只需在克隆项目上调用sortableInit()

JSFiddle Example

$('.wrapper').on('click', '.add-button', function (e) {
    e.preventDefault();
    e.stopPropagation();
    var hidden = $(e.target).siblings('.hidden').clone().removeClass('hidden'); //Removed 'true' from clone
    hidden.insertBefore($(e.target));
    sortableInit(hidden); //This added.
});