Questo utilizza .filter()
per limitare i candidati a quelli che ha data-api-*
attributi. Probabilmente non è l'approccio più efficiente, ma utilizzabile se prima è possibile restringere la ricerca con un selettore rilevante.
$("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');
Demo: http://jsfiddle.net/r3yPZ/2/
Questo può anche essere scritto come un selettore. Ecco il mio tentativo novizio:
$.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;
};
Usage:
$('div:hasAttrWithPrefix(data-api-)').css('color', 'red');
Demo: http://jsfiddle.net/SuSpe/3/
Questo selettore dovrebbe funzionare per i pre-1.8 versioni di jQuery. Per 1.8 e oltre, some changes may be required. Ecco un tentativo di una versione 1.8-compliant:
$.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;
};
});
Demo: http://jsfiddle.net/SuSpe/2/
Per una soluzione più generica, ecco un selettore che prende un modello di espressione regolare e seleziona gli elementi con gli attributi che corrispondono a questo schema :
$.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;
};
});
Per esempio, qualcosa come questo dovrebbe funzionare:
$('div:hasAttr(^data-api-.+$)').css('color', 'red');
Demo: http://jsfiddle.net/Jg5qH/1/
Questa domanda può essere utile: [selettore di dati jquery] (http://stackoverflow.com/questions/2891452/jquery-data-selector) – jrummell
Sarà sempre un "data- "attributo? – Ian
@ianpgall più che probabile, sì. Saranno simili fino a un punto (come data-api), quindi il resto del nome dell'attributo potrebbe avere un significato. –