2008-12-14 57 views
4

如果目標頁面中存在Javascript警報,MSIE v7不會(在我的手中)打開無模式對話框或觸發onLoad事件。以下在MSIE v7中失敗,但在v6中是可以的(如果需要,可以使用全部源文件的zip文件)。showModelessDialog - onLoad失敗 - IE 7

希望其他人確認這一點,並討論爲什麼會這樣。

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> 

回答

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> 

注:出於某種原因,我需要清除我的瀏覽器緩存去的模式窗口,任何更改更新。

1

看來,IE7顯示正確的行爲。 HTML被順序讀取和解析,包括腳本。當解析器達到javascript警報時,它會執行它並等待返回。然後,它可以完成解析頁面並引發onLoad事件。

如果您希望在頁面加載後顯示警報,您必須自己處理onLoad事件。你可以用本機做到這一點:

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

或者,你可以用任何數量的JavaScript庫,如jQuery做到這一點:

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

我認爲有一些混淆使用警報()在無模式對話框的HTML主體中。 以下幾點會更容易解釋觀測到的行爲:

  1. 的代碼檢查支持無模式對話框(對象檢測)
  2. 如果是的話,在上面的檢查,然後進行下一個步驟,否則顯示警報。
  3. 在模式對話框中,HTML正文由瀏覽器下載並按順序解析,如in the other answer所指出的那樣。
  4. 腳本標籤可以出現在正文的任何​​位置,並且將由MS Windows Script Host(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的區域設置可能在這裏工作。