在業務裡用到了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">連結形式傳遞時,新視窗正常開啟並輸出檔案提示下載,沒有問題。而改用window.open()開啟卻只有空白頁面。
上網尋找了一下解決方案:把IE個人化重設為預設(工具-Internet選項-進階-重設),刪除所有個人化,完成後,重試IE該問題不再出現,視窗能正常開啟。但是還有另外的問題:彈出窗後下載報錯,下載框彈出提示"無法開啟該網站,請求的網站不可用"...
尋找解決方案後發現是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 。詳細如下:
查看: msdn關於window.open()的解釋
於是將name改為"_blank"。
window.open("../docout.php?id="+outCode[i],"_blank","",false);
問題解決,每個window.open都在新的視窗開啟了。但是煩人的問題沒有結束。。
3、這回真是折磨透了。。上傳到伺服器後仍然出現之前的問題。怎麼改屬性都也不起作用。折磨了一天,找到了問題所在:
(嘗試過程省略一萬字)
在本地時,IE8中本地網站安全性配置為中低,而internet預設層級為中高。於是嘗試將網站加入可信網站內,並配置同樣的中低安全性。問題解決了。。。估計是安全性配置中的防彈窗的問題。
配置方法:internet選項——安全——可信網站——添加,並將安全性設為中低
在自訂層級中應該也能找到相應的選項,應該是禁用防彈窗,沒試了。
到此,這個問題發現已經無法用代碼去繞開了。只能記住下次不再用這方法實現任何功能。存在差異性。(其實都是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上,點擊 訪問此文