如何在jQuery中转义括号:包含选择器?

时间:2012-01-03 19:09:16

标签: javascript jquery

我尝试使用jQuery在表中搜索用户代理字符串。如果我这样搜索,则找不到:

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搜索包含它的单元格?

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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");