2012-01-03 41 views
2

我試圖在使用jQuery的表中搜索用戶代理字符串。如果我搜索這個樣子是不是發現:如何在jQuery中隱藏括號:contains selector?

jQuery("table.make-html-table 
td:contains('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')") 
.css("background","yellow"); 

如果我搜索這樣的 - 斜線之前\( - 那麼它給我一個錯誤:

jQuery("table.make-html-table 
td:contains('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')") 
.css("background","yellow"); 

錯誤:

"Syntax error, unrecognized expression: (comp... 

如何正確地逃避該字符串,以便可以使用jQuery搜索包含它的單元格?

回答

4

sizzle相關部分是

PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ 

這讓我覺得沒有辦法。看起來它只接受根本不包含括號的參數,或者只接受其中的一個級別,如:contains("(foo)")。一個明顯的改進就是接受任何事情,如果引用了一個論點,希望這個問題很快就會得到解決。

暫時,一個解決方法是編寫將接受逃脫參數的選擇,例如:

$.extend($.expr[':'], { 
    containsEscaped: function (el, index, m) { 
     var s = unescape(m[3]); 
     return $(el).text().indexOf(s) >= 0; 
    } 
});  

用法:

var p = $("p:containsEscaped('foo%28bar')"); 

在行動:http://jsfiddle.net/9wWP5/

+0

測試和運作良好。謝謝!注意他人 - 我使用php的'rawurlescape'函數來轉義我正在搜索的用戶代理字符串。 – cwd 2012-01-03 19:49:03

2

使用兩條斜線:

jQuery("table.make-html-table 
td:contains('Mozilla/4.0 \\(compatible; MSIE 6.0; Windows NT 5.1\\)')") 
.css("background","yellow"); 

替代解決方案:

jQuery("table.make-html-table td:contains('Mozilla/4.0'):contains('compatible; MSIE 6.0; Windows NT 5.1')").css('background-color','yellow'); 

使用textEquals另一種解決方案的定製選擇器

jQuery.expr[':'].textEquals = function(a, i, m) { 
    return jQuery(a).text() === m[3]; 
}; 

... 

jQuery("table.make-html-table td:textEquals('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')") 
    .css("background","yellow"); 
+0

有已經嘗試過了 - 忘記提及它似乎不起作用。 – cwd 2012-01-03 19:34:50

+0

你說得對。我會發佈一個備用解決方案,thg435的答案有關它爲什麼不起作用的信息。 – 2012-01-03 19:38:59

+0

謝謝。是的,我給了他一個upvote。 – cwd 2012-01-03 19:39:30