天天看點

window.open()在IE8下報錯,輸出檔案無法下載下傳,以及打開多個視窗重複的問題

在業務裡用到了PHP header導出doc文檔,GET傳值到頁面,讀出相應資料輸出doc檔案下載下傳。使用者提出需要批量,于是設計成js循環出對應數量的window.open(),向頁面傳入不同的值,批量輸出相應的檔案。簡單的說,就是我需要循環出多個window.open()。

js代碼為:

var outCode = JSON.parse(<?php echo $jsonCode; ?>);
for(var i=0; i<outCode.length; i++){
$statu = $("開始導出"+outCode[i]+"号申請表..").appendTo("body");
window.open("../docout.php?id="+outCode[i]);
$statu.append("已彈出下載下傳,請注意");
}
           

(PHP頁面省略)

實際過程中,在IE8上卻出現了若幹問題。花費不少時間。下面列舉每個遇到的問題(均為IE8下,其他環境均不存在問題。吐)。

1、首先是單個的需要打開的是利用PHP header輸出doc的頁面,發現在使用<a href="url.php?id=code" target="_blank" rel="external nofollow" >連結形式傳遞時,新視窗正常打開并輸出檔案提示下載下傳,沒有問題。而改用window.open()打開卻隻有空白頁面。

上網查找了一下解決方法:把IE個性化設定重置為預設(工具-Internet選項-進階-重置),删除所有個性化設定,完成後,重試IE該問題不再出現,視窗能正常打開。但是還有另外的問題:彈出窗後下載下傳報錯,下載下傳框彈出提示"無法打開該站點,請求的站點不可用"...

window.open()在IE8下報錯,輸出檔案無法下載下傳,以及打開多個視窗重複的問題

查找解決方法後發現是IE8的緩存BUG,需要加更新檔。或在PHP輸出中更改緩存模式。

加入header語句後問題解決。

header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
           

2、多個window.open彈出的問題單個的解決了,在批量循環彈出多個視窗打開頁面時,IE8出現了這樣的現象:循環開始,從打開第一個窗以後(預設在頁籤裡打開),每次打開均把前一次的窗關閉又打開,一直重複,都隻能出一個窗,也無法輸出内容。懷疑是多個window.open隻能出在一個窗上。

查閱資料,window.open的參數包括(url,name,feature,replace):

url:視窗連結,聲明要在新視窗中顯示的文檔的 URLname:新視窗的名稱。如果指定了一個已經存在的視窗,就不再建立一個新視窗,而隻是傳回對指定視窗的引用。feature:樣式定制,例如高寬、滾動條等replace:url條目在曆史記錄裡的生成方式,true替換浏覽曆史中的目前條目,false在浏覽曆史中建立新的條目

于是把每個視窗name賦予不同的名稱,并将replace指派為false,問題依然未能解決。

上了stack overflow,找到了一些相關問題,有所發現:首先提到name屬性的标準解釋,除了賦為自定義String,還有_blank _parent _self _top 。詳細如下:

window.open()在IE8下報錯,輸出檔案無法下載下傳,以及打開多個視窗重複的問題

檢視: msdn關于window.open()的解釋

于是将name改為"_blank"。

window.open("../docout.php?id="+outCode[i],"_blank","",false);
           

問題解決,每個window.open都在新的視窗打開了。但是煩人的問題沒有結束。。

3、這回真是折磨透了。。上傳到伺服器後仍然出現之前的問題。怎麼改屬性都也不起作用。折磨了一天,找到了問題所在:

(嘗試過程省略一萬字)

在本地時,IE8中本地站點安全性配置為中低,而internet預設級别為中高。于是嘗試将站點加入可信站點内,并配置同樣的中低安全性。問題解決了。。。估計是安全性配置中的防彈窗的問題。

配置方法:internet選項——安全——可信站點——添加,并将安全性設為中低

window.open()在IE8下報錯,輸出檔案無法下載下傳,以及打開多個視窗重複的問題

在自定義級别中應該也能找到相應的選項,應該是禁用防彈窗,沒試了。

到此,這個問題發現已經無法用代碼去繞開了。隻能記住下次不再用這方法實作任何功能。存在差異性。(其實都是IE...)

4、另外關于name在IE8的問題——拒絕空格和中劃線

解答中其次提到,在name中,IE8不支援Space(空格)、dash(中劃線-),如果在name中使用形如"my-window"或"my window",将會報錯 Invalid argument。

吐槽:IE為什麼不去見鬼。

參看stack overflow上相關問題:

ie8 var w= window.open() - “Message: Invalid argument.

”Window.open not working in IE8?

本文也發表在我的獨立部落格blog.mc-zone.me上,點選 通路此文

繼續閱讀