这用于.filter()
将候选人限制为具有data-api-*
属性的候选人。可能不是最有效的方法,但如果您可以首先使用相关选择器缩小搜索范围,则可以使用。
$("div").filter(function() {
var attrs = this.attributes;
for (var i = 0; i < attrs.length; i++) {
if (attrs[i].nodeName.indexOf('data-api-') === 0) return true;
};
return false;
}).css('color', 'red');
演示:http : //jsfiddle.net/r3yPZ/2/
这也可以写成一个选择器。这是我的新手尝试:
$.expr[':'].hasAttrWithPrefix = function(obj, idx, meta, stack) {
for (var i = 0; i < obj.attributes.length; i++) {
if (obj.attributes[i].nodeName.indexOf(meta[3]) === 0) return true;
};
return false;
};
用法:
$('div:hasAttrWithPrefix(data-api-)').css('color', 'red');
演示:http : //jsfiddle.net/SuSpe/3/
这个选择器应该适用于 jQuery 1.8 之前的版本。对于 1.8 及更高版本,可能需要进行一些更改。这是对 1.8 兼容版本的尝试:
$.expr[':'].hasAttrWithPrefix = $.expr.createPseudo(function(prefix) {
return function(obj) {
for (var i = 0; i < obj.attributes.length; i++) {
if (obj.attributes[i].nodeName.indexOf(prefix) === 0) return true;
};
return false;
};
});
演示:http : //jsfiddle.net/SuSpe/2/
对于更通用的解决方案,这里有一个选择器,它采用正则表达式模式并选择具有与该模式匹配的属性的元素:
$.expr[':'].hasAttr = $.expr.createPseudo(function(regex) {
var re = new RegExp(regex);
return function(obj) {
var attrs = obj.attributes
for (var i = 0; i < attrs.length; i++) {
if (re.test(attrs[i].nodeName)) return true;
};
return false;
};
});
对于您的示例,这样的事情应该有效:
$('div:hasAttr(^data-api-.+$)').css('color', 'red');
演示:http : //jsfiddle.net/Jg5qH/1/