2008-12-14 12 views
4

MSIE v7 (pas dans mes mains) ouvre une boîte de dialogue Modeless ou déclenche un événement onLoad s'il y a une alerte Javascript dans la page cible. Ce qui suit échoue dans MSIE v7 mais est OK dans v6 (fichier zip de source complète disponible si nécessaire).showModelessDialog - erreur OnLoad - IE 7

Apprécierait d'autres confirmant ceci et discutant de la raison pour laquelle cela devrait être ainsi.

index.htm (uniquement la fonction javascript montré ici)

function openDialog(n) { 
    if (typeof(window.showModalDialog) == 'object') { /* Ensure of browser support */ 
    var sURL = 'modeless.htm';      /* Set the URL */ 
    var oWin = window.showModelessDialog(sURL);  /* Create new modeless window */ 
    } 
    else { 
    alert('"showModlessDialog" not supported!'); 
    } 
} 

modeless.htm

<html> 
    <head> 
    <title>Modeless dialog</title> 
    </head> 
    <body bgcolor="#ff0000" text="#ffffff" onLoad="alert('Modeless is now loaded')"> 
    <center> 
     <h1>Modeless</h1> 
    </center> 
    <script type="text/javascript" language="JavaScript"> 
     /* If the next line is included, it prevents the onLoad event occurring in MSIE v7 */ 
     alert('This alert stops the onLoad event in MSIE v7!'); 
    </script> 
    </body> 
</html> 

Répondre

0

Êtes-vous sûr que ce n'est pas votre événement onload en ligne qui est l'arrêter? Le code ci-dessous fonctionne pour moi.

index.htm

<html> 
<head> 
    <title>Index</title> 
    <script type="text/javascript" language="JavaScript"> 

    function openDialog() { 
    if (window.showModalDialog) { 
    var sURL = 'Modeless.htm';      
    var oWin = window.showModelessDialog(sURL);  
    } 
    else 
    { 
    alert('"showModlessDialog" not supported!'); 
    } 
    } 

    function addEventSimple(obj,evt,fn) { 
    if (obj.addEventListener) 
    obj.addEventListener(evt,fn,false); 
    else if (obj.attachEvent) 
    obj.attachEvent('on'+evt,fn); 
    } 

    function removeEventSimple(obj,evt,fn) { 
    if (obj.removeEventListener) 
    obj.removeEventListener(evt,fn,false); 
    else if (obj.detachEvent) 
    obj.detachEvent('on'+evt,fn); 
    } 

    addEventSimple(window, "load", openDialog); 
    </script> 
</head> 
<body text="#ffffff"> 
    <h1 align="center">Index</h1> 
</body> 
</html> 

Modeless.htm

<html> 
<head> 
<title>Modeless dialog</title> 
    <script type="text/javascript" language="JavaScript"> 
    addEventSimple(window, "load", showAlert); 

    function showAlert() { 
    alert('Modeless is now Loaded'); 
    } 

    function addEventSimple(obj,evt,fn) { 
    if (obj.addEventListener) 
    obj.addEventListener(evt,fn,false); 
    else if (obj.attachEvent) 
    obj.attachEvent('on'+evt,fn); 
    } 

    function removeEventSimple(obj,evt,fn) { 
    if (obj.removeEventListener) 
    obj.removeEventListener(evt,fn,false); 
    else if (obj.detachEvent) 
    obj.detachEvent('on'+evt,fn); 
    } 
    </script> 
</head> 
<body text="#ffffff" > 
<h1 align="center">Modeless</h1> 
    <script type="text/javascript" language="JavaScript"> 
    /* If the next line is included, it prevents the onLoad event occurring in MSIE v7 */ 
    alert('This alert stops the onLoad event in MSIE v7!'); 
    </script> 
</body> 
</html> 

Note: Pour une raison que je dois me vider le cache du navigateur pour obtenir des modifications à la fenêtre modales mise à jour.

1

Il semble que IE7 affiche le bon comportement. HTML est lu et analysé séquentiellement, y compris les scripts. Lorsque l'analyseur atteint l'alerte javascript, il l'exécute et attend un retour. Ensuite, il peut terminer l'analyse de la page et déclencher l'événement onLoad.

Si vous souhaitez que l'alerte s'affiche après le chargement de la page, vous devez gérer l'événement onLoad lui-même. Vous pouvez le faire en mode natif avec:

window.onload = function() { 
    //do stuff here 
} 

Ou bien, vous pouvez le faire avec un certain nombre de bibliothèques javascript, comme jQuery:

$(document).ready(function() { 
    //do stuff here 
}); 
0

Je pense qu'il ya une certaine confusion sur l'utilisation d'alerte() dans le corps HTML de la boîte de dialogue non modale. Les points suivants, il sera plus facile d'expliquer le comportement observé:

  1. Les contrôles de code pour le support de dialogue modales (détection d'objets)
  2. Si oui, dans le contrôle ci-dessus, puis passez à l'étape suivante, sinon afficher l'alerte.
  3. Dans la boîte de dialogue modale, le corps HTML est téléchargé par le navigateur et analysé séquentiellement, comme indiqué par in the other answer.
  4. Les balises de script peuvent apparaître n'importe où dans le corps et seront analysées et exécutées par MS Windows Script Host (le moteur JavaScript pour MSIE). Puisque l'alerte dans la boîte de dialogue modale n'est pas présente dans une fonction, elle finit par être traitée comme un bloc de code global, et sera exécutée immédiatement, lorsque l'exécution du bloc de script est effectuée par le moteur JS.
  5. Les alertes arrêtent toute autre exécution de JavaScript. L'exécution de JavaScript ne reprendra que lorsque l'utilisateur aura rejeté l'alerte.
  6. Le gestionnaire onload est déclenché uniquement lorsque le document a été entièrement téléchargé et rendu. Par conséquent, l'exécution de l'alerte retardera l'exécution du gestionnaire onload jusqu'à ce que l'utilisateur rejette l'alerte, et le reste du document est analysé et rendu.(Même s'il ne parle pas spécifiquement d'IE) est un article vraiment utile à lire, dans ce contexte.

    Mise à jour: J'ai essayé d'exécuter du code similaire, à la fois sur un serveur (Apache Tomcat) et hors du système de fichiers. On dirait que le comportement décrit se produit lorsque j'ouvre index.html à partir du système de fichiers, et non du serveur. Les paramètres de zone d'IE peuvent être à l'œuvre ici.