Як зробити jQuery Містить без урахування регістру, включаючи jQuery 1.8+?


91

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

Моє використання оригінального чутливого регістру "містить" у тому ж сценарії працює без помилок. Хтось має ідеї? Я був би вдячний


Якщо комусь цікаво, я оновив свій допис у блозі ще на трьох додаткових селекторах :containsExact, :containsExactCaseі :containsRegexселектори тепер працюють у всіх версіях jQuery.
Мотті


Я думаю, що .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
Зверніть увагу, що це не замінює: містить просто додайте ще один селектор: Містить.
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; 
};

Мені знадобився час, щоб зрозуміти, чому це не працює для мене.


Я б прокоментував це вище, але, мабуть, не можу.
Еліпсис,

5
Я не впевнений, що ти тут робиш. Це перекриває очікувану, задокументовану поведінку :contains. Думаю, зрозуміліше залишити оригінал у :containsспокої і зателефонувати своєму новому селектору :icontains.
Джастін Форс

5
Це суть мого допису. Створення альтернативного селектора, безумовно, є допустимим варіантом, однак я вказував на те, що extending: contains, але нехтуючи розширити: Contains може призвести до плутанини користувачів, коли вони дають різні результати.
Еліпсис

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

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


6

Може бути пізно .... але,

Я волів би піти цим шляхом ..

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

Таким чином, ви НЕ втручаєтесь у NATIC '.contains' jQuery ... Можливо, вам знадобиться за замовчуванням пізніше ... якщо його вторгнути , ви можете опинитися назад у 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/

Крім того, якщо ви хочете використовувати: містить і здійснити певний пошук, ви можете поглянути на це: http://technarco.com/jquery/using-jquery-search-html-text-and-show-or-hide- відповідно

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.