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

Tx3*_*Tx3 6 jquery jquery-selectors

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

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

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

lon*_*day 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);
};
Run Code Online (Sandbox Code Playgroud)

您可以这样使用:

$('input:iAttrStart(type, r)')
Run Code Online (Sandbox Code Playgroud)

这将匹配任何input其元素type属性开始Rr(所以它会匹配RADIO,radio,RESETreset).这是一个非常愚蠢的例子,但它应该做你需要的.


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

$.expr[':'].iAttrStart = function(obj, params, meta, stack) {
Run Code Online (Sandbox Code Playgroud)

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

var opts = meta[3].match(/(.*)\s*,\s*(.*)/);
Run Code Online (Sandbox Code Playgroud)

meta是一系列有关通话的详细信息. meta[3]是作为参数传递的字符串.在我的例子中,这是type, r.正则表达式匹配typer分开.

return (opts[1] in obj) && (obj[opts[1]].toLowerCase().indexOf(opts[2].toLowerCase()) === 0);
Run Code Online (Sandbox Code Playgroud)

如果这两个都是真的,则返回:

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

我本可以使用jQuery语法而不是本机JS语法来更容易阅读,但这意味着性能会降低.