2011-03-25 27 views
5

Estoy tratando de retrasar la acción predeterminada de hacer clic en un enlace, hasta que el usuario haga clic en "sí" o "no" para confirmar. El problema es que el bucle while es la congelación del navegador (y ni siquiera mostrar el cuadro de diálogo, a pesar de que "abierto" se llama en primer lugar):JavaScript "while" loop sin navegador de congelación?

$(".remove").click(function() { 
    $("#dialog").dialog("open"); 

    while (1) { 
    // Count sheep 
    } 
}); 

Obviamente, el "1" es allí sólo para propósitos de prueba. Eventualmente quiero que verifique una variable establecida por el diálogo. Sin embargo, por ahora, quiero saber cómo puedo usar un bucle como este para retrasar la acción de clic predeterminada.

Gracias,

Michael

Respuesta

4

No se puede. Debe salir de la función para que se muestre el diálogo. El navegador no realizará ninguna actualización en tanto se ejecute la función.

Tienes que usar eventos para manejar la entrada del usuario.

1

Usted tendrá que añadir una línea para evitar la acción predeterminada del evento click suceda.

$(".remove").click(function(event) { 
    event.preventDefault(); 
    $("#dialog").dialog("open"); 

    .... 
}); 
+0

No quiero desechar el evento. Solo quiero retrasarlo. Esperaba que hubiera una manera directa que no implique reconstruir el enlace y redirigir al usuario (el destino depende del enlace en el que hizo clic el visitante). – Michael

4

Una respuesta muy simple es utilizar window.setInterval en lugar de un bucle while, pero que todavía no es una buena respuesta.

La respuesta correcta es que su cuadro de diálogo tenga una devolución de llamada cuando el usuario haga clic en el botón. EDIT: ya que estás usando jQuery, usted no tiene que escribir las cosas de devolución de llamada La función de diálogo toma un segundo parámetro de devolución de llamada:.

$("#dialog").dialog("open", function() { 
    // do your stuff for when they click OK 
}); 
3

Usted puede utilizar el tiempo de espera y una devolución de llamada para este

setTimeout(FunctionHere, 3000); 

Editar: También creo que vale la pena señalar que hay una función de jQuery .delay() en caso de que todos quieran encadenar eso en algo.

+1

es mejor usar 'setTimeout (FunctionHere, 3000);' –

+0

Es bueno saberlo, ¿te importa si pregunto el motivo? No dudo que sea exacto, solo me gustaría saber por qué. No paso mucho tiempo en javascript. – sclarson

+0

Parece que ambos escribieron lo mismo .. – Michael

1

puntos rápidos:

  1. bucle "while" se hace estableciendo temporizador o devoluciones de llamada de intervalo
  2. mejor aún, en su lugar puede unirse a un evento en el botón o en forma de clics para probar lo que acaba de ocurrir.
  3. mejor, parece que está utilizando la interfaz de usuario de jQuery, puede configurar una función para llamar cuando se hace clic en el botón de diálogo.

    $('form').dialog({ 
        autoOpen: true, 
        buttons: { 
         "Yes": onRequestSubmit, // function defined elsewhere 
         "No": function() { $(this).dialog("close"); } // function defined here 
        }, 
        modal: true 
    }); 
    
1

Persiste una GRAN pregunta ... ¿por qué no verifica el valor de la variable cada vez que se cambia?

He utilizado setTimeout() para retrasar un bucle para verificar que el servidor realice pseudo-server-push (lo que significa que el navegador envía una solicitud al servidor). Incluso a intervalos de 10 segundos, consumía demasiados recursos de la CPU y ralentizaba considerablemente la respuesta del navegador (especialmente para las máquinas de taller baratas).

Tiene que cambiar su paradigma de pensamiento lejos de la programación impulsada por eventos .NET de escritorio cuando se trata de javascript. Un bucle persistente no es bueno para el rendimiento.

Hay dos opciones:

El diseño de su flujo de proceso de aplicación de tal manera que ya sabe en qué parte del código se podría cambiar esa variable y comprobar si se cambia la variable cada vez que alguno de esos puntos en código ha ejecutado . Lo sé, esto parece incomprensiblemente tedioso si vienes de C#, C o C++.

Sin embargo, creo que la mejor opción es crear un elemento de formulario HTML de entrada de texto oculto.

<FORM NAME='dingoSam'> 
<INPUT TYPE='hidden' onChange='changed()' NAME='bingoSem'/> 
</FORM> 

Toda mi código que necesitaba compartir un semáforo haría referencia dingoSam.bingoSem para cambiar su valor.

Debe explotar el sistema de gestión de eventos del navegador en lugar de crear su propio bucle de eventos porque el tiempo de ejecución de javascript explota su colaboración con los procesos del sistema operativo para optimizar sus controladores de eventos. Mientras que su propio bucle de eventos escrito en JavaScript está lejos de estar en una colaboración óptima con los procesos del sistema operativo.

+0

http://www.w3schools.com/js/js_events.asp –