【问题标题】:jQuery clone duplicate IDsjQuery克隆重复ID
【发布时间】:2010-09-29 18:53:41
【问题描述】:

我有一个 HTML 元素,其中包含大量无序列表。我需要克隆这个元素以放置在页面上的其他位置,并添加不同的样式(这很简单,使用 jQuery)。

$("#MainConfig").clone(false).appendTo($("#smallConfig"));

然而,问题在于所有列表及其关联的列表项都有 ID,clone 复制了它们。有没有一种简单的方法可以在追加之前使用 jQuery 替换所有这些重复的 ID?

【问题讨论】:

    标签: javascript jquery html


    【解决方案1】:
    $("#MainConfig")
        .clone(false)
        .find("ul,li")
        .removeAttr("id")
        .appendTo($("#smallConfig"));
    

    试穿尺寸。 :)

    [编辑] 修复 redsquare 的评论。

    【讨论】:

    • 我会在运行 append 之前删除 id,否则你在 dom 中复制 id 仍然会产生不良影响
    • 我认为这基本上就是 Salty 在他的例子中所做的。我会试一试,但我宁愿为所有子级使用全局查找,以防标记更改和父级中的其他元素被欺骗
    • 没问题。谢谢你发现我的错误=]
    • 谢谢,这对我很有用,我可以接受$('#itemBase').clone(true).removeAttr('id').attr('id','item'+nextItemId++).removeClass('hidden').addClass('item').insertAfter($('#itemBase'));
    【解决方案2】:

    如果您将在一个页面上有多个相似的项目,最好使用类,而不是 id。这样您就可以将样式应用于不同容器 id 内的 uls。

    【讨论】:

      【解决方案3】:

      如果您需要在克隆列表项后引用它们,则必须使用类,而不是 ID。将所有 id="..." 更改为 class="..."

      如果您正在处理遗留代码或其他内容并且无法将 ID 更改为类,则必须在附加之前删除 id 属性。

      $("#MainConfig").clone(false).find("*").removeAttr("id").appendTo($("#smallConfig"));
      

      请注意,您无法再引用单个项目。

      【讨论】:

      • 能不能实现类似的东西但是替换ids?
      • 然后,您必须跟踪 id 是如何更改的(即前缀、后缀),并在引用克隆元素时使用字符串连接来重建正确的 id。恼人的。只需使用类。
      • 克隆并更改 id:“stackoverflow.com/questions/10126395/…
      【解决方案4】:

      我使用这样的东西: $("#details").clone().attr('id','details_clone').after("h1").show();

      【讨论】:

      • 哦,那更短了:var i=$('#itemBase'); i.clone(true).attr('id','item'+nextItemId++) .removeClass('hidden').addClass('item').insertAfter(i);
      【解决方案5】:

      由于 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>
      

      【讨论】:

        【解决方案6】:

        这是基于 Russell 的回答,但对形式来说更具美感和功能性。 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>
        

        【讨论】:

          【解决方案7】:

          FWIW,我使用了 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;
          }
          

          【讨论】:

            【解决方案8】:

            我相信这是最好的方法

            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.
            

            【讨论】:

              【解决方案9】:

              这是一个带有 id 的解决方案。

              var clone = $("#MainConfig").clone();
              clone.find('[id]').each(function () { this.id = 'new_'+this.id });
              $('#smallConfig').append(clone);
              

              如果你想动态设置 id,你可以使用 counter 而不是 'new_'。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-07-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-03-04
                相关资源
                最近更新 更多