Come memorizzare le variabili locali in jQuery funzioni di clic?

Sto cercando di capire come archivio esterno di valori di variabili nelle funzioni creato durante jQuery evento click (). Ecco un esempio di codice con cui sto lavorando ora.

for(var i=0; i<3; i++){
    $('#tmpid'+i).click(function(){
        var gid = i;
        alert(gid);
    });
}

<div id="tmpid0">1al</div>
<div id="tmpid1">asd</div>
<div id="tmpid2">qwe</div>

Così quello che succede è che gli eventi sono allegando correttamente, ma il valore di ‘gid’ è sempre l’ultimo valore incrementato dell ‘”io”. Io non sono sicuro di come impostare la variabile privata in questa situazione.

InformationsquelleAutor Geuis | 2009-09-28

 

5 Replies
  1. 23

    Potete creare una chiusura e assegnare i a una variabile locale della chiusura. Il gid variabile verrà quindi assegnato il valore di i al punto che la chiusura è stata creata piuttosto che quando si esegue la funzione.

    for(var i=0; i<3; i++){
        (function() {
            var gid = i;
            $('#tmpid'+i).click(function(){
                alert(gid);
            });
        })();
    }
    • Questo ha funzionato per me. Un uso interessante di una funzione anonima.
    • È? Io sono abbastanza nuovo di Javascript, ma il mio Greasemonkey script di avere un bel paio di JQuery loop e questo sembrava un modo naturale per gestire le funzioni
    • Grazie. Ho visto questo modello, prima volta che ho effettivamente eseguito, in quanto utile è.
    • Fantastico!!! Thx a lot
  2. 2
    for(var i=0; i<3; i++){
        $('#tmpid'+i).click((function(gid){
            return function(){
                 alert(gid);
            }
        })(i));
    }

    ci sono molti modi per farlo, questo funziona e sembra facile.

    modifica

    un altro modo:

    for(var i=0; i<3; i++){
        $('#tmpid'+i).click([i],function(e){
            alert(e.data[0]);
        });
  3. 1

    Hai creato una chiusura, in cui la variabile “i” è condiviso tra più clicca gestori.

    Dal momento che Javascript non hanno blocco di ambito, è necessario passare “i” per una nuova funzione, in modo che è copiato-da-valore a una nuova istanza:

    function bindStuff(i) {
        $('#tmpid'+i).click(function(e){
                        var gid = i;
                        alert(gid);
                });
    }
    
    for(var i=0; i<3; i++){ bindStuff(i); }

    Ecco un’altra domanda simile:
    JavaScript chiusura all’interno di cicli – semplice esempio pratico

    • Per qualche ragione, non faccio questo lavoro per me. Ho ancora il problema originale.
    • OMG, ho davvero frainteso Javascript ambito. Non hanno blocco di scoping. Ho modificato la mia risposta, ma si può sicuramente utilizzare i dati() metodo – è un modo migliore per passare i dati.
  4. 1

    In alternativa, il primo argomento di clic (o bind) per jQuery è un oggetto che viene allegata all’evento come dati.

    for(var i=0; i<3; i++){
        $('#tmpid'+i).click({gid : i}, function(e) {
            alert(e.data.gid);
        });
    }

    Trovo che questo sia un po ‘ più leggibile di una chiusura a soluzione, ma si tratta di gusto.

  5. 0

    Ho letto il backup di jQuery dati nativi() metodo. Ho implementato questo e funziona così. La sua nascondere alcune delle funzionalità effettiva di come le chiusure sono in corso di trattazione, ma la sua semplice e abbastanza pulito a implementare.

Lascia un commento