2011-09-14 16 views
5

Sto usando la funzione jQuery load() per caricare alcune pagine nel contenitore. Ecco il codice:jQuery .load() Come impedire il doppio caricamento dal doppio clic

$('div.next a').live('click',function() { 

    $('.content').load('page/3/ #info','',function(){ 
     //do something 
    }); 

return false; 

}); 

Tutto funziona bene, ma il problema è quando ho subito un doppio click sul collegamento div.next, dalla console vedo che carica la pagina due volte perché ho fatto un rapido doppio clic. Potrei anche fare 3 clic e sarà caricarlo 3 volte e mostrare in smth console del genere:

GET http://site/page/3/  200  OK 270ms 
GET http://site/page/3/  200  OK 260ms 

La mia domanda è come impedire ad un doppio clic e di non lasciare che caricare la pagina di destinazione più di una volta no importa quante volte è stato cliccato.

Grazie.

+0

Vuoi che il collegamento sia nuovamente cliccabile una volta caricata la pagina? –

+0

vice versa, voglio essere disabilitato dopo il suo clic e quindi essere attivato quando la pagina viene caricata nel contenitore. – devjs11

risposta

1

Qualunque cosa succedesse al buon vecchio JavaScript? Perché state tutti cercando di capirlo con puro jQuery?

var hasBeenClicked = false; 

$('div.next a').live('click',function() { 

    if(!hasBeenClicked){ 
     hasBeenClicked = true; 
     $('.content').load('page/3/ #info','',function(){ 
      //do something 
      //If you want it clickable AFTER it loads just uncomment the next line 
      //hasBeenClicked = false; 
     }); 
    } 

    return false; 
}); 

Come nota a margine, never never never uso .live(). Usa .delegate invece:

var hasBeenClicked = false; 

$('div.next').delegate('a','click',function() { 

    if(!hasBeenClicked){ 
     hasBeenClicked = true; 
     $('.content').load('page/3/ #info','',function(){ 
      //do something 
      //If you want it clickable AFTER it loads just uncomment the next line 
      //hasBeenClicked = false; 
     }); 
    } 

    return false; 
}); 

Perché? Paul Irish spiega: http://paulirish.com/2010/on-jquery-live/

Per rispondere a un commento ...

Questo potrebbe accadere se avete la vostra funzione di delegato nidificato all'interno della vostra chiamata AJAX (.load(), .get(), ecc). Il div.next deve essere sulla pagina affinché funzioni. Se div.next non è sulla pagina, e questo non è nidificato, solo fare questo:

$('#wrapper').delegate('div.next a','click',function() { 

http://api.jquery.com/delegate/

delegato ha bisogno il selettore di essere il genitore dell'elemento aggiunto in modo dinamico. Quindi, il primo parametro di delegato (div.next a nell'ultimo esempio) è l'elemento da cercare all'interno dell'elemento selezionato (#wrapper). Il wrapper potrebbe anche essere body se non è incluso in alcun elemento.

+0

La tua versione funziona come un fascino ma solo con .live(). Il .delegate non riconosce i collegamenti dalla pagina caricata nel mio caso. Qualche idea per quale motivo dovrebbe succedere? – devjs11

+0

Aggiornato la mia risposta, guarda in fondo –

+0

Se ciò non aiuta ancora con il delegato posso vedere il resto del codice? –

1

Si potrebbe sciogliere la manifestazione click con die():

$(this).die('click').click(function() { return False; }); 

Oppure si potrebbe dare l'elemento di una classe .clicked una volta che si fa clic:

$(this).addClass('clicked'); 

e verificare se quella classe esiste durante l'esecuzione il vostro logica:

$('div.next a').live('click',function() { 
    if (!$(this).is('.clicked')) { 
     $(this).addClass('clicked'); 

     $('.content').load('page/3/ #info','',function(){ 
      //do something 
     }); 
    } 

    return false; 
}); 
+0

Se uso a: not (.clicked) funziona se clicco una volta ma se eseguo doppio clic salterà alla pagina/3/e non caricherò la pagina nel contenitore come se fosse un normale URL. Qualche idea del perché? – devjs11

+0

Whoops, ho dimenticato il 'return false'. Controlla il codice aggiornato. – Blender

+0

Che continua a passare alla pagina se cliccato rapidamente due volte ... Un clic funziona bene. Strano. – devjs11

1

You co Vorrei provare ad usare il metodo jquery uno:

$("a.button").one("click", function() { 
     $('.content').load('page/3/ #info','',function(){ 
       //do something 
     }); 
}); 
+0

Ho provato questo metodo prima, ma ripete ancora il caricamento su doppio e triplo clic – devjs11

+0

+1: non sapevo di questa funzione! Ma come impedisci che l'elemento 'a' salti in cima alla pagina quando fai clic di nuovo? – Blender

+0

Hmm .. per i documenti jquery, non dovrebbe farlo (ripetere la logica della funzione sui clic successivi). Buon punto w/la pagina salta indietro. Lascia che ti dia un pensiero. – SBerg413

1

Memorizza se stai aspettando il caricamento in una variabile.

(function() { 
    var waitingToLoad = false; 
    $('div.next a').live('click',function() { 

    if (!waitingToLoad) { 
     waitingToLoad = true; 
     $('.content').load('page/3/ #info','',function(){ 
      waitingToLoad = false; 
      //do something 
     }); 
    } 
    return false; 
    }); 

})() 
Problemi correlati