Chrome和IE中使用window.open函數


做前端開發的人員經常回遇到使用windows.open這個函數來打開一個新的網頁窗口,使用這個函數的時候有些需要注意的地方,在Chrome和IE下該函數還是有一些細節性的區別。 以下是我在項目中使用的代碼(大概用法):

Download.html的代碼如下:

<!DOCTYPE html>
<html>
<head>
    <title>Test Window</title>
</head>
<body>
    <div id='main_body' style="width: 100%; height: 100%"></div>
</body>
    
</html>
View Code

父窗口中的Javascript代碼如下:

var promptWnd=window.open("Download.html);

var divHtml=[];

divHtml.push('<div>This is first divsection</div>');
divHtml.push('<div>This is second divsection</div>');

promptWnd.document.getElementById("main_body").innerHTML = divHtml.join('');
View Code

以上這段Javascript代碼在IE中運行正常(至少我測試是正常運行的),但是在Chrome中使用就有問題了,在Chrome中子窗口彈出來了,但是無法將div添加到子窗口中。

使用alert(promptWnd.document.getElementById("main_body")),發現輸出的為null。

因此,我大膽的推測,window.open函數在IE和Chrome中實現方式是不一樣的,IE中是同步執行的,也就是說在IE中子窗口的Dom元素加載完成才返回;而在Chrome中則是 異步執行的,也就是說Chrome不會等子窗口中的Dom元素加載完才返回。

根據這種推測,通過返回的promptWnd句柄是不可以操作子窗口的Dom元素的[因為子窗口的Dom 元素沒有加載完成]。

我的解決方案如下[使用setInterval函數檢查Dom元素是否加載成功],代碼如下:

var interval=null;
var promptWnd=window.open("Download.html);

var divHtml=[];

divHtml.push('<div>This is first divsection</div>');
divHtml.push('<div>This is second divsection</div>');


function checkDomReady() {
    var result = promptWnd.document.getElementById("main_body") == null ? false : true;
    if (result == true) {
        clearInterval(interval);
        promptWnd.document.getElementById("main_body").innerHTML = divHtml.join('');
    }

};

(function checkWndReady() {
    if (promptWnd.document.getElementById("main_body") == null) {
        checkDomReady();
        interval = setInterval(checkDomReady, 1000);
    }
    else {
        promptWnd.document.getElementById("main_body").innerHTML = divHtml.join('');
    }

})();
View Code

經過測試以上代碼可以再IE和Chrome下按照指定的需求正常運行。獨樂樂不如眾樂樂,希望以上解決思路對讀者有所幫助!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM