2013-04-07 1 views
8

Ho provato a creare un ciclo con un for e un incremento di un evento onclick, ma non funziona.onClick evento in un ciclo For

Una parte di js:

var gameCase = ['', '', '', '', '', '', '', '', ''], // 9 
    itemLists = $('game').getElementsByTagName('li'); // 9 items 

    for(var i = 0; i < itemLists.length; i++) { 
     // i already egal to 9 
     itemLists[i].onclick = function() { 
       // do something 
     } 
    } 

Ma in questo caso, il ciclo For è già finito prima ero in grado di fare clic su un elemento della lista.

Inoltre, vorrei ottenere l'elenco di elementi su cui ho fatto clic e salvarlo su un array. Ho provato un gameCase [questo] (nella funzione onclick), ma non so se è il modo giusto.

+0

Cosa è '$ ('gioco'). GetElementsByTagName ('li');', Si utilizza jQuery o javascript puro qui? – Eli

+0

@ user1479606 JavaScript puro, ho appena creato il mio selettore. – jbr

risposta

15

John Resig tratta questo argomento molto bene in "Secrets of the Ninja JavaScript" (http://ejohn.org/apps/learn/#59)

Avrai bisogno di creare un ambito temporaneo per preservare il valore dei

for (var i = 0; i < itemLists.length; i++) (function(i){ 
    itemLists[i].onclick = function() { 
     // do something 
    } 
})(i); 

Edit:

var gameCase = ['', '', '', '', '', '', '', '', ''], // 9 
$listParent = $('game').find('ul'), // li's parent 
itemLists = $('game').getElementsByTagName('li'); // 9 items 

var listHandler = (function() { 
    var i = 0; 

    return function() { 
    // $(this) will in here refer to the clicked li 
    i++ // increment i 

    if (i === 9) { 
     $listParent.off('click', 'li', listHandler); //remove eventhandler when i reaches 9 
    } 
    } 
}()); 

$listParent.on('click', 'li', listHandler); // attach eventhandler to ul element 

Questo dovrebbe fare quello che vuoi, non posso provarlo subito visto che sono al lavoro.

+0

Come dice @Tim van Elsloo, è il modo giusto. Ma c'è solo qualcosa di strano, quando console.log il valore di i prima di fare clic su qualsiasi elemento della mia lista, il valore i diminuisce. 'for (var i = 0; i jbr

+0

La proprietà length inizia da 1 e il tuo i var da 0. Quindi avresti o per cambiare il ciclo for per iniziare da 1 e terminare su length + 1 o modificare all'interno della funzione su itemLists [i + 1]. – ruuska

+0

Sì, lo so, non è questo il problema. L'interesse del Loop, è quando sono egale a 9, non posso fare altro. Ma proprio qui, il ciclo For è già finito, prima di fare clic su un elemento. Vorrei, quando clicco su un elemento della mia lista, incremento, e quando arrivo a 9, il ciclo si interrompe. – jbr

2

avvolgere il vostro ascoltatore:

onclick = (function(i) {return function() { 
    ... 
};})(i); 

Questo risolve i vostri problemi di portata variabile.

+0

Questo è abbastanza buono, quando ho cliccato su un elemento della lista, restituisce il buon numero del caso. Ma va bene, che l'incremento del ciclo For prima di iniziare a fare clic? – jbr

1

Scusa se non ho capito correttamente la tua domanda, Dal codice capisco che stai provando ad aggiungere un gestore onclick a tutti gli elementi della lista trovati nel tag del gioco (forse dovrebbe essere una classe/id).

Il ciclo for verrà eseguito quando il tag/file script viene caricato senza alcuna interazione dell'utente.

Se si desidera assegnare una funzione che utilizza il valore corrente del contatore. Utilizzare il seguente codice:

itemLists[i].onclick = (function() { 
    return function() { 
     // TODO --- 
     // Your handler code here 
} 
})();