Как сделать jQuery Содержит регистр без учета регистра, в том числе 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");
}
});
Мое использование исходного "чувствительного" к регистру "содержит" в том же сценарии работает без ошибок. У кого-нибудь есть идеи? Я был бы признателен.
Ответы
Ответ 1
Это то, что я использую в текущем проекте, не было никаких проблем. Посмотрите, есть ли у вас больше удачи в этом формате:
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 здесь.
Ответ 2
Стоит отметить, что ответ правильный, но охватывает только :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;
};
Потратил меня на то, чтобы понять, почему это не работает для меня.
Ответ 3
Я бы сделал что-то вроде этого
$.expr[':'].containsIgnoreCase = function (n, i, m) {
return jQuery(n).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0;
};
И Оставьте :contains
Один...
DEMO
Итак, почему jQuery не поддерживает его в этой библиотеке?! если это так просто...
потому что Проходит ли код кода индейки?
Ответ 4
Может быть поздно... но,
Я бы предпочел пойти этим путем.
$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});
Таким образом, вы НЕ НАЙДИТЕ с помощью jQuery NATIVE '.contains'... Возможно, вам понадобится по умолчанию позже... если вы подделаете его, вы можете вернуться к StackOverflow...
Ответ 5
Я позволю себе добавить своих друзей:
$.expr[":"].containsNoCase = function (el, i, m) {
var search = m[3];
if (!search) return false;
return eval("/" + search + "/i").test($(el).text());
};
Ответ 6
Я просто смог полностью игнорировать чувствительность к регистру 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- соответственно