2011-09-14 4 views
5

J'utilise la fonction jQuery load() pour charger certaines pages dans un conteneur. Voici le code:jQuery .load() Comment éviter le double chargement en double-cliquant

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

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

return false; 

}); 

Tout fonctionne très bien, mais le problème est quand je rapidement double cliquer sur le lien div.next, de la console, je vois qu'il charge la page deux fois parce que je l'ai fait un double clic rapide. Je pourrais même en faire 3 clics et il va charger 3 fois et montrer à smth console comme ça:

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

Ma question est de savoir comment éviter ce double clic et de ne pas laisser charger la page cible plus d'une fois pas importe combien de fois il a été cliqué.

Merci.

+0

Voulez-vous que le lien soit de nouveau cliquable une fois la page chargée? –

+0

vice versa, je veux être désactivé après son cliqué, puis être activé lorsque la page est chargée dans le conteneur. – devjs11

Répondre

1

Qu'est-il arrivé au bon vieux JavaScript? Pourquoi essaies-tu tous de le comprendre avec du jQuery pur?

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; 
}); 

Comme une note de côté, never never never utilisation .live(). Utilisez .delegate à la place comme:

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; 
}); 

Pourquoi? Paul Irish explique: http://paulirish.com/2010/on-jquery-live/

Pour répondre à votre commentaire ...

Cela pourrait se produire si vous avez votre fonction de délégué imbriqué dans l'appel AJAX (.load(), .get(), etc.). Le div.next doit être sur la page pour que cela fonctionne. Si div.next est pas sur la page, et ce n'est pas imbriqué, faites ceci:

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

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

délégué a besoin du sélecteur pour être le parent de l'élément dynamique ajouté. Ensuite, le premier paramètre du délégué (div.next a dans le dernier exemple) est l'élément à rechercher dans l'élément sélectionné (#wrapper). L'enveloppe peut également être body si elle n'est pas enveloppée dans un élément.

+0

Votre version fonctionne comme un charme, mais seulement avec .live(). Le .delegate ne reconnaît pas les liens de la page chargée dans mon cas. Une idée pourquoi cela arriverait-il? – devjs11

+0

Mis à jour ma réponse, regardez en bas –

+0

Si cela ne aide toujours pas avec délégué, puis-je voir le reste de votre code? –

1

Vous pouvez délie l'événement click avec die():

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

Ou vous pourriez donner à l'élément une classe .clicked une fois qu'il est cliqué:

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

Et vérifier si cette classe existe lors de l'exécution de votre logique:

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

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

    return false; 
}); 
+0

Si j'utilise un: not (.clicked) cela fonctionne si je clique une fois mais si j'effectue un double-clic il passera juste à la page/3/et ne chargera pas la page dans le conteneur agissant comme une URL normale. Une idée pourquoi? – devjs11

+0

Oups, a oublié le 'return false'. Vérifiez le code mis à jour. – Blender

+0

Cela continue à passer à la page si vous cliquez rapidement deux fois ... Un clic fonctionne très bien. Bizarre. – devjs11

1

Vous co uld essayer d'utiliser la méthode jquery une:

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

J'ai essayé cette méthode auparavant mais elle répète encore le chargement en double et triple clic – devjs11

+0

+1: Je ne connaissais pas cette fonction! Mais comment empêcher l'élément 'a' de sauter en haut de la page lorsqu'on clique à nouveau dessus? – Blender

+0

Hmm .. par les docs de jquery, il ne devrait pas faire cela (répéter la logique de la fonction sur les clics suivants). Bon point w/la page sautant vers le haut. Laissez-moi y réfléchir. – SBerg413

1

Enregistrez si vous attendez le chargement d'une variable.

(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; 
    }); 

})()