2010-12-12 53 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