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

Я пытаюсь использовать регистр без учета регистра. Я попытался использовать решение в следующем вопросе 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");
    }
  });

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

вопрос задан 4.02.2010
Matrym
6933 репутация

6 ответов


  • 126 рейтинг

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

    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 здесь .

    ответ дан Nick Craver, с репутацией 520537, 4.02.2010
  • 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, с репутацией 569, 27.04.2011
  • 26 рейтинг

    Я бы сделал что-то вроде этого

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

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

    DEMO

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

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

    ответ дан Mina Gabriel, с репутацией 9234, 22.02.2013
  • 5 рейтинг

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

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

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

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

    ответ дан ErickBest, с репутацией 2816, 27.05.2013
  • 0 рейтинг

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

    $.expr[":"].containsNoCase = function (el, i, m) { 
        var search = m[3]; 
        if (!search) return false; 
        return eval("/" + search + "/i").test($(el).text()); 
    }; 
    
    ответ дан bresleveloper, с репутацией 3634, 11.02.2014
  • 0 рейтинг

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

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

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

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

    ответ дан Umesh Patil, с репутацией 1788, 11.01.2016