2012-03-03 16 views
14

Estoy tratando de apuntar a los nombres de los atributos que contienen una palabra determinada & que no está en el tipo de manera que estás pensando.El nombre del atributo jQuery contiene

Digamos que tengo:

<div data-foo-bar="hello"></div> 

¿Cómo se orienta elementos que tienen 'data-foo' en el nombre del atributo?

+0

Se puede usar un selector de jQuery encargo: http://stackoverflow.com/a/26657510/1414562 –

Respuesta

12

No creo que usted puede apuntar nombres de los atributos de la misma manera a apuntar los valores de atributo. Puede, sin embargo, utilizar .filter() para hacer esto un poco eficiente:

$('div').filter(function() { 
    for (var property in $(this).data()) { 
    if (property.indexOf('fooBar') == 0) { 
     return true; 
    } 
    } 

    return false; 
});​ 

en cuenta que data-foo-bar ha sido convertido en fooBar.

Demostración: http://jsfiddle.net/Tyj49/3/

+0

referencia para "selectores de atributos" http://api.jquery.com/category/selectors/ – charlietfl

+3

Estoy muy familiarizado con jQuery. Esos selectores coinciden con el * valor * de un atributo dado, no con el nombre del atributo. – Blender

+0

Este parece mejor. Y si quiere almacenar en caché los objetos filtrados para más adelante, puede hacerlo así: http://jsfiddle.net/Tyj49/4/ Aunque voy a adivinar que volver a imaginar el enfoque es probablemente mejor a la larga. (Difícil de decir sin conocer el caso de uso), esto obtiene un voto seguro. –

-5

intentar algo como esto

var element = $('div[data-foo-bar=hello]')​; 
+0

no está seguro de por qué esto que pisoteó con votedowns, que parece ser más simple concepto válido hasta ahora http: // jsFiddle .net/wHuV2/ – charlietfl

+0

El OP intenta hacer coincidir el atributo * name *, no el valor real. La pregunta fue algo ambigua. – Blender

+0

entendió sobre el valor, pero el atributo es mucho más simple que los filtros de 4 líneas – charlietfl

4

no estoy seguro de que puede hacer eso. He echado un vistazo a la API y parece que solo puedes realizar una coincidencia parcial más profunda en el valor, no el nombre del atributo en sí.

Voy a darles el consejo potencialmente frustrante de "no hagas esto". ;-) En esencia, lo que buscas es un montón de divs que coincidan con una categoría más general. No solo data-foo-bar s, sino TODOS data-foo s! ¿Por qué no simplemente le das a todos los datos-foos un nombre de clase que puedes seleccionar, o un atributo separado como data-foo="true"?

En otras palabras, en lugar de apegarme estrictamente a la pregunta formulada, me gustaría saber cuál es el caso de uso para que tal vez un movimiento lateral en el pensamiento pueda resolver su problema con la misma eficacia. Muchas formas de despellejar a un gato y todo eso.

+0

Bueno, mi alternativa habría sido tener 2 atributos de datos. Pero pensé que si hay una voluntad, hay una manera, entonces Stackoverflow vino a mi mente. :) – daryl

+0

puede escribir este $ ('[data-foo-bar]') funcionará – charlietfl

+0

Lo suficientemente, Brogrammer. ;-) –

0

probar este

$().ready(function() { 
    var test=$('#div_test').data("foo-bar"); 
    alert(test); 
}); 

HTML:

<div data-foo-bar="hello" id="div_test"></div> 
+0

Por Dios parece que funciona. Puede valer la pena poner en algunas pruebas de contraejemplo para ver si es frágil o no, pero aquí está en acción: http://jsfiddle.net/YkTJy/ –

+0

Gracias @GregPettit – pkachhia

+0

Loco. Casi bajé la votación hasta que vi su comentario @GregPettit. Eso me enseñará a sacar conclusiones precipitadas. – daryl

1

Esto es sólo una solución alternativa. Si puede asegurarse el nombre del atributo que está buscando no está presente en el texto elemento, lo que podría hacer es conseguir que el valor outerHTML del elemento y luego hacer una búsqueda de subcadena:

$("elementsToCheck").each(function() { 
    var elemHtml = $('<div>').append($(this).clone()).html(); //clone to get the outerHTML 
    if (elemHtml.indexOf("attributeName") >= 0) { 
     // current element contains the attribute with name "attributeName" 
    } 
}); 

Esperanza esto ayuda.

0

Utilice .data() para obtener todos los atributos de datos de un elemento y luego use .filter para obtener los elementos que tienen atributos data-validation*.

var validated_elements = $("p").filter(function() { 
    var found = false; 
    $.each($(this).data(function(key) { 
     if (key.match(/^data-validation/)) { 
      found = true; 
      return false; 
     } 
    } 
    return found; 
}); 
Cuestiones relacionadas