在業務里用到了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");
java的寫法:
response.setHeader("Cache-Control", "must-revalidate");
response.setHeader("Cache-Control", "post-check=0");
response.setHeader("Cache-Control", "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 。詳細如下:
於是將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上,點擊 訪問此文