2012-03-03 19 views
14

Sto provando a scegliere come target nomi di attributi che contengono una determinata parola & non nel modo in cui stai pensando.Il nome dell'attributo jQuery contiene

Diciamo che ho:

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

Come posso indirizzare gli elementi che hanno 'data-foo' nel nome dell'attributo?

+0

Si potrebbe utilizzare una consuetudine selettore jQuery: http://stackoverflow.com/a/26657510/1414562 –

risposta

12

Non credo che è possibile indirizzare i nomi degli attributi allo stesso modo come bersaglio i valori degli attributi. È possibile, tuttavia, utilizzare .filter() per fare questo un po 'in modo efficiente:

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

    return false; 
});​ 

noti che data-foo-bar è stato convertito a fooBar.

Demo: http://jsfiddle.net/Tyj49/3/

+0

riferimento per "selettori di attributo" http://api.jquery.com/category/selectors/ – charlietfl

+3

Conosco bene jQuery. Questi selettori corrispondono al * valore * di un determinato attributo, non al nome dell'attributo. – Blender

+0

Questo sembra meglio. E se vuoi semplicemente mettere in cache gli oggetti filtrati per dopo, puoi farlo in questo modo: http://jsfiddle.net/Tyj49/4/ Mentre intendo dire che ripensare l'approccio è probabilmente meglio a lungo andare (difficile da dire senza conoscere il caso d'uso), questo ottiene sicuramente un voto. –

-5

provare qualcosa di simile

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

non so perché questo ha calpestato con votedowns, sembra più semplice valido concetto finora http: // jsfiddle .net/wHuV2/ – charlietfl

+0

L'OP sta cercando di far corrispondere l'attributo * nome *, non il valore effettivo. La domanda era piuttosto ambigua. – Blender

+0

inteso sul valore ma l'attributo è molto più semplice dei filtri a 4 righe – charlietfl

4

io non sono sicuro che si può fare. Ho dato un'occhiata all'API e sembra che tu sia in grado di eseguire una corrispondenza parziale più profonda sul valore, non sul nome dell'attributo stesso.

Ho intenzione di darti il ​​consiglio potenzialmente frustrante di "non farlo". ;-) In sostanza, quello che cerchi è un gruppo di div che corrisponde a una categoria più generale. Non solo data-foo-bar s, ma TUTTI i data-foo s! Perché non dare a tutti i dati-foos un nome di classe da cui è possibile selezionare o un attributo separato come data-foo="true"?

In altre parole, piuttosto che attenersi rigorosamente alla domanda come richiesta, sarei curioso di sapere qual è il caso d'uso in modo che forse una mossa laterale nel pensare possa risolvere il problema altrettanto efficacemente. Molti modi per pelle un gatto e tutto il resto.

+0

Bene, la mia alternativa sarebbe stata avere 2 attributi di dati. Ma ho pensato che se c'è una volontà c'è un modo, mi è venuto in mente lo stackoverflow. :) – daryl

+0

potresti scrivere $ ('[data-foo-bar]') funzionerà – charlietfl

+0

Abbastanza buono, Brogrammer. ;-) –

0

Prova questa

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

HTML:

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

Di golly sembra funzionare. Potrebbe essere utile inserire alcuni test di contro-esempio per vedere se è fragile o no, ma qui è in azione: http://jsfiddle.net/YkTJy/ –

+0

Grazie a @GregPettit – pkachhia

+0

Pazzesco. Ho quasi svalutato fino a quando ho visto il tuo commento @GregPettit. Questo mi insegnerà a saltare alle conclusioni. – daryl

1

Questa è solo una soluzione alternativa. Se è possibile garantire il nome dell'attributo che stai cercando non è presente nel testo elemento, quello che si potrebbe fare è ottenere il valore outerHTML dell'elemento e poi fare una ricerca stringa:

$("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" 
    } 
}); 

Speranza questo aiuta.

0

Utilizzare .data() per ottenere tutti gli attributi dei dati di un elemento e quindi utilizzare .filter per ottenere gli elementi che hanno gli attributi 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; 
}); 
Problemi correlati