2010-11-15 49 views
0

需要與我敢肯定的是相當容易的jQueryjQuery的關聯數組

我有以下的重複標記(幾個列表項)

<li> 
<div class="answer"> 
<p><select class="dropdown"> 
..options.. 
</select></p> 
</div> 
<div class="commentBox"> 
..content.. 
</div> 
</li> 

根據所選選項的值一點點幫助當頁面加載時,「commentBox」將顯示/隱藏。

我曾嘗試以下的jQuery

var dd = $('.dropdown'); 
var com = $('.commentBox'); 


dd.each(dd, function(n, val){ 
if($(this).val() == 'whatever'){ 
    com[n].setStyle('display', 'none'); 
} 
}); 

我得到一個錯誤「b.apply不是一個函數」在我的頭上,它應該如何工作

所以 - 如果它是第一個選擇下拉列表,顯示/隱藏第一個「commentBox」div。如果是第二個下拉列表,則顯示/隱藏第二個「commentBox」div。等等。

我想我已經陷入了混亂的嘗試各種jQuery技術,所以我相信這裏有幾十種可能性。 謝謝

回答

1

你的問題是你傳遞一個額外的(第一個)參數到each
each靜態調用時僅將該集合作爲第一個參數。
換句話說:

$.each(dd, function() { ... }); 

dd.each(function() { ... }); 

注意,可以使你的代碼更清晰,通過改變它

$(this).closest('li').find('.commentBox').hide(); 
+0

@jitter:錯誤的;它不是。嘗試一下。寫'var a = $('a'); a.each(a,console.log)'在Firebug中。 – SLaks 2010-11-15 18:54:23

+0

哎呀,你是對的 – jitter 2010-11-15 18:57:21

0

calling .each() like that,你只給它一個參數,function

dd.each(function(n, val){ 
    if($(this).val() == 'whatever'){ 
     com[n].setStyle('display', 'none'); 
    } 
}); 

或者你也可以通過2個參數,如果你call jQuery.each like this

$.each(dd, function(n, val){ 
    if($(this).val() == 'whatever'){ 
     com[n].setStyle('display', 'none'); 
    } 
}); 

這第二個版本是用於遍歷任何類型的集合。

你們將兩者結合起來。


編輯:我想我最好解釋setStyle是在OP的代碼,而不是眼前的問題的直接原因。

我無法知道OP是否使用其他方法擴展DOM元素。因此,我只能假設這種方法的安置是正確的。

0

嘗試

var dd = $('.dropdown'), 
    com = $('.commentBox'); 

dd.each(function(n, ele) { 
    if($(ele).val() == 'one') { 
     com.eq(n).css('display', 'none'); 
    } 
}); 

使用.eq(n)代替[n]後者而我得到一個jQuery對象,你可以調用css()會產生DOM節點(正如你看到的我是從setStyle切換什麼是功能反正css())。


使用你結束了這個更好的可讀的代碼由Slakks建議增強

$('.dropdown').each(function(n, ele){ 
    var $ele = $(ele); 
    if ($ele.val() == "one") 
     $ele.closest('li').find('.commentBox').hide(); 
}); 
+0

嗨。最後兩個建議,從抖動,這兩個工作。 – user508605 2010-11-15 19:22:10

+0

感謝您的所有建議,真的很快回復!還有一些方便的提示在我那裏。 – user508605 2010-11-15 19:22:32

+0

你實際上應該接受SLaks的答案,因爲他提供了一個解釋爲什麼你的'.each()'調用是錯誤的,並提出了我剛剛在回答的第二部分中重用的很好的簡化 – jitter 2010-11-15 19:31:14