2012-05-11 141 views
0

我試圖用for..in循環來選擇一個變量內的對象,並且它不顯示必要的Li對象。使用for..in循環一個對象

var mUlLi = $(mUl).find('>li');  //select all li's in main Ul 
var listLength = $(mUlLi).length; 
if(listLength >0){ 
    /*for(i=0;i <listLength; i++) { 
     console.log(mUlLi[i]); // works fine show the li objects 
    }*/ 
    for(var obj in mUlLi) { 
     console.log(obj); // show's diff objects 
    } 
} 

我該如何解決這個問題?

+0

的DOM中jQuery對象對象不能夠與'爲/ in'被迭代了jQuery對象的屬性。 – jfriend00

+0

呃,總是很高興看到一個被接受的答案,不僅僅是稍後發佈,而且也沒有包含OP在大多數時間想要的答案。順便說一句,@ user1184100,你應該改變你的暱稱。 – ThiefMaster

回答

5

jQuery有一個each()做同樣的事情。

$(mUl).find('>li').each(function(){ //for each of the elements found 
    console.log(this);    //in here, "this" is the DOM element <li> 
}); 

如果一個jQuery對象上使用的for in,你也可以通過jQuery的方法和屬性循環。

但是,如果你真的想這樣做你從jQuery的獲得元素的for循環(因爲你不想使用each()),然後執行它直接:

var nodes = $(mUl).find('>li'), 
    nodesLength = nodes.length, 
    i, node; 

for(i=0,i<nodesLength;i++){ 
    node = nodes[i]; 
} 
+1

不需要首先提取數組 - jQuery對象也支持'[]'。 – ThiefMaster

2

你可以通過適當的方式來修復這個問題 - for(.. in ..)不是意味着迭代數組元素/索引,但對於對象屬性 - 這不是你想要的。

通過.each()只需使用jQuery的方式

mUlLi.each(function() { 
    console.log(this); 
}); 

如果您不想在此出於某種原因(!也許不是一個合理的理由),你也可以使用一個很好的老for循環:

for(var i = 0; i < listLength; i++) { 
    var elem = mUlLi[i]; 
    console.log(elem); 
} 
+0

感謝所有的回覆,但我不想使用每個() – user1184100

+1

爲什麼不呢?這是去這裏的路。但請參閱我的答案中的第二個代碼塊。 – ThiefMaster

+0

each()比..in慢,我有50個diff元素 – user1184100

2

mUlLi(問題變量名稱)不是一個常規對象,是一個jQuery集合。你可以迭代each()

mUlLi.each(function(){ 
    // `$(this)` is the current jQuery element 
})