Domanda

Supponi di avere 4 elementi div con classe .navlink , che, quando viene cliccato, usa .data () per impostare una chiave chiamata 'selected' , ad un valore di true :

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

Ogni volta che si fa clic su un nuovo .navlink , vorrei memorizzare il navlink precedentemente selezionato per successive manipolazioni. Esiste un modo rapido e semplice per selezionare un elemento in base a ciò che è stato memorizzato utilizzando .data () ?

Sembra che non ci siano jQuery : filtri adatti al conto e ho provato quanto segue (all'interno dello stesso evento clic), 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ù solo curioso di sapere se può essere fatto tramite .data () .

È stato utile?

Soluzione

il tuo filtro funzionerebbe, ma devi restituire true sugli oggetti corrispondenti nella funzione passata al filtro affinché possa afferrarli.

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

Altri suggerimenti

Solo per la cronaca, puoi filtrare i dati con jquery (questa domanda è piuttosto vecchia e jQuery si è evoluta da allora, quindi è giusto scrivere anche questa soluzione):

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

o, meglio (per prestazioni):

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

oppure, se si desidera ottenere tutti gli elementi con dati selezionati impostati:

$('[data-selected]')

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

Possiamo creare un plugin abbastanza facilmente:

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

Utilizzo (controllo di un pulsante di opzione):

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

Due cose che ho notato (potrebbero essere errori da quando l'hai scritto).

  1. Hai perso un punto nel primo esempio ( $ ('. navlink'). fai clic su )
  2. Perché il filtro funzioni, devi restituire un valore ( return $ (this) .data (" selezionato ") == vero )

Sembra più lavoro di quanto valga la pena.

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top