showModelessDialog - onLoad失败 - IE 7

时间:2008-12-14 07:02:42

标签: javascript internet-explorer-7 onload

如果目标页面中存在Javascript警报,则MSIE v7不会(在我手中)打开无模式对话框或触发onLoad事件。以下在MSIE v7中失败但在v6中是可以的(如果需要,可以获得完整源代码的zip文件)。

希望其他人确认这一点并讨论为什么会这样。

index.htm(此处只显示javascript函数)

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>

3 个答案:

答案 0 :(得分:1)

看来IE7正在显示正确的行为。按顺序读取和解析HTML,包括脚本。当解析器到达javascript警报时,它会执行它并等待返回。然后,它可以完成解析页面并引发onLoad事件。

如果要在加载页面后显示警报,则必须自己处理onLoad事件。您可以通过以下方式进行本地操作:

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

或者,你可以使用任何数量的javascript库,比如jQuery:

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

答案 1 :(得分:0)

你确定不是你的内联onload事件正在停止它吗?下面的代码对我有用。

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>

注意:出于某种原因,我需要清除浏览器缓存以对无模式窗口进行任何更改以进行更新。

答案 2 :(得分:0)

我认为在无模式对话框的HTML主体中使用alert()存在一些混淆。 以下几点可以更容易地解释观察到的行为:

  1. 代码检查是否支持无模式对话框(对象检测)
  2. 如果是,请在上述检查中,然后继续执行下一步,否则显示警告。
  3. 在模式对话框中,浏览器会下载HTML正文,并按in the other answer所指示的顺序进行解析。
  4. 脚本标记可以出现在正文中的任何位置,并且将由MS Windows脚本宿主(MSIE的JavaScript引擎)解析和执行。由于模态对话框中的警报不存在于函数中,因此它将被视为全局代码块,并且在JS引擎完成脚本块的执行时将立即执行。
  5. 警报会停止进一步执行JavaScript。只有当用户解除警报时,才会恢复执行JavaScript。
  6. 只有在完全下载并呈现文档时才会触发onload处理程序。因此,警报的执行将延迟onload处理程序的执行,直到用户解除警报,并解析和呈现文档的其余部分。

    The Opera Developer Community article on timing and synchronization in JavaScript(即使它没有特别谈到IE)在这种情况下是一篇非常有用的文章。

    更新:我尝试在服务器(Apache Tomcat)和文件系统之外运行类似的代码。看起来当我从文件系统打开index.html而不是从服务器打开时,会出现所描述的行为。 IE的区域设置可能在这里工作。