2012-01-03 2 views
2

Я попытался найти строку user-agent в таблице с помощью 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?

ответ

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

проверено и работает хорошо. Спасибо! примечание другим - я использовал функцию «rawurlescape» php, чтобы избежать строки пользовательского агента, которую я искал. – cwd

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

+0

Вы правы. Я отправлю альтернативное решение, ответ thg435 содержит информацию о том, почему он не работает. –

+0

спасибо. да, я дал ему верх. – cwd

Смежные вопросы