2009-06-17 16 views
103

Say Ho 4 elementi div con class .navlink, che, quando cliccato, utilizzare .data() per impostare una chiave denominata 'selected', ad un valore di true:elemento filtro basato su .data()/valore

$('.navlink')click(function() { $(this).data('selected', true); }) 

Ogni volta che si fa clic su un nuovo .navlink, desidero memorizzare lo navlink selezionato in precedenza per la successiva manipolazione. C'è un modo semplice e veloce per selezionare un elemento in base a ciò che è stato memorizzato utilizzando .data()?

Non sembrano essere qualsiasi jQuery : filtri che misura la fattura, e ho provato la seguente (all'interno dello stesso evento click), ma per qualche motivo non funziona:

var $previous = $('.navlink').filter( 
    function() { $(this).data("selected") == true } 
); 

So che ci sono altri modi per farlo, ma in questo momento sono per lo più curioso di sapere se è possibile farlo tramite .data().

risposta

167

il filtro avrebbe funzionato, ma è necessario tornare true sugli oggetti corrispondenti nella funzione passata al filtro per poterli afferrare.

var $previous = $('.navlink').filter(function() { 
    return $(this).data("selected") == true 
}); 
+16

è triste non c'è un modo più breve per questo. troppo disordinato. – vsync

+4

Si prega di notare che questo non è più l'unico modo per farlo, StefanoP ha fornito alternative –

+2

@NathanKoop, non del tutto. Vedi il mio commento sulla sua risposta. –

-1

Sembra più lavoro che il suo valore.

1) Perché non solo una singola variabile JavaScript che memorizza un riferimento all'elemento \ jQuery oggetto attualmente selezionato.

2) Perché non aggiungere una classe all'elemento attualmente selezionato. Quindi puoi interrogare il DOM per la classe ".active" o qualcosa del genere.

+0

Sì, ma come ho detto, sapevo che c'erano altri modi per realizzarlo. Ero solo bloccato sul fatto che potesse essere filtrato tramite data(), e perché filter() non funzionava per me. Grazie però. – user113716

+0

Siamo spiacenti. Ho perso quella parte della tua domanda. –

8

Due cose che ho notato (potrebbero essere errori da quando lo hai scritto però).

  1. ti sei perso un punto nel primo esempio ($('.navlink').click)
  2. Per filtri a lavorare, è necessario restituire un valore (return $(this).data("selected")==true)
116

Solo per la cronaca, è possibile filtro sui dati con jQuery (questa domanda è abbastanza vecchio, e jQuery si è evoluta da allora, quindi è diritto di scrivere questa soluzione così):

$('.navlink[data-selected="true"]'); 

o meglio (per le prestazioni):

$('.navlink').filter('[data-selected="true"]'); 

o, se si desidera ottenere tutti gli elementi con data-selected set:

$('[data-selected]') 

Nota che questo metodo funziona solo con dati che sono stati impostati tramite HTML-attributi. Se imposti o modifichi i dati con la chiamata .data(), questo metodo non funzionerà più.

+9

se il voto basso per questa risposta ti spaventa - è la risposta accettata con 100+ voti per una domanda praticamente identica http://stackoverflow.com/questions/4146502 –

+40

-1 Questo non funziona quando i dati sono impostati con il metodo '.data()' invece di un attributo 'data-'. Vedi questo violino: http://jsfiddle.net/bryandowning/tySWC/ - Inoltre, il metodo '.find()' cerca i figli del selettore precedente. Nell'esempio fornito, 'data-selected' è un attributo di' .navlink', non un figlio di '.navlink'. Inoltre, '$ ('div p')' e '$ ('div'). Find ('p')' sono essenzialmente equivalenti. L'uso di '.find()' sembra che potrebbe essere più lento a causa della chiamata alla funzione extra (anche se non ne sono sicuro). Per favore correggimi se ho torto su tutto ciò (vorrei davvero che questo metodo funzionasse). –

+3

un paio di cose: 1) hai ragione che questo non funziona se imposti i dati con '.data()', dal momento che jQuery cerca nel DOM, l'ho postato per quelli (come me) che sono arrivati ​​a questo domanda per altri motivi; 2) corretto, '.find()' cerca tra i bambini, quindi è sbagliato in questo esempio; 3) hai torto, non sono equivalenti, come ricerche jQuery da destra a sinistra, vedi http://jonraasch.com/blog/10-advanced-jquery-performance-tuning-tips-from-paul-irish – StefanoP

12

Possiamo fare una funzione abbastanza facilmente:

$.fn.filterData = function(key, value) { 
    return this.filter(function() { 
     return $(this).data(key) == value; 
    }); 
}; 

Usage (controllo di un pulsante di opzione):

$('input[name=location_id]').filterData('my-data','data-val').prop('checked',true);