2009-12-09 32 views
1

我在jQuery中用attr('class')和hasClass()得到了一些令人困惑的結果。基本上,我正在遍歷錶行並計算出下一個可見的錶行是否具有某個類。attr('class')和hasClass()給出了衝突的結果

$('table#blocks tr.region').each(function() { 
    var next_row = $(this).nextAll('tr:visible'); 

    console.log('This: ' + $(this).attr('class') + ' Next: ' + next_row.attr('class') + ' Next is a region: ' + next_row.hasClass('region')); 

}); 

當我運行此腳本,日誌顯示:

此:區域區域左下一頁:區域區域旁邊是一個區域:真

此:區域區域 - 右下一個:區域region-content下一個區域:true

這個:區域region-content下一個:draggable即使shown_on_home shown_on_infozone下一個區域是:

此:區域區域報頭下一頁:區域消息區域報頭的消息區域空接下來是一個區域:

此:區域區域尺下一頁:區域-message區域尺消息區域空接下來是一個區域:

此:區域區域 - 1下:未定義接下來是一個區域:假

所以這個消息清楚地表明一些行有class'region',有些沒有,但是它們都返回true for hasClass()!

任何人都可以對此有所瞭解嗎?

謝謝:)

+0

在這個瑪麗亞的任何進展?你爲什麼不就所給答案提供反饋?我的答案不適合你嗎? – jitter 2009-12-13 00:00:06

回答

0

我找到了答案!當我console.log'd的結果:

var next_row = $(this).nextAll('tr:visible'); 

它指出next_row是[對象物體],當它實際上是對象的數組。我使用調試器發現了這一點。所以我只需要改變線:

var next_row = $(this).nextAll('tr:visible:first'); 

現在它的工作。

謝謝:)

+0

爲什麼你使用'nextAll()'?如果你只想要第一行,你應該使用'next()',就像其他答案一樣。 – Stobor 2009-12-09 12:15:27

1

錯誤您使用nextAll()其中「查找當前元素畢竟同級元素」的由來部分。因此,您總是選擇跟隨當前行的所有可見行。

attr()hasClass()返回的值之間的差異可以,如果你重讀有關它們的文檔來解釋

ATTR(名稱)

訪問 第一個匹配元素上的屬性。

hasClass(類)如果指定的類是 存在於該組的 匹配的元素中的至少一個

返回true。

這解釋了一切。您使用nextAll選擇多個兄弟,attr只顯示匹配的第一個元素的class屬性,而hasClass如果匹配的所有元素中的一個具有該類,則返回true。

我的建議是使用var next_row = $(this).next('tr:visible');。這隻會給你下一個可見的兄弟行。

0

你們第一個應該永遠不要在迭代器中聲明「var」。總是在外面宣佈。

您的.hasClass('region')將始終返回true,因爲您的next_row會返回所有tr元素。改爲使用.next('tr:visible')。

您使用.attr()獲得不同類的原因是它返回了選擇器的第一個元素。

..fredrik