我有一个包含大量无序列表的HTML元素。我需要克隆这个元素并将其放置在页面的其他位置,并添加不同的样式(使用jQuery很简单)。
$("#MainConfig").clone(false).appendTo($("#smallConfig"));
然而问题在于所有列表及其相关的列表项都有ID,而clone
会复制它们。在使用jQuery进行附加之前,是否有一种简单的方法可以替换所有这些重复的ID?
我有一个包含大量无序列表的HTML元素。我需要克隆这个元素并将其放置在页面的其他位置,并添加不同的样式(使用jQuery很简单)。
$("#MainConfig").clone(false).appendTo($("#smallConfig"));
然而问题在于所有列表及其相关的列表项都有ID,而clone
会复制它们。在使用jQuery进行附加之前,是否有一种简单的方法可以替换所有这些重复的ID?
$("#MainConfig").clone(false).find("*").removeAttr("id").appendTo($("#smallConfig"));
只要注意,现在你没有办法再引用单个的项了。
由于OP要求在追加元素之前替换重复的id,也许以下方法可以解决问题。假设您想要在这样一个HTML块中克隆MainConfig_1:
<div id="smallConfig">
<div id="MainConfig_1">
<ul>
<li id="red_1">red</li>
<li id="blue_1">blue</li>
</ul>
</div>
</div>
以下是可能的代码示例,用于查找所有克隆块的子元素(和后代),并使用计数器修改它们的id:
var cur_num = 1; // Counter used previously.
//...
var cloned = $("#MainConfig_" + cur_num).clone(true, true).get(0);
++cur_num;
cloned.id = "MainConfig_" + cur_num; // Change the div itself.
$(cloned).find("*").each(function(index, element) { // And all inner elements.
if(element.id)
{
var matches = element.id.match(/(.+)_\d+/);
if(matches && matches.length >= 2) // Captures start at [1].
element.id = matches[1] + "_" + cur_num;
}
});
$(cloned).appendTo($("#smallConfig"));
要创建像这样的新HTML:
<div id="smallConfig">
<div id="MainConfig_1">
<ul>
<li id="red_1">red</li>
<li id="blue_1">blue</li>
</ul>
</div>
<div id="MainConfig_2">
<ul>
<li id="red_2">red</li>
<li id="blue_2">blue</li>
</ul>
</div>
</div>
$("#MainConfig")
.clone(false)
.find("ul,li")
.removeAttr("id")
.appendTo($("#smallConfig"));
试试这个。 :)
[编辑] 根据redsquare的评论进行了修正。
$('#itemBase').clone(true).removeAttr('id').attr('id','item'+nextItemId++).removeClass('hidden').addClass('item').insertAfter($('#itemBase'));
。 - dlamblinvar i=$('#itemBase'); i.clone(true).attr('id','item'+nextItemId++) .removeClass('hidden').addClass('item').insertAfter(i);
该代码意为:选择一个id为"itemBase"的元素,复制它并将新元素的id设为"item"+nextItemId,nextItemId是一个自增的变量。然后移除新元素中的 "hidden" 类,并添加 "item" 类。最后将新元素插入到原始元素之后。 - dlamblin$(document).ready(function(){
var cur_num = 1; // Counter
$('#btnClone').click(function(){
var whatToClone = $("#MainConfig");
var whereToPutIt = $("#smallConfig");
var cloned = whatToClone.clone(true, true).get(0);
++cur_num;
cloned.id = whatToClone.attr('id') + "_" + cur_num; // Change the div itself.
$(cloned).find("*").each(function(index, element) { // And all inner elements.
if(element.id)
{
var matches = element.id.match(/(.+)_\d+/);
if(matches && matches.length >= 2) // Captures start at [1].
element.id = matches[1] + "_" + cur_num;
}
if(element.name)
{
var matches = element.name.match(/(.+)_\d+/);
if(matches && matches.length >= 2) // Captures start at [1].
element.name = matches[1] + "_" + cur_num;
}
});
$(cloned).appendTo( whereToPutIt );
});
});
标记语言:
<div id="smallConfig">
<div id="MainConfig">
<ul>
<li id="red_1">red</li>
<li id="blue_1">blue</li>
</ul>
<input id="purple" type="text" value="I'm a text box" name="textboxIsaid_1" />
</div>
</div>
顺便提一下,我使用了Dario的函数,但还需要捕获表单标签。
添加另一个if语句以实现这个功能:
if(element.htmlFor){
var matches = element.htmlFor.match(/(.+)_\d+/);
if(matches && matches.length >= 2) // Captures start at [1].
element.htmlFor = matches[1] + "_" + cur_num;
}
我相信这是最好的方法
var $clone = $("#MainConfig").clone(false);
$clone.removeAttr('id'); // remove id="MainConfig"
$clone.find('[id]').removeAttr('id'); // remove all other id attributes
$clone.appendTo($("#smallConfig")); // add to DOM.
这里是一个带有ID的解决方案。
var clone = $("#MainConfig").clone();
clone.find('[id]').each(function () { this.id = 'new_'+this.id });
$('#smallConfig').append(clone);