4

如果目标页面中有 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!');
  }
}

无模式.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>
4

3 回答 3

1

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

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

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

或者,您可以使用任意数量的 javascript 库来执行此操作,例如 jQuery:

$(document).ready(function() {
    //do stuff here
});
于 2008-12-22T18:42:05.470 回答
0

Are you sure it's not your inline onload event that's stopping it? The code below works for me.

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: For some reason I need to clear my browser cache to get any changes to the modeless window to update.

于 2008-12-16T19:00:35.877 回答
0

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

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

    Opera 开发者社区关于 JavaScript 中的时间和同步的文章(尽管它没有专门讨论 IE)在这种情况下是一篇非常有用的文章。

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

于 2008-12-24T17:01:18.853 回答