Как сделать jQuery Contains без учета регистра, включая jQuery 1.8+? - PullRequest
91 голосов
/ 04 февраля 2010

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

Существует ли нечувствительный к регистру jQuery: содержит селектор?

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

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");
    }
  });

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

Ответы [ 6 ]

127 голосов
/ 04 февраля 2010

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

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

В jQuery 1.8 API-интерфейс для этого изменился, версия jQuery 1.8+ будет выглядеть так: Вы можете проверить это здесь .Для более подробной информации о 1.8+ пользовательских селекторах, посмотрите вики Sizzle здесь .

43 голосов
/ 27 апреля 2011

Стоит отметить, что ответ правильный, но охватывает только :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; 
};

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

27 голосов
/ 23 февраля 2013

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

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

И оставь :contains В одиночку ...

DEMO

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

потому что Ваш код передает код Турции?

5 голосов
/ 27 мая 2013

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

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

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

Таким образом, вы НЕ вмешиваетесь в ПОРЯДОК jQuery '. Содержит' ... Возможно, вам понадобится вариант по умолчанию позже ... в случае подделки вы можете оказаться вернуться к stackOverFlow ...

0 голосов
/ 11 января 2016

Я просто смог полностью игнорировать чувствительность к регистру в 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-содержит-без учета регистра /

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

0 голосов
/ 11 февраля 2014

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

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