如何在chrome 37中使window.showmodaldialog工作?

Anu*_*dra 43 javascript asp.net jquery google-chrome cross-browser

我们有一个庞大的Web应用程序,window.showmodaldialog用于警报,确认和弹出窗口.自Chrome版本37起,此呼叫已被禁用.

是否有任何快速解决方法可以window.showmodaldialog在最新版本的Chrome中进行操作?

我在这里添加了一个window.showmodaldialog的解决方法,虽然这不是一个完美的解决方法,因为这不会破坏代码执行,因为showmodaldialog正在做,而是这将打开弹出窗口.

window.showModalDialog = function (url, arg, feature) {
        var opFeature = feature.split(";");
       var featuresArray = new Array()
        if (document.all) {
           for (var i = 0; i < opFeature.length - 1; i++) {
                var f = opFeature[i].split("=");
               featuresArray[f[0]] = f[1];
            }
       }
        else {

            for (var i = 0; i < opFeature.length - 1; i++) {
                var f = opFeature[i].split(":");
               featuresArray[f[0].toString().trim().toLowerCase()] = f[1].toString().trim();
            }
       }



       var h = "200px", w = "400px", l = "100px", t = "100px", r = "yes", c = "yes", s = "no";
       if (featuresArray["dialogheight"]) h = featuresArray["dialogheight"];
        if (featuresArray["dialogwidth"]) w = featuresArray["dialogwidth"];
       if (featuresArray["dialogleft"]) l = featuresArray["dialogleft"];
        if (featuresArray["dialogtop"]) t = featuresArray["dialogtop"];
        if (featuresArray["resizable"]) r = featuresArray["resizable"];
       if (featuresArray["center"]) c = featuresArray["center"];
      if (featuresArray["status"]) s = featuresArray["status"];
        var modelFeature = "height = " + h + ",width = " + w + ",left=" + l + ",top=" + t + ",model=yes,alwaysRaised=yes" + ",resizable= " + r + ",celter=" + c + ",status=" + s;

        var model = window.open(url, "", modelFeature, null);

       model.dialogArguments = arg;

    }
Run Code Online (Sandbox Code Playgroud)

只需将此代码放在页面的head部分即可.

小智 35

我在页眉中放了以下javascript,它似乎工作.它检测浏览器何时不支持showModalDialog并附加使用window.open的自定义方法,解析对话框规格(高度,宽度,滚动等),以开启器为中心并将焦点设置回窗口(如果焦点丢失).此外,它使用URL作为窗口名称,以便每次都不会打开新窗口.如果您将窗口args传递给模态,则需要编写一些额外的代码来修复它.弹出窗口不是模态的,但至少你不需要改变很多代码.可能需要一些适合您情况的工作.

<script type="text/javascript">
  // fix for deprecated method in Chrome 37
  if (!window.showModalDialog) {
     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();
     };
  }
</script>
Run Code Online (Sandbox Code Playgroud)


Yur*_*ter 15

来自http://codecorner.galanter.net/2014/09/02/reenable-showmodaldialog-in-chrome/

它被设计弃用了.您可以重新启用showModalDialog支持,但只能暂时启用 - 直到2015年5月.使用这段时间创建替代解决方案.

以下是Chrome for Windows中的操作方法.打开注册表编辑器(regedit)并创建以下键:

HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\EnableDeprecatedWebPlatformFeatures

EnableDeprecatedWebPlatformFeatures键下创建一个名称1和值为的字符串值ShowModalDialog_EffectiveUntil20150430.要验证是否已启用该策略,请访问chrome:// policy URL.


更新:如果以上对您不起作用,这是另一种尝试方法.

  1. http://www.chromium.org/administrators/policy-templates下载Chrome ADM模板
  2. 提取和导入与您的语言环境相关的策略(例如,windows\adm\en-US\chrome.adm.您可以gpedit.msc在Windows的Home版本上通过或使用这些实用程序导入:http://blogs.technet.com/b/fdcc /archive/2008/05/07/lgpo-utilities.aspx)
  3. 在"管理模板"下,找到Google Chrome模板并启用"启用弃用的Web平台Feautes".
  4. 打开该功能并添加"ShowModalDialog_EffectiveUntil20150430"键.


Ben*_*ter 6

这里提供了一个非常好的、有效的 javascript 解决方案:https : //github.com/niutech/showModalDialog

我个人使用过它,在其他浏览器上的工作方式和以前一样,它为 chrome 浏览器创建了一个新对话框。

这是一个关于如何使用它的示例:

function handleReturnValue(returnValue) {
    if (returnValue !== undefined) {
        // do what you want
    }
}

var myCallback = function (returnValue) { // callback for chrome usage
    handleReturnValue(returnValue);
};

var returnValue = window.showModalDialog('someUrl', 'someDialogTitle', 'someDialogParams', myCallback); 
handleReturnValue(returnValue); // for other browsers except Chrome
Run Code Online (Sandbox Code Playgroud)


Nig*_*lis 5

这篇文章(为什么不推荐使用window.showModalDialog?改为使用什么?)似乎表明不推荐使用showModalDialog.