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

发布于 2024-09-28 06:36:33 字数 240 浏览 3 评论 0原文

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

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

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

I'm using following line and I would like to make it case-insensitive:

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

My question is that how can I make the selector ^= to be case-insensitive? Maybe changing to filter and then some regexp?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

浅唱々樱花落 2024-10-05 06:36:33

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

$.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 属性以 Rr 开头的任何 input 元素(因此它将匹配 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);

如果这两个条件都为 true,则返回:

  1. 请求的属性存在于此对象上 (opts[1] in obj)
  2. 在元素属性值的最开头找到搜索词(更改为小写) ,也改为小写。

我本可以使用 jQuery 语法而不是本机 JS 语法使其更易于阅读,但这意味着性能下降。

To do a case-insensitive attribute selection, you need to write a custom selector function.

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

You can use this like this:

$('input:iAttrStart(type, r)')

This will match any input elements whose type attribute begins with R or r (so it would match RADIO, radio, RESET or reset). This is a pretty silly example, but it should do what you need.


Re the comment that the function is hard to understand, I'll explain it a little.

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

This is the standard signature for creating custom selectors.

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

meta is an array of details about the call. meta[3] is the string passed as the parameter. In my example, this is type, r. The regex matches type and r separately.

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

Return if both these are true:

  1. The requested attribute exists on this object (opts[1] in obj)
  2. The search term (changed to lower-case) is found at the very beginning of the element's attribute value, also changed to lower case.

I could have made this easier to read using jQuery syntax rather than native JS syntax, but that would have meant reduced performance.

丿*梦醉红颜 2024-10-05 06:36:33

在这里您可以看到:

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

Here you can see:

http://www.ericmmartin.com/creating-a-custom-jquery-selector/

What you have to do is to create a custom jquery selector:

jQuery.extend(jQuery.expr[':'], {
    exactIgnoreCase: "(a.textContent||a.innerText||jQuery(a).text()||'').toLowerCase() == (m[3]).toLowerCase()"
});

And then just use it:

$("#detail select.fields option:exactIgnoreCase(" + q.val() + "):first");
朦胧时间 2024-10-05 06:36:33

使用lonesomeday的答案时有一个小问题。

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

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

选择器:

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

这不起作用。原因是因为当选择器代码到达语句 (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)
};

There's a slight problem when using lonesomeday's answer.

To reproduce the error, try this:
HTML tag on page is a common Facebook meta tag:

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

Selector:

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

This will not work. The reason is because when the selector code gets to the statement (opts[1] in obj)
it will execute ("property" in obj) which returns false. (I don't know why)

To fix this problem, I just changed the last line to use jQuery's attr() method

$.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)
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文