是否存在不区分大小写的jQuery:包含选择器
Is there a case insensitive jQuery :contains selector?
是否存在不区分大小写的:contains-jQuery选择器版本,或者我应该通过循环所有元素并将它们的.text()与我的字符串进行比较来手动完成这项工作?
我最终为jQuery 1.2做的是:
jQuery.extend(
jQuery.expr[':'], {
Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0"
});
这将扩展jquery,使其具有不区分大小写的:Contains选择器,:Containes选择器保持不变。
编辑:对于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]在包含定义中的意思是什么。
KEY/LEGEND:jQuery提供的用于选择器定义的参数:
r=jQuery被仔细检查的元素数组。(例如:r.length=元件数量)
i=数组r中当前正在审查的元素的索引。
a=当前正在审查的元素。Selector语句必须返回true才能将其包含在匹配的结果中。
m[2]=我们正在查找的nodeName或*(冒号左侧)。
m[3]=传递到:选择器的参数(param)。通常是一个索引号,如中的第n个类型(5),或者是一个字符串,如中的颜色(蓝色)。
在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')")
(匹配"Up"或"Up",但不匹配"upper"、"wakeup"等)$("p:containsCI('(?:Red|Blue) state')")
(匹配"红色状态"或"蓝色状态",但不匹配"向上状态"等)$("p:containsCI('^''s*Stocks?')")
(匹配"stock"或"stocks",但仅在段落开头(忽略任何前导空格)。)
可能会迟到。。。。但是,
我宁愿走这条路。。
$.extend($.expr[":"], {
"MyCaseInsensitiveContains": function(elem, i, match, array) {
return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
}
});
这样,您就不会篡改jQuery的NATIVE'.contains'…您以后可能需要默认的。。。如果被篡改,您可能会发现自己回到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")
中的每个元素与函数进行比较。
在函数i中,使用.toLowerCase()
作为元素文本的子字符串也可以避免区分大小写的条件,并检查其中是否有子字符串。之后,.filter()
方法从匹配元素的子集构造一个新的jQuery对象。
现在,您可以在matchObjects中获取匹配元素,并执行任意操作。
var subString ="string you want to match".toLowerCase();
var matchObjects = $("elementsYouNeed").filter(function () {return $(this).text().toLowerCase().indexOf(subString) > -1;});
- jQuery包含html-将类添加到头中
- Javascript,jquery.panzoom,jquery:包含问题
- Richfaces捆绑的jQuery包含在webapp捆绑的JavaScript文件之后
- 如何在没有冲突的情况下将 JQuery 包含在 JavaScript 文件中
- 使用noConflict jQuery包含带有requireJS的jQuery UI
- 将jQuery包含到javascript中,并在imacros中使用它
- jQuery包含多个字符串优化
- jQuery :包含始终触发的选择器
- 更改 <对象> 标记的属性,该标记使用 jQuery 包含一个 SVG 元素
- 如何在使用浏览器时将jQuery包含在AngularJS中
- Jquery包含删除某些字符
- 如何使用 jquery 包含树枝模板
- 如何将Javascript和jQuery包含在HTML中
- Jquery包含字符串
- 使用jQuery包含文件并获取它's的内容长度
- jQuery包含来自输入文本
- 如何使用Jquery(包含页面)重新加载PHP查询
- jQuery:包含<选项>VALUE</选项>
- jQuery“包含”代码在Chrome上不起作用
- jQuery:包含在ie7中不工作的内容(jQuery 1.3.5)