2011-09-14 31 views
5

Estoy utilizando la función jQuery load() para cargar algunas páginas en el contenedor. Aquí está el código:jQuery .load() Cómo evitar la doble carga al hacer doble clic en

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

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

return false; 

}); 

Todo funciona muy bien, pero el problema es cuando rápidamente doble clic sobre el enlace div.next, desde la consola veo que carga la página dos veces porque hice una rápida doble clic. Incluso podría poner el partido 3 clics y lo cargará 3 veces y mostrar en Smth consola así:

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

Mi pregunta es cómo prevenir tales doble clic y no dejar que cargue la página de destino más de una vez sin importa cuántas veces se hizo clic.

Gracias.

+0

¿Desea volver a hacer clic en el enlace una vez que se carga la página? –

+0

viceversa, quiero que se deshabilite después de hacer clic y luego se activará cuando la página se cargue en el contenedor. – devjs11

Respuesta

1

¿Qué pasó con good ol 'JavaScript? ¿Por qué todos intentan descubrirlo con jQuery puro?

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

Como nota al margen, nunca nunca nunca.live() uso. Utilice .delegate en su lugar como:

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

¿Por qué? Paul irlandesa explica: http://paulirish.com/2010/on-jquery-live/

para responder a su comentario ...

Esto podría suceder si usted tiene su función delegada anidado dentro de su llamada AJAX (.load(), .get(), etc). El div.next tiene que estar en la página para que esto funcione. Si no es div.next en la página, y esto no está anidado, simplemente hacer esto:

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

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

Delegado necesita el selector de ser el padre del elemento añadido de forma dinámica. Entonces, el primer parámetro de delegado (div.next a en el último ejemplo) es el elemento a buscar dentro del elemento seleccionado (#wrapper). El contenedor también podría ser body si no está envuelto en ningún elemento.

+0

Tu versión funciona como un encanto, pero solo con .live(). El .delegate no reconoce los enlaces de la página cargada en mi caso. ¿Alguna idea de por qué sucedería eso? – devjs11

+0

Actualizado mi respuesta, mira en la parte inferior –

+0

Si eso todavía no ayuda con el delegado ¿puedo ver el resto de tu código? –

1

Se puede desenlazar el caso click con die():

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

O bien, podría dar al elemento una clase .clicked una vez que se hace clic en:

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

Y comprobar si existe esa clase al realizar su lógica:

$('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 uso a: not (.clicked) funciona si hago clic una vez, pero si hago doble clic saltará a la página/3/y no cargaré la página en un contenedor que actúa como una url normal. ¿Alguna idea de por qué? – devjs11

+0

Whoops, se olvidó del 'return false'. Verifica el código actualizado. – Blender

+0

Eso sigue pasando a la página si se hace clic dos veces rápidamente ... Un clic funciona bien. Extraño. – devjs11

1

Usted co uld intente utilizar el método jquery one:

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

Probé este método antes, pero aún repite la carga al hacer doble y triple clic en – devjs11

+0

+1: ¡No sabía acerca de esta función! Pero, ¿cómo se evita que el elemento 'a' salte a la parte superior de la página cuando se vuelve a hacer clic? – Blender

+0

Hmm ... según los documentos de jquery, no debería hacer eso (repita la lógica de la función en los clics siguientes). Buen punto con la página saltando hacia atrás. Déjame pensar eso. – SBerg413

1

Almacene si está esperando la carga en una 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; 
    }); 

})() 
Cuestiones relacionadas