2010-12-12 69 views
2

我有下面的代码放置多次在页面上一些在一张桌子和一些工具提示:jQuery的 - 遍历标签/输入对,并添加唯一的ID

<p class="radioBtn"> 
    <label for="business"></label> 
    <input id="business" type="radio" name="radioBtn" value="" /> 
</p> 
<p class="radioBtn">  
    <label for="private"></label> 
    <input id="private" type="radio" name="radioBtn" value="" /> 
</p> 

我想知道怎么回事,使用jQuery,我可以遍历整个页面,并在标签'for'属性的末尾添加一个唯一的ID号码,并输入'id',这样我就可以得到如下每个配对唯一的内容:

<p class="radioBtn"> 
    <label for="business0"></label> 
    <input id="business0" type="radio" name="radioBtn" value="" /> 
</p> 
<p class="radioBtn">  
    <label for="private0"></label> 
    <input id="private0" type="radio" name="radioBtn" value="" /> 
</p> 

非常感谢提前。

+0

'input'和'label'元素之间的比例是否为1:1? – 2010-12-12 15:38:38

+0

@大卫是的。最后,这些配对将从数据库中添加,因此在任何给定的时间内最多可以配对100个配对。 'for'和'id'必须匹配,因为我使用JS来改变其外观。 – mtwallet 2010-12-12 15:44:23

回答

3

晚的答案,但使用jQuery,我可能会做更多这样的:

$("input:radio[name=radioBtn]").attr('id',function(index,id){ 
    $(this).prev()[0].htmlFor += index; 
    return id += index; 
}); 

更少的代码,并可能更好的性能。

要解释,.attr()可以接受您设置的值的函数。它的返回值将是属性的新值。

在该函数中,第一个参数是迭代中当前项目的索引,第二个参数是正在设置的属性的当前值(在这种情况下为id)。

因此函数体是这样的:

  • $(this).prev()获取使用jQuery's .prev()上一个元素。
  • [0]从jQuery对象中取出DOM元素。 <label>
  • 将标签的htmlFor属性设置为当前索引的+=
  • 返回当前编号+=当前索引。
+0

感谢这个,一个很好的答案。我不完全明白理解第2点。用[0]拉出DOM元素。你能再解释一下吗? – mtwallet 2010-12-14 07:07:56

+0

@mtwallet:一个jQuery对象是DOM元素的集合,再加上一堆方法。您可以通过'[]'(方括号表示法)通过索引访问这些元素,就像使用数组一样。所以用'$(this)',你有一个包含'radio'的对象。使用'.prev()',对象包含'radio'前面的元素。用'[0]'从jQuery对象中检索该元素(在索引0处)。既然你有一个本地的DOM元素,你可以使用原生的'htmlFor'属性,你只需要执行'+ = index'而不必为了获得'for'而调用'.attr('for')'再次设置它。 – user113716 2010-12-14 13:39:40

+0

非常感谢您的回复,这非常有道理。我很感激帮助。 – mtwallet 2010-12-15 09:49:30

1

事情是这样的:

$('label').each(function(index) { 
    var forAttr = $(this).attr('for'); 
    $next = $(this).next(); 
    if($next.attr('id') == forAttr) { 
     $(this).attr('for', forAttr + index); 
     $next.attr('id', forAttr + index); 
    } 
}); 

虽然这将是更好地做到这一点在服务器端。

+0

感谢这工作得很好,我感谢帮助。 – mtwallet 2010-12-12 15:48:21

+0

我不知道你是否可以解释一下这里发生了什么,所以我可以从中了解一点。我明白你是如何遍历元素的,但函数的'索引'部分是什么? – mtwallet 2010-12-12 15:51:59

+0

@mtwallet,'index'只是我们当前循环的集合中元素的编号。第一个标签的索引为零,第二个标签的索引为1等。请查看手册:http://api.jquery.com/jQuery.each/ – 2010-12-12 15:57:05

1

尝试

$(function(){ 
    $("input:radio[name='radioBtn']").each(function(index){ 
     var currElem = $(this); 
     var prevLabel = currElem.prev(); 
     currElem.attr("id", this.id + index); 

     prevLabel.attr("for", prevLabel.attr("for") + index); 
    });  
}); 

看到一个working demo

+0

非常感谢,这很好。你能解释一下函数的'索引'部分在做什么吗? – mtwallet 2010-12-12 15:54:45

+0

'index'将得到''的当前迭代索引。每个()'函数 – rahul 2010-12-12 15:56:04