2010-10-05 35 views
1

我想根據html內容選擇列表中的元素。我希望能做到像$('li[html="something"]'),但當然HTML不是一個屬性。是否有一個等效的基於集合的操作?使用html()作爲jQuery的屬性

我當然可以使用$.each()迭代列表中的所有元素,但在我看來它會慢很多。

回答

1

你可以嘗試:包括()選擇

http://api.jquery.com/contains-selector/

$("li:contains('something')") 

精確匹配(從上面的鏈接):

$.expr[":"].contains = function(obj, index, meta, stack){ 
    return $.trim($(obj).html()) == meta[3]; 
} 

用法:

$("li:contains('john')") 

這隻會匹配<li>John</li>,而不是<li>A. John</li>,既不<li>John 6</li> ...只是<li>John</li>

+0

哈,扣.... :) – 2010-10-05 10:59:43

0
+0

這並不是非常適合,因爲這並不能保證唯一性,即對於'

  • 一些
  • 東西
'使用'$('li:contains(「some」)')'將被選中。 – Shagglez 2010-10-05 11:10:36

+0

查看我更新後的確切匹配擴展名的答案 – 2010-10-05 11:20:25

0

感謝您指出我在正確的方向,但正確的解決方案需要建立在,使用$ .extend。以下是我想出了:

$.extend($.expr[':'], { 
    'hasHtml': function(elem, i, attr) { 
     return ($(elem).html() == attr[3]); 
    } 
}); 
+0

這不適用於IE 6,因爲$(elem).html()返回「john」。你需要在我的答案中調用trim()函數,以便在所有情況下都能正常工作。不幸的是,很多人仍然使用IE 6 – 2010-10-05 11:41:11

+0

似乎在IE測試工作良好.... – Shagglez 2010-10-05 11:55:10

+0

不要指望。它與IE6獨立運行它不一樣。不幸的是,我在一家銀行工作。這本身並沒有錯,但大多數銀行的大多數工作站仍然是IE 6,他們的升級週期非常慢。如果沒有裝飾,它不適用於我們的任何機器。它不會有任何傷害,祝你好運。 – 2010-10-05 11:59:17