【问题标题】:How to add incremental number to ID when cloned克隆时如何将增量编号添加到 ID
【发布时间】:2015-03-17 21:38:21
【问题描述】:

我有一个表单域,当我点击“添加”按钮时,我正在复制它。当一个 ID 重复时,我想给它添加一个递增的数字。我下面的代码是在每个新 ID 的末尾附加一个 0 而不是计数。所以#mark-description 变成了mark-description00 而不是#mark-description2。我在这里查看了其他一些类似的帖子,但无法确定我做错了什么。任何想法将不胜感激。

注意:我使用 ids 是因为我使用的 jQuery 插件需要它们。

Javascript:

$('#add-character-button').on('click', function () {
var source = $('.mark:last'),
clone = source.clone();
var count = 0;

clone.find('.copyme').val($(this).attr('title')).attr('id', function(i, val) {
return val + count;
    });
     clone.insertAfter('.mark:last');
    });

HTML:

<div>
  <input class="checkbox" id="standard" name="mark-type" type="checkbox" value="Standard Character">
  <label class="no-placeholder" for="standard-character"></label>
  <div class="standard-mark-container">
    <div class="mark" id="mark-details">
      <div class="mark-name">
        <label class="placeholder" for="mark-name"><span>text</span></label>
          <input class="copyme" id="mark-name" name="mark-name" placeholder="" title="Enter your mark name" type="text">
      </div>
      <div class="description">
        <label class="placeholder" for="mark-description"><span>text</span
        </label>
        <textarea class="copyme" id="mark-description" name="mark-description" placeholder="" title="Enter a description"></textarea>
      </div>
      <div class="remove"> <a class="remove-mark-button" href="#" id="remove-character-button"><span>Remove</span></a>
      </div>
    </div>
   </div>
 <div class="add-mark"><a class="add-mark-button" href="#" id="add-character-button"><span>+ Add</span></a></div>  
</div>

【问题讨论】:

  • 为什么需要更改 ID?为什么对于您要专门克隆的 DOM 元素,您甚至想为其附加一个 id?您最大的问题实际上是输入字段的名称属性。这些需要更改(或使用mark-description[] 之类的数组访问符号,否则您的表单将无法正常工作。当您第一次以您尝试的方式使用 javascript/jQuery 时,您正在使用人们的一些反模式做经常落入。
  • 这是fiddle,我认为它应该可以工作。
  • 嗯,你所有的身份证都需要改变。
  • 您的代码的问题在于您的var count= 0 行在点击事件中。每次,您都将 count 重置为 0 并将其附加到 id 上。

标签: javascript jquery forms clone


【解决方案1】:

您甚至不应该在您正在克隆的项目上使用 id。你应该在你的字段名中使用数组访问符号(即mark-name[])。没有这个,你只会得到一个同名的重复字段。

这是我的建议。

HTML:

<div>
  <input class="checkbox" id="standard" name="mark-type" type="checkbox" value="Standard Character">
  <label class="no-placeholder" for="standard-character"></label>
  <div class="standard-mark-container">
    <div class="mark">
      <div class="mark-name">
        <label class="placeholder"><span>text</span>
          <input class="copyme" name="mark-name[]" placeholder="" title="Enter your mark name" type="text">
        </label>
      </div>
      <div class="description">
        <label class="placeholder"><span>text</span>
          <textarea class="copyme" name="mark-description[]" placeholder="" title="Enter a description"></textarea>
        </label>
      </div>
      <div class="remove"><a class="remove-mark-button" href="#"><span>Remove</span></a>
      </div>
    </div>
   </div>
 <div class="add-mark"><a class="add-mark-button" href="#" id="add-character-button"><span>+ Add</span></a></div>  
</div>

javascript:

$('#add-character-button').on('click', function() {
    // make clone
    $template = $('.mark:last');
    var $clone  = $template.clone();
    // set values to default in clone
    $clone.find('.copyme').each(function() {
        $(this).val($(this).attr('title'));
    });
    // insert into DOM
    $clone.insertAfter($template);
});

$('.remove').on('click'), function() {
    $(this).closest('.mark').remove();
});

这完全消除了修改 id 名称的需要并简化了您的代码。

【讨论】:

  • 这是一个很好的答案,但这是我的改进建议。由于 for 属性必须包含 id,我将使用标签元素包装输入并删除 for 属性。此外,克隆时将标题复制到字段值对我来说没有意义。为什么不直接重置为“”?
  • @Phil_1984_ 我只是按照原始代码示例中关于设置默认值的当前行为。标签上的好想法。我会改变的。
  • @Mike Brant 感谢您的帮助。我使用 ids 是因为我使用的插件(In-Field Labels jQuery Plugin)需要它们才能正常工作。
  • 在查看该插件的代码时,您似乎可以轻松更改将标签绑定到 $.fn.inFieldLabels 函数中的输入的方式,以查找嵌套输入,而不是使用标签中的for 属性。
  • @Mike Brant 我没有想到这一点。您的意思是简单地使用嵌套输入名称,而不是将 id 绑定到 for 值?
【解决方案2】:

这就是你要找的吗?我简化了代码,所以我不必输入所有的 id 和 fors 之类的东西。 http://jsfiddle.net/swm53ran/134/

$(document).ready(function() {
    var count = 0;
    $('.add').on('click', function() {
        count++;
        var clone = $('.template').clone('true').removeClass('template');
        clone.find('textarea').attr('id', 'textarea' + count);
        clone.find('textarea').html('Id: ' + clone.find('textarea').attr('id'));
        clone.appendTo('.sections');
    });
});

<a href="#" class="add">Add</a>
<div class="sections">
    <div class="template section">
        <input type="checkbox" /><br/>
        text <input type="text"/><br/>
        textarea <textarea id="textarea">Id: textarea</textarea>        
    </div>
</div>

虽然,我建议不要使用 id,但如果您打算使用它们,这应该可以满足您的目的。

【讨论】:

  • 你应该把你的完整代码放在你的答案中。有一个小提琴很好,但随着时间的推移可能会消失,让这个答案不完整。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 1970-01-01
  • 2011-12-22
  • 2013-11-03
  • 1970-01-01
相关资源
最近更新 更多