Существует ли селектор jQuery :contains без учета регистра?

StackOverflow https://stackoverflow.com/questions/187537

Вопрос

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

Это было полезно?

Решение

В итоге я сделал для 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()

В предыдущем выражении это значительно ускоряется, поэтому попробуйте на свой страх и риск, если скорость является проблемой.(см . @Джон '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 вместо : содержит

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

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

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

<Ч>

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

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

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

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

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

m [3] = параметр передается в селектор: (параметр). Обычно это порядковый номер, как в : 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')") (Соответствует "Вверх" или "up", но не "upper", "wakeup" и т.д.)
  • $("p:containsCI('(?:Red|Blue) state')") (Соответствует "красному состоянию" или "синему состоянию", но не "включенному состоянию" и т.д.)
  • $("p:containsCI('^\\s*Stocks?')") (Соответствует "stock" или "запасы", но только в начале абзаца (игнорируя любые начальные пробелы).)

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

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

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

Таким образом, вы НЕ вмешиваетесь в NATIVE '. содержит' ... 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, Создать 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());
};
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top