2010-06-29 56 views
3

我试图在克隆元素时更改我的元素的ID,基本上我保留一个计数器,我每增加一次,并在每次克隆时将其添加到ID末尾。看起来很简单。无法更改我的元素的ID

var addAnswerFlag = true; 
function addAnswer(button) 
{ 
    //flag to keep clicks from chaining 
    if(addAnswerFlag) 
    { 
     addAnswerFlag = false; 
     $('#answer_warning').fadeOut(600); 
     $('.template').clone().attr('id','').insertAfter($('.template')).fadeIn(300, function() { 

      $(this).removeClass('template'); 
      addAnswerFlag = true; 

      $('.answer_li:not(.template)').each(function(index){ 
       ++index; 

       $(this).children('.answer').each(function(){ 
        $(this).attr('id', $(this).attr('id').replace("__", "_"+index+"_")).attr('name',$(this).attr('name').replace("__", "_"+index+"_"));   
       }); 

      }); 

     }); 

    } 
} 

对不起,如果我的代码有点不清楚。

基本上我的第一回路经过我的所有列表中的元素(除了模板与一个虚拟数据)时会为每个“答”和取代双下划线‘__’为‘’,其中i是一个计数器。

对于某些dang的原因,我总是1.我知道每个列表项的值增量,因为如果我在尝试重新分配id之前和之后提醒它的值,值就会上升,但在实际分配中它总是1.

这是我非常困惑的地方。任何帮助将不胜感激:)

编辑:

这是一些HTML。基本上我通过我的清单项目在这里循环和改变我的输入编号和名称,所以我可以处理它们一旦被提交:

<ul id="answers"> 
    <li style="" class="answer_li template"> 
     <input id="question__en" name="question_[en]" class="answer" value="" type="text"> 
     <input id="question__fr" name="question_[fr]" class="answer" value="" type="text">    
    </li> 
    <li id="" style="display: list-item;" class="answer_li"> 
     <input id="question_1_en" name="question_[en]" class="answer" value="" type="text"> 
     <input id="question_1_fr" name="question_[fr]" class="answer" value="" type="text">    
    </li> 
</ul> 

正如你可以看到第一个是我的模板,第二个该索引在下划线之间添加。但是,当我克隆模板时,它们都得到相同的索引。我真的不明白,因为如果我提醒它的值正确递增,我很困惑,我回到基本的JavaScript教程,看看我是否错过某种我偶然使用的操作符:)

我还发布了当我点击一个按钮(我作为参数传递)时被调用的整个javascript函数。

+0

在我看来,你的代码应该正常工作。 'i'变量可以被两个循环访问,并且在读取时应该在每个点保持适当的递增值。我用一个简单的HTML结构做了一个测试,并且它工作正常。你有什么机会可以在你的问题中展示你的HTML? – user113716 2010-06-29 21:34:32

+0

我发布了一些HTML并发布了我的整个JavaScript函数。 – Gazillion 2010-06-30 13:06:09

+0

好吧,我绕过了我的问题。我并不真的需要一个唯一的ID,所以我只是改变了name属性,所以某个语言的所有问题都被添加到一个数组中。感谢您的帮助:) – Gazillion 2010-06-30 15:09:01

回答

3

每个函数都会提供索引(从零开始),因此不需要保留一个单独的变量。请注意0​​对于每次迭代都是一个新值,所以你不需要推断闭包是否正确。

$('.answer_li:not(.template)').each(function(index){ 
    ++index; // to get one-based values 
    $(this).children('.answer').each(function(){ 
     $(this).attr('id', $(this).attr('id').replace("__", "_"+index+"_")).attr('name',$(this).attr('name').replace("__", "_"+index+"_"));   
    }); 
}); 
+0

这可能是我会如何做到的,实际上。只是想炫耀关闭。 – 2010-06-29 21:10:13

+0

tvanfosson - 这看起来像OP的代码应该工作。不是吗? – user113716 2010-06-29 21:25:02

+0

@帕特里克 - 我听到他说他不工作,但你说得对。适用于我的一个简单例子。尽管如此,使用提供的索引值是一个更好的解决方案。 – tvanfosson 2010-06-29 22:17:21