これは、候補を属性.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以降では、いくつかの変更が必要になる場合があります。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/