2

我正在处理一个页面,该页面需要从 DOM 中添加、删除和排序常量 HTML 元素。我有一个隐藏的 DIV,其中包含我使用 clone() 的所有代码块,并将其附加到 DOM。sortable() 适用于 DOM 中已经存在的列表项,但不适用于 DOM 加载完成后注入的 DOM 列表项。我有以下列表,出于示例目的进行了简化:

<ul class="sprite-list">
    <li>
        <a href="#">
            <img src="icon.png">
        </a>
    </li>
    <li>
        <a href="#">
            <img src="icon.png">
        </a>
    </li>
    <li class="sprite-add">
        <a href="#">Add</a>
    </li>
</ul>

我使用以下 jQuery 代码:

$('ul.sprite-list').sortable({
    items: 'li:not(.sprite-add)',
    containment: 'parent',
    opacity: 0.7
}).disableSelection();

将该列表硬编码在页面中,效果很好。但是在我将同一个列表克隆到 DOM 之后,我似乎无法拖放它们。

我已经阅读并看到了 sortable() 的工作示例。我还看到人们推荐使用.sortable('refresh')。所以我尝试了

$('ul.sprite-list').sortable('refresh');

或者

$.fn.sortable('refresh');

但都没有成功。我在这里想念什么?

编辑:我注意到在注入克隆代码后,列表确实具有所有可排序列表都获得的类ui-sortable

编辑 2:我不知道它是否相关,但我使用单独的函数来获取克隆的元素:

function cloneElement(element){
    var container = $('#sprite-clone');

    if(element == 'generationContainer'){
        return container.find('.sprite-generation-container').clone(true);
    }
    else if(element == 'groupContainer'){
        return container.find('.sprite-group-container').clone(true);
    }
    else if(element == 'sprite'){
        return container.find('>li:first').clone(true);
    }
    else if(element == 'customForm'){
        return container.find('.customForm').clone(true);
    }
}

然后在需要时使用 var generationContainer = cloneElement('generationContainer'); 我不确定这是否会影响任何事情。

4

1 回答 1

1

好吧,工作示例代码不会克隆,而是添加新内容,所以它是另一回事。

由于我看不到其余的代码,所以我只是在理论上。可以通过调用 sortable 来完成修复。因此,如果您将可排序代码放在函数中,请在文档准备好时调用它,然后在添加元素时再次调用。

示例:http: //jsfiddle.net/BWkFp/

HTML

<ul class="sprite-list">
    <li>
        test 1
    </li>
    <li>
        test 2
    </li>
    <li>
        test 3
    </li>
    <li class="sprite-add">
        <a href="#">Add</a>
    </li>
</ul>

JS

MakeUlSortable = function () {
    $('ul.sprite-list').sortable({
        items: 'li:not(.sprite-add)',
        opacity: 0.7
    }).disableSelection();
};

$(document).ready(function () {
    MakeUlSortable();
});

$('.sprite-add a').click(function () {
    $(this).before($('.sprite-list li:first-child').clone());
    MakeUlSortable();
    return false;
});

希望你明白我的意思。这段代码对我很有效:)

于 2012-08-13T20:41:40.310 回答