Существует ли регистр символов jQuery: содержит селектор?

145

Существует ли нечувствительная к регистру версия селектора jQuery, содержащая регистр, или я должен выполнить работу вручную, зациклив все элементы и сравнив их .text () со своей строкой?

похлопывание
источник
2
Для jQuery 8.1 + проверьте этот ответ
Правин
1
^ Это 1.8.1, а не 8.1.
TylerH
Хороший пример здесь .
瑲 瑲

Ответы:

125

В конечном итоге я сделал для jQuery 1.2:

jQuery.extend(
    jQuery.expr[':'], { 
        Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0" 
});

Это расширит jquery, чтобы иметь селектор: Contains без учета регистра, селектор: contains остается неизменным.

Редактировать: Для 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;
    };
});
похлопывание
источник
Просто хотел, чтобы люди знали, что решение, описанное @Pat и другими для jQuery 1.3, также работает для 1.4.3.
Джим Ад
Ссылка на вопрос / ответ @ Джона, так как ссылка здесь была удалена: stackoverflow.com/questions/1407434/…
Mottie
Это не работает для jQuery 1.8. См. Ответ seagullJS ниже для обновленной версии - stackoverflow.com/a/12113443/560114
Мэтт Браун
105

Чтобы сделать его опционально нечувствительным к регистру: 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

montrealmike
источник
3
добавление новой функции лучше, чем перезапись, теперь я использую эту опцию (работает как шарм)
GôTô
22
это следует добавить в стандартную библиотеку jquery
user482594
41

Начиная с jQuery 1.3, этот метод устарел. Чтобы это работало, его нужно определить как функцию:

jQuery.expr[':'].Contains = function(a,i,m){
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};
user95227
источник
38

Если кому-то (например, мне) интересно, что означают a и m [3] в определении Contains .


KEY / LEGEND: параметры, предоставляемые jQuery для использования в определениях селектора:

r = jQuery массив изучаемых элементов. (например: r.length = количество элементов)

i = индекс элемента, который в настоящее время находится на рассмотрении, в массиве r .

a = элемент в настоящее время находится под пристальным вниманием. Оператор выбора должен возвращать true, чтобы включить его в соответствующие результаты.

m [2] = имя_узла или * то, что мы ищем (слева от двоеточия).

m [3] = параметр, переданный в: селектор (параметр). Обычно это порядковый номер, например : nth-of-type (5) , или строка, например : color (blue) .

Александр Прокофьев
источник
31

В jQuery 1.8 вам нужно будет использовать

jQuery.expr[":"].icontains = jQuery.expr.createPseudo(function (arg) {                                                                                                                                                                
    return function (elem) {                                                            
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;        
    };                                                                                  
});
seagullJS
источник
2
Работал отлично, спасибо! Только что обновился до 1.8 и это перестало работать.
Андреас
3
Спасибо за обновление. Только что обновил до JQuery 1.8 и он перестал работать
Wasim
15

Вариант, который, кажется, работает немного быстрее и также допускает регулярные выражения :

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?')") (Соответствует «акции» или «акции», но только в начале абзаца (игнорируя все начальные пробелы).)
Брок Адамс
источник
11

Может быть поздно .... но,

Я бы предпочел пойти по этому пути ..

$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});

Таким образом, вы не вмешиваетесь в NATIVE '.contains' jQuery ... Возможно, вам понадобится значение по умолчанию позже ... если вы вмешаетесь , вы можете оказаться в stackOverFlow ...

ErickBest
источник
6
jQuery.expr[':'].contains = function(a,i,m){
    return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};

Код обновления прекрасно работает в версии 1.3, но в отличие от предыдущего примера «содержит» должно быть в нижнем регистре на первой букве.


источник
1
Я думаю, что он хотел отдельную функцию, чтобы оба :containsи :Containsоба работали одновременно.
Joshperry
msgstr "селектор: содержит остается неизменным."
Гарри Б
4

Обратитесь ниже, чтобы использовать «: содержит», чтобы найти текст, игнорирующий чувствительность к регистру в 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, Make jQuery: содержит регистр-нечувствительный

Умеш Патил
источник
2

Более быстрая версия с использованием регулярных выражений.

$.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());
};
rotaercz
источник
Отличная работа! Большое спасибо. Я считаю, что это лучший и самый актуальный ответ на этот вопрос.
mavrosxristoforos
0

У меня была похожая проблема со следующим не работает ...

// 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');
shao.lo
источник
0

Новая переменная, я даю ей имя subString и помещаю строку, которую вы хотите найти, в некоторые элементы текста. Затем с помощью селектора Jquery выберите нужные вам элементы, такие как мой пример, $("elementsYouNeed")и отфильтруйте по .filter(). В .filter()нем будут сравниваться каждый элемент в$("elementsYouNeed") с функцией.

В функции, которую я использую .toLowerCase()для текста элемента, также есть подстрока, которая может избежать чувствительного к регистру условия и проверить, есть ли в нем подстрока. После этого .filter()метод создает новый объект jQuery из подмножества соответствующих элементов.

Теперь вы можете получить соответствующие элементы в matchObjects и делать что хотите.

var subString ="string you want to match".toLowerCase();

var matchObjects = $("elementsYouNeed").filter(function () {return $(this).text().toLowerCase().indexOf(subString) > -1;});
劉鎮 瑲
источник