【发布时间】:2012-08-13 20:09:57
【问题描述】:
我正在处理一个需要从 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 之后,我似乎无法拖放它们。
我已经阅读并看到了 working examples 的 sortable() 实时工作。我还看到人们推荐使用.sortable('refresh')。所以我尝试了
$('ul.sprite-list').sortable('refresh');
或
$.fn.sortable('refresh');
但都没有成功。我在这里错过了什么?
edit:我注意到在注入克隆代码后,列表确实具有所有可排序列表都具有的类 ui-sortable。
edit 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'); 我不确定这是否会影响任何事情。
【问题讨论】:
-
$('ul.sprite-list').sortable('refresh');应该可以工作,只要您每次添加新内容时都调用它。你有什么错误或什么吗? -
当您克隆列表时,您是否也使用事件处理程序来克隆它?也就是说,您是否将
withDataAndEvents和deepWithDataAndEvents参数设置为true? api.jquery.com/clone -
@MrOBrian 没有收到任何错误。我确实每次添加新内容时都会调用它。
-
@Zhihao 我没有设置那两个,但现在我设置了。没有改变。他们仍然不工作。 :(