Esto utiliza .filter()
para limitar los candidatos a los que tiene data-api-*
atributos. Probablemente no sea el enfoque más eficiente, pero se puede utilizar si primero puede limitar la búsqueda con un selector relevante.
$("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');
Demostración: http://jsfiddle.net/r3yPZ/2/
Esto también se puede escribir como un selector. Aquí está mi intento de novato:
$.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;
};
Uso:
$('div:hasAttrWithPrefix(data-api-)').css('color', 'red');
Demostración: http://jsfiddle.net/SuSpe/3/
Este selector debe trabajar para pre-versiones de jQuery 1.8. Para 1.8 y más allá, some changes may be required. He aquí un intento de una versión 1.8 compatible con:
$.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;
};
});
Demostración: http://jsfiddle.net/SuSpe/2/
Para una solución más genérica, aquí hay un selector que tiene un patrón de expresión y selecciona los elementos con atributos que coincidan con ese patrón :
$.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;
};
});
Para su ejemplo, algo como esto debería funcionar:
$('div:hasAttr(^data-api-.+$)').css('color', 'red');
Demostración: http://jsfiddle.net/Jg5qH/1/
Esta pregunta puede ser útil: [selector de datos jQuery] (http://stackoverflow.com/questions/2891452/jquery-data-selector) – jrummell
Será siempre un "Data- "atributo? – Ian
@ianpgall es más que probable, sí. Serán similares hasta cierto punto (como data-api), entonces el resto del nombre del atributo podría tener significado. –