Есть ли нечувствительная к регистру версия : содержит селектор jQuery или я должен выполнять работу вручную, перебирая все элементы и сравнивая их. text() в мою строку?
Есть ли чувствительный к регистру jQuery: содержит селектор?
Ответ 1
Что я сделал для jQuery 1.2:
jQuery.extend(
jQuery.expr[':'], {
Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0"
});
Это расширит jquery, чтобы иметь: Содержит селектор, который нечувствителен к регистру, содержит: селектор остается неизменным.
Изменить: для 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 question)
Последнее редактирование: для jQuery 1.8 это должно быть:
jQuery.expr[":"].Contains = jQuery.expr.createPseudo(function(arg) {
return function( elem ) {
return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
};
});
Ответ 2
Чтобы сделать его необязательным, регистр нечувствителен: 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
Ответ 3
Как и в jQuery 1.3, этот метод устарел. Чтобы заставить это работать, его нужно определить как функцию:
jQuery.expr[':'].Contains = function(a,i,m){
return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};
Ответ 4
Если кому-то (как и мне) интересно, что означают значения a и m [3] в определении Содержит.
КЛЮЧ/ЛЕГЕНДА: Params, предоставленные jQuery для использования в определениях селектора:
r = массив jQuery проверяемых элементов. (например: r.length = количество элементов)
i = индекс элемента, находящегося под пристальным наблюдением, внутри массива r.
a = элемент, находящийся под пристальным вниманием. Оператор Selector должен возвращать true, чтобы включить его в свои согласованные результаты.
m [2] = nodeName или *, который мы ищем (слева от двоеточия).
m [3] = param перешел в селектор (param). Обычно номер индекса, например: nth-of-type (5), или строка, например: color (синий).
Ответ 5
В jQuery 1.8 вам нужно будет использовать
jQuery.expr[":"].icontains = jQuery.expr.createPseudo(function (arg) {
return function (elem) {
return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
};
});
Ответ 6
Вариант, который, кажется, выполняется немного быстрее, а также позволяет регулярные выражения:
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?')")
(Соответствует "запасу" или "запасам", но только в начале абзаца (игнорируя любые ведущие пробелы).
Ответ 7
Может быть поздно... но,
Я бы предпочел пойти этим путем.
$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});
Таким образом, вы НЕ НАЙДИТЕ с помощью jQuery NATIVE '.contains'... Возможно, вам понадобится по умолчанию позже... если вы подделаете его, вы можете вернуться к StackOverflow...
Ответ 8
jQuery.expr[':'].contains = function(a,i,m){
return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};
Код обновления отлично работает в 1.3, но "contains" должен быть строчным в первой букве в отличие от предыдущего примера.
Ответ 9
Обратитесь ниже, чтобы использовать ": содержит", чтобы найти текст, игнорирующий его чувствительность к регистру из 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: содержит регистр-нечувствительный
Ответ 10
У меня была аналогичная проблема со следующим, не работающим...
// 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');
Ответ 11
Более быстрая версия с использованием регулярных выражений.
$.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());
};