2010-08-21 5 views
4

J'ai une application Web existante qui utilise window.showmodaldialog() pour montrer certaines formes et en fonction de la valeur de retour, il exécute d'autres JavaScriptsCréer JS exécution des boîtes de dialogue de blocage en utilisant jQuery

Par exemple:

var retVal = window.showmodaldialog('...'); 

if (retVal==XXX) 
    callXXX(); 
else 
    callYYY(); 

Lorsque showModalDialog() est exécuté il bloque l'exécution de JS sur la fenêtre principale jusqu'à ce que le modal soit fermé. Je tente de remplacer ces fenêtres modales par des boîtes de dialogue jQuery mais le problème est qu'une fois le $(...).dialog().open() exécuté, l'exécution JavaScript n'attend pas la fermeture du dialogue.

Je sais qu'il ya des API jQuery qui me permettent de configurer une fonction de rappel, mais qui implique beaucoup de changements pour moi. Y at-il de toute façon par quoi je peux suspendre l'exécution de JavaScript jusqu'à ce que la boîte de dialogue soit fermée (je dois toujours être capable d'exécuter des scripts à partir de la boîte de dialogue).

Répondre

1

Je crains qu'il n'y ait aucun moyen de « faire une pause » javascript exécution jusqu'à ce que vous voulez en mode natif .. La fonction showModalDialog faire parce que est mis en œuvre par le navigateur.

Vous pouvez juste faire votre mécanisme « en attente » à la main, et que vous devez faire les changements (comme vous l'avez dit qu'ils sont beaucoup, mais ne devrait pas être des changements complexes).

Ce sont les choses qui me vient à l'esprit maintenant:

  • Faire usage de callbacks (pour moi, de loin le meilleur)
  • Utilisez setTimeout et votre propre mécanisme, comme g.d.d.c answered.
  • Utilisez une bibliothèque javascript de l'utilisateur.

Mais si vous êtes ouvert aux plug-ins, je viens de trouver ce plugin jQuery: BlockUI et some others que vous aider peut-être. Et il doit y avoir quelques autres plugins qui implémentent déjà ce que j'ai mentionné dans les points ci-dessus.

3

Malheureusement, non. Vous devrez utiliser des fonctions de rappel d'une certaine sorte. Le 'blocage' comme ceci dans JavaScript est une mauvaise idée car il n'y a qu'un seul thread d'exécution et JavaScript utilise un modèle Event Driven.

Vous pourriez faire quelque chose comme ça à « attendre » la valeur de retour, mais cela ne les autres pas « bloquer » l'exécution du tout:

var myReturn, 
myInterval = setInterval(function() { 
    if (myReturn != undefined) { 
    clearInterval(myInterval); 
    // Rest of processing code here. 
    } 
}, 50); 

$('myContainer').dialog(close: function() { 
    myReturn = 'Dialog Closed'; 
}).open(); 

Tentative de JavaScript d'exécution « bloc » ou « pause » devrait être évité - la langue n'est tout simplement pas conçue pour cela.

+0

+1 pour l'ensemble du message. En remarque, il est inutile de définir la valeur d'une variable sur undefined lorsque vous la déclarez. 'var myReturn,' est identique à 'var myReturn = undefined,'. Bien que plus bavard, certains octets préfèrent la version courte :-) –

Questions connexes