Есть ли нечувствительный к регистру jQuery: содержит селектор?
есть ли нечувствительная к регистру версия содержит селектор jQuery или я должен делать работу вручную, зацикливаясь на всех элементах и сравнивая их .текст() для моей строки?
11 ответов:
то, что я в конечном итоге сделал для jQuery 1.2:
jQuery.extend( jQuery.expr[':'], { Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0" });это расширит jquery, чтобы иметь селектор :Contains, который не учитывает регистр, селектор :contains остается неизменным.
Edit: для jQuery 1.3 (спасибо @user95227) и позже вам нужно
jQuery.expr[':'].Contains = function(a,i,m){ return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0; };изменить: По-видимому, доступ к DOM напрямую с помощью
(a.textContent || a.innerText || "")вместо
jQuery(a).text()в предыдущем выражении значительно ускоряет его, поэтому попробуйте самостоятельно риск, если скорость является проблемой. (см. @John ' s вопрос)
последнее редактирование: для jQuery 1.8 это должно быть:
jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) { return function( elem ) { return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; }; });
чтобы сделать его дополнительно нечувствительным к регистру: http://bugs.jquery.com/ticket/278
$.extend($.expr[':'], { 'containsi': function(elem, i, match, array) { return (elem.textContent || elem.innerText || '').toLowerCase() .indexOf((match[3] || "").toLowerCase()) >= 0; } });затем использовать
:containsiвместо:contains
начиная с jQuery 1.3, этот метод является устаревшим. Чтобы заставить это работать, он должен быть определен как функция:
jQuery.expr[':'].Contains = function(a,i,m){ return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0; };
Если кто-то (как мне) интересно что делать a и m[3] имею в виду содержит определение.
ключ / легенда: параметры, доступные jQuery для использования в определениях селектора:
r = jQuery массив проверяемых элементов. (например: Р.длина = число элементов)
Я = индекс элемента, находящегося в настоящее время под контролем, внутри массива r.
a = элемент в настоящее время находится под пристальным вниманием. Оператор Selector должен возвращать значение true, чтобы включить его в соответствующие результаты.
m[2] = nodeName или * что мы ищем (слева от двоеточия).
m[3] = param передается в селектор: (param). Обычно номер индекса, как в : nth-of-type (5), или строка, как в :цвет(синий).
в jQuery 1.8 вам нужно будет использовать
jQuery.expr[":"].icontains = jQuery.expr.createPseudo(function (arg) { return function (elem) { return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; }; });
вариация, которая, кажется, работает немного быстрее, и что также позволяет регулярные выражения - это:
jQuery.extend ( jQuery.expr[':'].containsCI = function (a, i, m) { //-- faster than jQuery(a).text() var sText = (a.textContent || a.innerText || ""); var zRegExp = new RegExp (m[3], 'i'); return zRegExp.test (sText); } );
мало того, что этот регистр нечувствителен, но он позволяет мощные поиски, такие как:
$("p:containsCI('\bup\b')")(соответствует "вверх "или" вверх", но не" верх"," пробуждение " и т. д.)$("p:containsCI('(?:Red|Blue) state')")(соответствует "красному состоянию" или "синему состоянию", но не "вверх по состоянию" и т. д.)$("p:containsCI('^\s*Stocks?')")(матчи "запаса" или "запасы", но только в начале абзаца (без пробела).)
может быть поздно.... но,
Я бы предпочел пойти этим путем..
$.extend($.expr[":"], { "MyCaseInsensitiveContains": function(elem, i, match, array) { return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0; } });сюда, ты НЕ НАДО вмешаться в родной jQuery '.содержит'... Возможно, Вам понадобится значение по умолчанию позже...если его подделать, вы можете вернуться к stackOverFlow...
jQuery.expr[':'].contains = function(a,i,m){ return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0; };код обновления отлично работает в 1.3, но "содержит" должно быть в нижнем регистре на первой букве в отличие от предыдущего примера.
использовать ниже код, чтобы использовать "содержит", чтобы найти текст, игнорируя его чувствительности случай из HTML-кода
$.expr[":"].contains = $.expr.createPseudo(function(arg) { return function( elem ) { return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0; }; }); $("#searchTextBox").keypress(function() { if($("#searchTextBox").val().length > 0){ $(".rows").css("display","none"); var userSerarchField = $("#searchTextBox").val(); $(".rows:contains('"+ userSerarchField +"')").css("display","block"); } else { $(".rows").css("display","block"); } });вы можете использовать эту ссылку, чтобы найти больше об этом, используйте jQuery для поиска HTML текста и показать или скрыть соответственно
вы также можете использовать эту ссылку, чтобы найти код case igonring на основе вашей версии jquery, Make jQuery: содержит регистр без учета
у меня была аналогичная проблема со следующим не работает...
// This doesn't catch flac or Flac $('div.story span.Quality:not(:contains("FLAC"))').css("background-color", 'yellow');это работает и без необходимости для расширения
$('div.story span.Quality:not([data*="flac"])').css("background-color", 'yellow');Это тоже работает, но, вероятно, попадает в категорию "ручной цикл"....
$('div.story span.Quality').contents().filter(function() { return !/flac/i.test(this.nodeValue); }).parent().css("background-color", 'yellow');
более быстрая версия с использованием регулярных выражений.
$.expr[':'].icontains = function(el, i, m) { // checks for substring (case insensitive) var search = m[3]; if (!search) return false; var pattern = new RegExp(search, 'i'); return pattern.test($(el).text()); };
Comments