问题描述

我有一个 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛