编写jQuery选择器不区分大小写的版本

时间:2010-10-19 11:33:39

标签: jquery jquery-selectors

我正在使用以下行,我想让它不区分大小写:

var matches = $(this).find('div > span > div#id_to_find[attributeName ^= "filter"]');
if (matches.length > 0) {
}

我的问题是如何让选择器^=不区分大小写?也许改成过滤然后一些正则表达式?

3 个答案:

答案 0 :(得分:9)

要进行不区分大小写的属性选择,您需要编写自定义选择器函数。

$.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)')

这将匹配input属性以typeR开头的所有r元素(因此它匹配RADIOradioRESETreset)。这是一个非常愚蠢的例子,但它应该做你需要的。


重新评论该功能很难理解,我会稍微解释一下。

$.expr[':'].iAttrStart = function(obj, params, meta, stack) {

这是创建自定义选择器的标准签名。

var opts = meta[3].match(/(.*)\s*,\s*(.*)/);

meta是有关该呼叫的一系列详细信息。 meta[3]是作为参数传递的字符串。在我的示例中,这是type, r。正则表达式分别与typer匹配。

return (opts[1] in obj) && (obj[opts[1]].toLowerCase().indexOf(opts[2].toLowerCase()) === 0);

如果两者都属实,则返回:

  1. 此对象(opts[1] in obj
  2. 上存在请求的属性
  3. 搜索词(更改为小写)位于元素属性值的最开头,也更改为小写。
  4. 我本可以使用jQuery语法而不是本机JS语法更容易阅读,但这意味着性能会降低。

答案 1 :(得分:2)

在这里你可以看到:

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");

答案 2 :(得分:0)

使用lonesomeday的答案时会出现轻微问题。

要重现错误,请尝试以下操作: 页面上的HTML标记是常见的Facebook元标记:

<meta content="Title of og tag" property="og:title" />

选择器:

$('meta:attrCaseInsensitive(property, og:site_name)')

这不起作用。原因是当选择器代码到达语句(opts[1] in obj)时 它将执行返回false的("property" in obj)。 (我不知道为什么)

要解决这个问题,我只是改变了最后一行来使用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)
};