Відповіді:
Що я в кінцевому підсумку робив для 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 )
Остання редакція: Для 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
Станом на jQuery 1.3 цей метод застарілий. Для того, щоб це працювало, його потрібно визначити як функцію:
jQuery.expr[':'].Contains = function(a,i,m){
return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0;
};
Якщо когось (як я) цікавить, що означають a і m [3] у визначенні Містить .
КЛЮЧ / ЛЕГЕНД: Параметри, доступні jQuery для використання у визначеннях селектора:
r = jQuery масив елементів, які перевіряються. (наприклад: r.length = Кількість елементів)
i = індекс елемента, що знаходиться під контролем, в масиві r .
а = елемент, який зараз переглядається. Оператор Selector повинен повернути true, щоб включити його у відповідні результати.
м [2] = nodeName або *, що ми шукаємо (зліва від двокрапки).
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, Зробити 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()
для тексту елемента, також є subString, що дозволяє уникнути чутливого до регістру стану та перевірити, чи є в ньому subString. Після цього .filter()
метод будує новий об'єкт jQuery з підмножини відповідних елементів.
Тепер ви можете отримати елементи матчу у matchObjects та робити все, що завгодно.
var subString ="string you want to match".toLowerCase();
var matchObjects = $("elementsYouNeed").filter(function () {return $(this).text().toLowerCase().indexOf(subString) > -1;});