是否存在不区分大小写的 jQuery: include 选择器?

是否存在不区分大小写的 : 包含 jQuery 选择器版本,还是应该手动遍历所有元素并比较它们的。Text ()到我的字符串?

78410 次浏览

我最后为 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;
};

编辑: 显然,通过使用

(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;
};
});

如果有人(像我)感兴趣的是什么意思 M [3]包含定义。


KEY/LEGEND: jQuery 提供的可用于选择器定义的参数:

R = 被仔细检查的元素的 jQuery 数组(例如: 长度 = 元素数量)

I = 数组 R中当前正在审查的元素的索引。

A = 当前正在审查的元素。 Selector 语句必须返回 true 才能将其包含在匹配的结果中。

M [2] = nodeName 或 * ,我们正在寻找(冒号左边)。

M [3] = 传递到: selector (param)中的 param。

从 jQuery 1.3开始,这个方法就不被推荐了。为了使其正常工作,需要将其定义为一个函数:

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;
};

更新代码在1.3中工作得很好,但是与前面的示例不同,“包含”应该是第一个字母的小写。

使其不区分大小写: 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.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?')")(与“ stock”或“ stock”匹配,但仅在段落的开头(忽略任何前导空格)。)

在 jQuery 1.8中,您需要使用

jQuery.expr[":"].icontains = jQuery.expr.createPseudo(function (arg) {
return function (elem) {
return jQuery(elem).text().toUpperCase().indexOf(arg.toUpperCase()) >= 0;
};
});

可能会迟到,但是,

我想走这边。

$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});

通过这种方式,您可以篡改 jQuery 的 NATIVE 包含... ... 以后您可能需要默认的 包含... ... 如果被篡改,您可能会发现自己回到 < em > stackOverFlow ... ..。

请参阅下面的使用“ : 包含”来查找忽略 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: 包含不区分大小写

我也遇到过类似的问题,下面这些不起作用..。

// 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');

使用正则表达式的更快版本。

$.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());
};

新建一个变量,我把它命名为 subString,并把字符串放在一些元素文本中进行搜索。然后使用 Jquery 选择器选择您需要的元素,比如我的示例 $("elementsYouNeed").filter()过滤器。在 .filter()中,它会将 $("elementsYouNeed")中的每个元素与函数进行比较。

在函数 i 中,对元素 text 使用 .toLowerCase(),也使用 subString,它可以避免区分大小写的条件,并检查其中是否有 subString。然后,.filter()方法从匹配元素的子集构造一个新的 jQuery 对象。

现在您可以获得 match Object 中的 match 元素,并且可以做任何您想做的事情。

var subString ="string you want to match".toLowerCase();


var matchObjects = $("elementsYouNeed").filter(function () {return $(this).text().toLowerCase().indexOf(subString) > -1;});