【发布时间】:2010-10-19 11:33:38
【问题描述】:
我正在使用以下行,我想让它不区分大小写:
var matches = $(this).find('div > span > div#id_to_find[attributeName ^= "filter"]');
if (matches.length > 0) {
}
我的问题是如何使选择器^= 不区分大小写?也许更改为过滤器,然后是一些正则表达式?
【问题讨论】:
我正在使用以下行,我想让它不区分大小写:
var matches = $(this).find('div > span > div#id_to_find[attributeName ^= "filter"]');
if (matches.length > 0) {
}
我的问题是如何使选择器^= 不区分大小写?也许更改为过滤器,然后是一些正则表达式?
【问题讨论】:
要进行不区分大小写的属性选择,需要编写自定义选择器函数。
$.expr[':'].iAttrStart = function(obj, params, meta, stack) {
var opts = meta[3].match(/(.*)\s*,\s*(.*)/);
return (opts[1] in obj) && (obj[opts[1]].toLowerCase().indexOf(opts[2].toLowerCase()) === 0);
};
你可以这样使用:
$('input:iAttrStart(type, r)')
这将匹配任何type 属性以R 或r 开头的input 元素(因此它将匹配RADIO、radio、RESET 或reset)。这是一个非常愚蠢的示例,但它应该可以满足您的需求。
关于函数难以理解的注释,我稍微解释一下。
$.expr[':'].iAttrStart = function(obj, params, meta, stack) {
这是创建自定义选择器的标准签名。
var opts = meta[3].match(/(.*)\s*,\s*(.*)/);
meta 是有关呼叫的详细信息数组。 meta[3] 是作为参数传递的字符串。在我的示例中,这是type, r。正则表达式分别匹配 type 和 r。
return (opts[1] in obj) && (obj[opts[1]].toLowerCase().indexOf(opts[2].toLowerCase()) === 0);
如果这两个都为真,则返回:
opts[1] in obj)我本可以使用 jQuery 语法而不是原生 JS 语法使这更容易阅读,但这会降低性能。
【讨论】:
在这里你可以看到:
http://www.ericmmartin.com/creating-a-custom-jquery-selector/
你要做的是创建一个自定义的 jquery 选择器:
jQuery.extend(jQuery.expr[':'], {
exactIgnoreCase: "(a.textContent||a.innerText||jQuery(a).text()||'').toLowerCase() == (m[3]).toLowerCase()"
});
然后就用它吧:
$("#detail select.fields option:exactIgnoreCase(" + q.val() + "):first");
【讨论】:
在使用 lonesomeday 的答案时有一个小问题。
要重现错误,请尝试以下操作: 页面上的 HTML 标记是常见的 Facebook 元标记:
<meta content="Title of og tag" property="og:title" />
选择器:
$('meta:attrCaseInsensitive(property, og:site_name)')
这行不通。 The reason is because when the selector code gets to the statement (opts[1] in obj)
它将执行("property" in obj),返回false。 (不知道为什么)
为了解决这个问题,我只是将最后一行改成使用 jQuery 的 attr() 方法
$.expr[':'].iAttrStart = function(obj, params, meta, stack) {
var opts = meta[3].match(/(.*)\s*,\s*(.*)/);
return (undefined != $(obj).attr(opts[1])) && (obj[opts[1]].toLowerCase().indexOf(opts[2].toLowerCase()) === 0)
};
【讨论】: