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

來源:互聯網
上載者:User

在業務裡用到了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上,點擊 訪問此文

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.