有没有办法为 createElement 对象分配唯一的 ID?

Posted

技术标签:

【中文标题】有没有办法为 createElement 对象分配唯一的 ID?【英文标题】:Is there a way to assign unique IDs to createElement objects? 【发布时间】:2014-12-04 09:56:52 【问题描述】:

按下时我有一个按钮会创建新的输入栏,我希望这些输入栏具有唯一的 ID,例如 - textBar1、textBar2、textBar3 等。

我尝试在函数外部创建一个值为 0 的变量,然后在函数内部为函数每次运行时添加 +1 的值,但这不起作用,而是将 id textBar0 分配给每个元素已创建。

有人对如何解决这个问题有任何建议吗?

提前致谢!

HTML

<label for='ingredient'></label>
<input id="textBar" class="textBar" type="name" name="ingredient">

<div id="textBarPosition"></div>
<div id="addRemoveContainer">

<input id="addBar" type="button" value="Add Ingredient">

JavaScript/jQuery

   var counter = 0;
function createSector() 
  var input = document.createElement('input'); 
  input.setAttribute("id", 'textBar' + counter +1);
  input.type = 'text';
  input.name = 'name[]';
  return input;
counter = 1;




var form = document.getElementById('textBarPosition');
document.getElementById('addBar').addEventListener('click', function(e) 
    // step 1: create element and set opacity to 0.
    var selector = $(createSector());
    selector.fadeIn();

   // step 2: append it to its parent.
    $(form).append(selector);

    $('#removeBar').click(function()
        $("input:last-child").remove(".textBar");
    );
);

【问题讨论】:

【参考方案1】:

这是因为您没有将更改后的值重新评估为 counter。 请改用counter+=1 或仅使用counter++

input.setAttribute("id", 'textBar' + counter++); // now it should work

您之前所做的总是将1 添加到0

【讨论】:

哦,对了,这很有道理。感谢您的帮助! @Macksen 很高兴它有帮助 ;)【参考方案2】:

最好的方法是使用_.uniqueId。

为需要的客户端模型或 DOM 元素生成一个全局唯一的 id。如果传递了前缀,则将 id 附加到它。

_.uniqueId('contact_');
=> 'contact_104'

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。 好,我再举个例子。【参考方案3】:

你可以像这样使用Math.random

input.setAttribute("id", 'textBar_' + Math.random().toString(36));

据我了解,当您第一次调用 Math.random 时,它会使用当前时间(以毫秒为单位)作为种子生成 0 到 1 之间的唯一随机数序列,然后返回第一个。随后的调用将遍历生成的数字序列,一次返回一个,让您能够为元素 ID 生成随机的唯一字符串。

【讨论】:

【参考方案4】:

jQuery 代码 -

  var counter = 0;
function createSector() 
  var input = document.createElement('input'); 
  input.setAttribute("id", 'textBar' + counter);
  input.type = 'text';
  input.name = 'name[]';
  return input;




var form = document.getElementById('textBarPosition');
document.getElementById('addBar').addEventListener('click', function(e) 
    // step 1: create element and set opacity to 0.
    var selector = $(createSector());
    counter++;
    selector.fadeIn();

   // step 2: append it to its parent.
    $(form).append(selector);

    $('#removeBar').click(function()
        $("input:last-child").remove(".textBar");
    );
);

工作 JSFiddle - http://jsfiddle.net/Ashish_developer/mtafre04/

【讨论】:

这会将值'textBar0'分配给第一个动态创建的输入框的id,所以把它放在var选择器下面。第一次单击“添加成分”时,它采用计数器值 0 并将 id 'textBar0' 分配给第一个输入框,然后每次单击按钮时将该值增加 1(因此第二个输入框获取 id 'textBar1',第三个 - 'textBar2' 等等)。如果您将 counter++ 放在 var 选择器上方,它将开始从 'textBar1' 为输入框分配值(第一个输入框将获得 id 'textBar1',第二个 -'textBar2',第三个 -'textBar3' 等等)。

以上是关于有没有办法为 createElement 对象分配唯一的 ID?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法释放分配给 Symfony2 表单对象的内存?

有没有办法在 Swift 中一次将委托分配给同一类的多个对象?

有没有办法绕过批量分配保护?

对象指针

如何找出分配给 javascript 对象的内存量? [复制]

有没有办法请求特定于存储桶的读取范围?