问题描述
我有一个 HTML 元素,其中包含大量无序列表。我需要将此元素克隆到页面上的其他位置,添加不同的样式 (这使用 jQuery 足够简单) 。
$("#MainConfig").clone(false).appendTo($("#smallConfig"));
然而,问题是所有的列表及其关联的列表项都有 ID,clone
重复它们。有没有办法在追加之前用 jQuery 替换所有这些重复的 ID?
最佳解决方案
如果您需要一种在克隆这些列表项后引用列表项的方法,则必须使用类而不是 ID 。将所有 id = “…” 更改为 class = “…”
如果您正在处理遗留代码或某些东西,并且无法将 ID 更改为类,则必须先删除 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 的评论。
第四种方案
我使用这样的东西:$(“#details”).clone() 。 attr(‘id’,’details_clone’).after(“h1”).show();
第五种方案
这是基于罗素的答案,但更多的审美和功能的形式。 jQuery 的:
$(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>
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。