Существует ли нечувствительная к регистру версия селектора jQuery, содержащая регистр, или я должен выполнить работу вручную, зациклив все элементы и сравнив их .text () со своей строкой?
Существует ли нечувствительная к регистру версия селектора jQuery, содержащая регистр, или я должен выполнить работу вручную, зациклив все элементы и сравнив их .text () со своей строкой?
Ответы:
В конечном итоге я сделал для jQuery 1.2:
jQuery.extend(
jQuery.expr[':'], {
Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0"
});
Это расширит jquery, чтобы иметь селектор: Contains без учета регистра, селектор: contains остается неизменным.
Редактировать: Для jQuery 1.3 (спасибо @ user95227) и позже вам нужно
jQuery.expr[':'].Contains = function(a,i,m){
return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};
Редактировать: очевидно доступ к DOM напрямую с помощью
(a.textContent || a.innerText || "")
вместо того
jQuery(a).text()
В предыдущем выражении это значительно ускоряется, поэтому попробуйте на свой страх и риск, если скорость является проблемой. (см @John «S вопрос )
Последнее редактирование: для jQuery 1.8 должно быть:
jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
return function( elem ) {
return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
};
});
Чтобы сделать его опционально нечувствительным к регистру: http://bugs.jquery.com/ticket/278
$.extend($.expr[':'], {
'containsi': function(elem, i, match, array)
{
return (elem.textContent || elem.innerText || '').toLowerCase()
.indexOf((match[3] || "").toLowerCase()) >= 0;
}
});
затем использовать :containsi
вместо:contains
Если кому-то (например, мне) интересно, что означают a и m [3] в определении Contains .
KEY / LEGEND: параметры, предоставляемые jQuery для использования в определениях селектора:
r = jQuery массив изучаемых элементов. (например: r.length = количество элементов)
i = индекс элемента, который в настоящее время находится на рассмотрении, в массиве r .
a = элемент в настоящее время находится под пристальным вниманием. Оператор выбора должен возвращать true, чтобы включить его в соответствующие результаты.
m [2] = имя_узла или * то, что мы ищем (слева от двоеточия).
m [3] = параметр, переданный в: селектор (параметр). Обычно это порядковый номер, например : nth-of-type (5) , или строка, например : color (blue) .
В jQuery 1.8 вам нужно будет использовать
jQuery.expr[":"].icontains = jQuery.expr.createPseudo(function (arg) {
return function (elem) {
return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
};
});
Вариант, который, кажется, работает немного быстрее и также допускает регулярные выражения :
jQuery.extend (
jQuery.expr[':'].containsCI = function (a, i, m) {
//-- faster than jQuery(a).text()
var sText = (a.textContent || a.innerText || "");
var zRegExp = new RegExp (m[3], 'i');
return zRegExp.test (sText);
}
);
Это не только нечувствительно к регистру, но и позволяет выполнять мощный поиск, например:
$("p:containsCI('\\bup\\b')")
(Соответствует «вверх» или «вверх», но не «верхний», «пробуждение» и т. Д.)$("p:containsCI('(?:Red|Blue) state')")
(Соответствует «красному состоянию» или «синему состоянию», но не «активному состоянию» и т. Д.)$("p:containsCI('^\\s*Stocks?')")
(Соответствует «акции» или «акции», но только в начале абзаца (игнорируя все начальные пробелы).)Может быть поздно .... но,
Я бы предпочел пойти по этому пути ..
$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});
Таким образом, вы не вмешиваетесь в NATIVE '.contains' jQuery ... Возможно, вам понадобится значение по умолчанию позже ... если вы вмешаетесь , вы можете оказаться в stackOverFlow ...
jQuery.expr[':'].contains = function(a,i,m){
return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};
Код обновления прекрасно работает в версии 1.3, но в отличие от предыдущего примера «содержит» должно быть в нижнем регистре на первой букве.
:contains
и :Contains
оба работали одновременно.
Обратитесь ниже, чтобы использовать «: содержит», чтобы найти текст, игнорирующий чувствительность к регистру в HTML-коде,
$.expr[":"].contains = $.expr.createPseudo(function(arg) {
return function( elem ) {
return $(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
};
});
$("#searchTextBox").keypress(function() {
if($("#searchTextBox").val().length > 0){
$(".rows").css("display","none");
var userSerarchField = $("#searchTextBox").val();
$(".rows:contains('"+ userSerarchField +"')").css("display","block");
} else {
$(".rows").css("display","block");
}
});
Вы также можете использовать эту ссылку, чтобы найти код, игнорирующий регистр, основанный на вашей версии jquery, Make jQuery: содержит регистр-нечувствительный
Более быстрая версия с использованием регулярных выражений.
$.expr[':'].icontains = function(el, i, m) { // checks for substring (case insensitive)
var search = m[3];
if (!search) return false;
var pattern = new RegExp(search, 'i');
return pattern.test($(el).text());
};
У меня была похожая проблема со следующим не работает ...
// This doesn't catch flac or Flac
$('div.story span.Quality:not(:contains("FLAC"))').css("background-color", 'yellow');
Это работает и без необходимости расширения
$('div.story span.Quality:not([data*="flac"])').css("background-color", 'yellow');
Это тоже работает, но, вероятно, попадает в категорию "ручной цикл" ....
$('div.story span.Quality').contents().filter(function()
{
return !/flac/i.test(this.nodeValue);
}).parent().css("background-color", 'yellow');
Новая переменная, я даю ей имя subString и помещаю строку, которую вы хотите найти, в некоторые элементы текста. Затем с помощью селектора Jquery выберите нужные вам элементы, такие как мой пример, $("elementsYouNeed")
и отфильтруйте по .filter()
. В .filter()
нем будут сравниваться каждый элемент в$("elementsYouNeed")
с функцией.
В функции, которую я использую .toLowerCase()
для текста элемента, также есть подстрока, которая может избежать чувствительного к регистру условия и проверить, есть ли в нем подстрока. После этого .filter()
метод создает новый объект jQuery из подмножества соответствующих элементов.
Теперь вы можете получить соответствующие элементы в matchObjects и делать что хотите.
var subString ="string you want to match".toLowerCase();
var matchObjects = $("elementsYouNeed").filter(function () {return $(this).text().toLowerCase().indexOf(subString) > -1;});