2017年5月24日 星期三

showModalDialog 如何改成使用window.open


showModalDialog 是無法在新版的瀏覽器上使用了,所以別再花時間找解法,真正的解法就只能改寫,即然要改寫,就有很多種作法,看是要用jquery的Dialog改,還是要用傳統的window.open來改都可以,這篇是要教你如何用最簡單的方式改寫讓網頁可以正常使用
當要改寫時,我這裡分兩部份,一為開啟,一為回傳值,可以依你的網站使用的性質進行調整。如果你的網站使用showModalDialog 非常單純,只是純粹開啟網頁這樣只要處理如何開啟的轉換即可,首先可以加上以下這段語法:
// fix for deprecated method in Chrome 37
     window.showModalDialog = function (arg1, arg2, arg3) {

        var w;
        var h;
        var resizable = "no";
        var scroll = "no";
        var status = "no";

        // get the modal specs
        var mdattrs = arg3.split(";");
        for (i = 0; i < mdattrs.length; i++) {
           var mdattr = mdattrs[i].split(":");

           var n = mdattr[0];
           var v = mdattr[1];
           if (n) { n = n.trim().toLowerCase(); }
           if (v) { v = v.trim().toLowerCase(); }

           if (n == "dialogheight") {
              h = v.replace("px", "");
           } else if (n == "dialogwidth") {
              w = v.replace("px", "");
           } else if (n == "resizable") {
              resizable = v;
           } else if (n == "scroll") {
              scroll = v;
           } else if (n == "status") {
              status = v;
           }
        }

        var left = window.screenX + (window.outerWidth / 2) - (w / 2);
        var top = window.screenY + (window.outerHeight / 2) - (h / 2);
        var targetWin = window.open(arg1, arg1, 'toolbar=no, location=no, directories=no, status=' + status + ', menubar=no, scrollbars=' + scroll + ', resizable=' + resizable + ', copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left);
        targetWin.focus();
     };
這段主要是將window.showModalDialog進行宣告,如在IE會是覆寫改用此作法,這樣原本的showModalDialog都不用改code,即可運行,這樣至少不用一行一行CODE去改寫
解決了開啟之後,接下來就是回傳值了,這就沒那麼簡單,原本showModalDialog的作法是在呼叫時用變數去接回傳值,等該視窗處理完成後就會將回傳值放置該變數中,如下示意
呼叫頁(父頁)
var returnValue = window.showModalDialog(…);

處理頁(子頁)
window.returnValue = data;
window.close();

然後returnValue 就能接到值啦,是蠻方便的,但如果用window.open作就沒辦法這麼簡單做啦,改用window.open,因為視窗開啟後,其它頁面還是都能作業,所以父頁不能在那等待接值,因此要從子頁主動回傳參數才行,所以我們就要利用以下的方式進行改寫
呼叫頁(父頁)  宣告一個function 準備來接收子頁的回傳值
function setReturnValue(data){
  if (data != null)  {
        document.forms[0].elements["id"].value = data[0];
        ….
    }
}


處理頁(子頁) 在原本的window.returnValue =…  改成用
  window.opener.setReturnValue(data) ;

將值傳至父頁,這樣即可完成改寫啦,希望這篇說明能幫助到你!!

參考資料:

2017年5月23日 星期二

showModalDialog在IE11失效排除法


Javascript showModalDialog 是非正規的用法,微軟自己發明的,原本其它瀏覽器都還有支援,但在chrome v37 之後也不支援了,沒想到微軟在IE10之後自己也不支援了,真是有點給他OOXX的
所以目前一些舊網站如有使用了showModalDialog  要如何是好呢? 如果是只限IE使用的網站,最簡單的就是在網頁上強制降版使用相容性來檢視 這樣就能恢復原有的功能,只要在網頁的meta加上以下這句,這樣在開啟網頁時就會自動以IE8的相容性檢視來運行此網頁

<meta http-equiv="x-ua-compatible" content="ie=8" />

不過這個只限網站在IE瀏覽器上使用,如要在其它瀏覽器上使用,只能走上改寫一途了