這使用.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/
這個選擇應該預先1.8版本的jQuery的工作。爲1。8及以上,some changes may be required。下面是在一個標準的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/
這個問題可能會有所幫助:[jquery的數據選擇器(http://stackoverflow.com/questions/2891452/jquery-data-selector) – jrummell
將它始終是一個「DATA- 「屬性? – Ian
@ianpgall更可能,是的。它們會類似於某個點(比如data-api),那麼屬性名稱的其餘部分可能有意義。 –