Как сделать jQuery Contains нечувствительным к регистру, включая jQuery 1.8+?


91

Я пытаюсь использовать регистр "содержит" без учета регистра. Я попытался использовать решение по следующему вопросу о стеке, но это не сработало:

Есть ли селектор jQuery: contains без учета регистра?

Для удобства решение скопировано сюда:

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

Вот ошибка:

Error: q is not a function
Source File: /js/jquery-1.4.js?ver=1.4
Line: 81

Вот где я его использую:

  $('input.preset').keyup(function() {
    $(this).next().find("li").removeClass("bold");
    var theMatch = $(this).val();
    if (theMatch.length > 1){
      theMatch = "li:Contains('" + theMatch + "')";
      $(this).next().find(theMatch).addClass("bold");
    }
  });

Мое использование исходного "содержит" с учетом регистра в том же сценарии работает без ошибок. У кого-нибудь есть идеи? Я бы оценил это.


В случае , если кому - то интересно, я обновил свой блог на три дополнительных содержит селекторы :containsExact, :containsExactCaseи :containsRegexселекторы теперь работает во всех версиях JQuery.
Mottie 02


Я думаю, что .filter () - еще один хороший способ. Ссылка
劉鎮 瑲

Ответы:


127

Это то, что я использую в текущем проекте, никаких проблем не было. Посмотрим, удастся ли вам больше с этим форматом:

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

В jQuery 1.8 API для этого изменился, версия jQuery 1.8+ этого будет:

jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
    return function( elem ) {
        return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
    };
});

Вы можете проверить это здесь . Более подробную информацию о пользовательских селекторах 1.8+ см . В вики Sizzle здесь .


Вы спасаете жизнь. Спасибо.
Matrym

3
Есть ли шанс, что вы могли бы рассказать, что именно это делает?
Abe Miessler

4
@ClovisSix - спасибо за внимание, я предоставил способ сделать то же самое 1.8+, дайте мне знать, если у вас возникнут проблемы.
Ник Крейвер

1
Обратите внимание, что это не заменяет: contains, просто добавьте еще один селектор: Contains.
albanx

3
должен быть вызван селектор icontainsили что-то подобное.
Себастьян

43

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

Это можно решить, продублировав расширение псевдонима:

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

Мне потребовалось время, чтобы понять, почему это не работает для меня.


Я бы прокомментировал это выше, но, видимо, не могу.
Ellipsis

5
Я не уверен, что вы здесь имеете в виду. Это отменяет ожидаемое задокументированное поведение :contains. Думаю, проще оставить оригинал в :containsпокое и вызвать новый селектор :icontains.
Джастин Форс,

5
Это не относится к моему посту. Создание альтернативного селектора, безусловно, является допустимым вариантом, однако я указывал, что расширение: содержит, но пренебрежение расширением: содержит может привести к путанице пользователя, когда они дают разные результаты.
Ellipsis

1
Тогда спасибо, что поделились этой "добычей". :) Тем не менее, я думаю, что было бы неплохо упомянуть, что лучше не отменять встроенное поведение, когда построить неразрушающее параллельное поведение меньше работы.
Джастин Форс,

Я попробовал несколько разных решений, опубликованных для этого, и это наконец сработало. Спасибо.
Тейлор Майклс

27

Я бы сделал что-то подобное

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

И оставь в :containsпокое ...

ДЕМО

Так почему же jQuery не поддерживает его в своей библиотеке ?! если это так просто ...

потому что ваш код передает код индейки?


6

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

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

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

Таким образом, вы НЕ ИСПОЛЬЗУЕТЕ JQuery NATIVE '.contains' ... Возможно, вам понадобится значение по умолчанию позже ... если вмешаться, вы можете вернуться к stackOverFlow ...


0

позволю себе добавить своих друзей:

$.expr[":"].containsNoCase = function (el, i, m) { 
    var search = m[3]; 
    if (!search) return false; 
    return eval("/" + search + "/i").test($(el).text()); 
}; 

0

Мне просто удалось полностью игнорировать чувствительность к регистру jQuery, чтобы добиться того, чего я хочу, используя приведенный ниже код:

            $.expr[":"].contains = $.expr.createPseudo(function(arg) {
            return function( elem ) {
                return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
            };
        });

Вы можете использовать эту ссылку, чтобы найти код на основе ваших версий jQuery, чтобы игнорировать чувствительность к регистру, https://css-tricks.com/snippets/jquery/make-jquery-contains-case-insensitive/

Также, если вы хотите использовать: contains и выполнить поиск, вы можете взглянуть на это: http://technarco.com/jquery/using-jquery-search-html-text-and-show-or-hide- соответственно

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.