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