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

IT技术 javascript jquery asp.net google-chrome cross-browser
2021-02-17 08:45:48

我们有一个巨大的网络应用程序,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;

    }

只需将此代码放在页面的头部部分即可。

6个回答

我将以下 javascript 放在页眉中,它似乎可以工作。它检测浏览器何时不支持 showModalDialog 并附加一个使用 window.open 的自定义方法,解析对话框规范(高度、宽度、滚动等),将焦点放在 opener 上并将焦点设置回窗口(如果焦点丢失) )。此外,它使用 URL 作为窗口名称,因此不会每次都打开一个新窗口。如果您将窗口参数传递给模态,您将需要编写一些额外的代码来解决这个问题。弹出窗口不是模态的,但至少您不必更改大量代码。可能需要根据您的情况进行一些工作。

<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>
jsfiddle 中的任何示例jsfiddle.net/grj4x5k9示例使用HTML5 对话框(有这个问题)
2021-04-16 08:45:48
看来 IE 也有同样的问题。如果我们通过删除第一个来覆盖该功能if,它可以在所有 3 个主要浏览器中使用。
2021-04-25 08:45:48

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

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

这是在 Windows 版 Chrome 中执行此操作的方法。打开注册表编辑器 (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 家庭版上的这些实用程序导入http : //blogs.technet.com/b/fdcc /archive/2008/05/07/lgpo-utilities.aspx )
  3. 在“管理模板”下找到 Google Chrome 模板并启用“启用已弃用的 Web 平台功能”。
  4. 打开功能并添加“ShowModalDialog_EffectiveUntil20150430”键。
@sanjeev40084 我自己没试过,但根据chromium.org/administrators/...在首选项名称下EnableDeprecatedWebPlatformFeatures你设置了值<array><string>ShowModalDialog_EffectiveUntil20150430</string></array>
2021-04-20 08:45:48
我相信你应该命名字符串值 ShowModalDialog_EffectiveUntil20150430 而不是 ShowModalDialog_EffectiveUntil201504301。
2021-04-22 08:45:48
必须喜欢对 2 岁的答案投反对票,没有任何解释。但是如果你仍然试图showModalDialog通过投票来使用和发泄你的不满 - 我为你感到难过。
2021-04-25 08:45:48
你知道如何在 Mac 上解决这个问题吗?
2021-05-14 08:45:48

这里提供了一个非常好的、有效的 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

这篇文章(为什么不推荐使用 window.showModalDialog?用什么代替?)似乎暗示 showModalDialog 已被弃用。

当您使用 window.open() 打开窗口时 window.returnValue 属性不会直接工作,而在您使用 window.showModalDialog() 时它会工作

因此,在您的情况下,您有两种选择来实现您的目标。

选项 1 - 使用 window.showModalDialog()

在您的父页面中

var answer = window.showModalDialog(<your page and other arguments>)
if (answer == 1)
 { do some thing with answer }

在您的子页面中,您可以直接使用 window.returnValue

window.returnValue = 'value that you want to return';

showModalDialog停止执行 JavaScript,直到对话框关闭,并且可以在关闭时从打开的对话框中获取返回值。但是 showModalDialog 的问题是许多现代浏览器不支持相比之下 window.open 只是异步打开一个窗口(用户可以访问父窗口和打开的窗口)。JavaScript 执行将立即继续。这将我们带到了选项 2

选项 2 - 使用 window.open() 在您的父页面中编写一个处理对话框打开的函数。

function openDialog(url, width, height, callback){
if(window.showModalDialog){
    options = 'dialogHeight: '+ height + '; dialogWidth: '+ width + '; scroll=no'
    var returnValue = window.showModalDialog(url,this,options);
    callback(returnValue)
}
else {
    options ='toolbar=no, directories=no, location=no, status=yes, menubar=no, resizable=yes, scrollbars=no, width=' + width + ', height=' + height; 
        var childWindow = window.open(url,"",options);
        $(childWindow).on('unload',function(){
            if (childWindow.isOpened == null) {
                childWindow.isOpened = 1;
            }
            else {
                if(callback){
                    callback(childWindow.returnValue);
                }
            }
        });
}

}

每当你想使用打开一个对话框。编写一个处理返回值的回调并将其作为参数传递给 openDialog 函数

function callback(returnValue){
if(returnValue){
    do something nice with the returnValue
}}

当调用函数时

openDialog(<your page>, 'width px', 'height px', callbak);

查看关于如何用 window.open 替换 window.showModalDialog的文章

请不要在多个问题中添加相同的答案一旦您获得足够的声望,回答最好的一个并将其余的标记为重复。如果它不是重复的,请根据问题调整帖子并标记为取消删除。
2021-05-06 08:45:48