2009-01-11 18 views
9

Necesito usar un aviso personalizado, como el que se muestra en este jQuery plugin demo. El problema es que todas las solicitudes personalizadas dependen de una devolución de llamada, están sincronizadas, necesito que sean síncronas.Aviso personalizado síncrono de JavaScript

tengo que hacer algo como:

alert("Your name is " + myPrompt("What's your name?")); 

Dónde myPrompt es un mensaje personalizado sincrónica modal.

¿Es posible?

Gracias, Naimi

Respuesta

3

Puede utilizar jQuery UI de diálogo para mostrar un DIV como un cuadro de diálogo modal.

Ver http://docs.jquery.com/UI/Dialog/dialog#options

Sin embargo para apoyar un diálogo verdaderamente síncrona (una función de llamada de bloqueo) que se necesita un poco de ayuda del navegador. No todos los navegadores lo admiten. IE lo ha hecho durante muchos años y recientemente, mozilla ha agregado showModalDialog a Firefox.

¿Ha considerado utilizar un cierre para proporcionar continuación en la devolución de llamada?

Ejemplo

function dosomethingwhichneedsprompt() 
{ 
    var a = "stuff"; 
    var o = {} 
    //other code 
    displayPrompt("PleaseInputStuff",o) //o modified by prompt would like this to block 
    //continue to use data on o and the variable a after prompt dismissed. 
} 

Desde displayPrompt no puede bloquear realiable en todos los navegadores, los marcos de las devoluciones de llamada utilizará en su lugar: -

function doSomethingWhichNeedsPrompt(fnContinue) 
{ 
    var a = "stuff"; 
    var o = {} 
    //other code 
    displayPrompt("PleaseInputStuff",o, fnCallback) 
    function fnCallback() { 
     //continue to use data on o and the variable a after prompt dismissed. 
     if (fnContinue) fnContinue(); 
    } 
} 

Por supuesto, nada de llamar doSomethingWhichNeedsPrompt también tendría que ser consciente de su naturaleza asincrónica y allí para doSomethingWhichNeedsPrompt puede necesitar tomar el parámetro de función que llama después de que haya hecho todo su trabajo.

3

necesito que sean síncronas.

Es posible que tenga que reconsiderar sus necesidades. Con IE7 + rechazando incluso window.prompt(), no hay medios de navegación cruzada para recibir entrada síncrona.

Hay showModalDialog, pero no está disponible a nivel mundial y, a mis ojos, es bastante hostil al usuario. En la mayoría de los navegadores, ser síncrono bloquea no solo los scripts sino también la IU del navegador, lo que puede ser muy inconveniente.

devoluciones de llamada no son tan malos IMO:

myPrompt("What's your name?", function(x) { 
    alert("Your name is "+x); 
});