2012-12-23 104 views
2

我在jQuery的初学者和这里的孩子就是我想要做的事:数组元素

  • 找到所有元素(姑且称之为盒子后,以避免混淆),带班“选择”和为每个分配一个数字。
  • 在每个框中,找到它们中的所有输入元素。
  • 给每个输入元素的名称添加它的框号。例如,如果在第三个框中有一个名为“login”的文本输入元素,则应将其重命名为“login3”。

这是我迄今所取得的代码:

boxes = $('.chosen'); 
for(a = 0; a < boxes.length; a++) { 
    inputsinboxes = boxes[a].children('input'); 
    for(b = 0; b < inputsinboxes.length; b++) {   
     inputsinboxes[b].name = inputsinboxes[b].name + (a+1); 
    } 
} 

我坚持,虽然,因为它不断告诉我boxes[a].children不是一个函数。

我在做什么错?

回答

3

当您使用数组索引表示法(括号)从jQuery对象访问元素时,不会返回jQuery对象。你得到底层的DOM节点。 http://api.jquery.com/get/

开始通过使用.each()使这个更惯用的jQuery:

$('.chosen').each(function (i) { 
    $(this).children('input').prop('name', function() { 
     return this.name + (i+1); 
    }); 
}); 
+0

我不知道,你可以将一个匿名函数与'道具的值()'... – Lix

+1

@Lix它是证据充分的,并没有任何专门做_anonymous_功能。一个有名的人也可以工作。 http://api.jquery.com/prop/ –

+0

“阅读精美图片!” :P – Lix

1

boxes[a]DOMElement,而不是一个jQuery对象;所以你不能使用它的jQuery children()方法。

相反,你必须首先把它包在一个jQuery对象:

boxes = $('.chosen'); 
for(a = 0; a < boxes.length; a++) { 
    inputsinboxes = $(boxes[a]).children('input'); 
    for(b = 0; b < inputsinboxes.length; b++) {   
     inputsinboxes[b].name = inputsinboxes[b].name + (a+1); 
    } 
} 

  1. 还要注意的是,你应该用var声明变量,以阻止他们正在取得隐含全局;

    var boxes = $('.chosen'); 
    
  2. 考虑jQuery的使用更为普遍each()函数而不是for循环。再加上使用prop() as a setter并提供一个功能,可以缩短你的代码只是:

    $('.chosen').each(function (i) { 
        $(this).children('input').prop('name', function (j, curr) { 
         return curr + (i+1); 
        }); 
    }); 
    
3

你混合如何运作的jQuery JavaScript的原始直觉。试试这个关于大小

$('.chosen').each(function(index) { 
    $('input', this).each(function() { 
     $(this).attr('name', $(this).attr('name') + (index + 1)); 
    }); 
}); 
+3

为什么在使用'.each()'时免费得到一个'a'索引? –

+1

@MattBall谢谢!我从来没有深入了解每一个关于它的参数,你只是让我的未来“每一个”努力,更甜美:) – Bryan

+0

谢谢!这是完美的。只是一个小小的改正,a应在整个盒子完成后递增,因此: 'var a = 1; $('。chosen')。每个(function(){('input',this).each(function(){0} {0} {0} {0}()'(this).attr('name',$(this).attr('name')+( a)条); \t}); \t A ++; });' –