【问题标题】:window.showmodaldialog not working in chromewindow.showmodaldialog 在 Chrome 中不起作用
【发布时间】:2016-04-08 13:05:11
【问题描述】:

我正在为我的项目使用 VS2010 Express 版本。

我创建了一个带有“提交”按钮的注册表单,它将打开新窗口(子窗口)。

它包含 aspx 按钮 ( )。

子窗口再次包含一个由我们填写的表单,在单击“保存”按钮后,该表单被保存,在保存后,如果我们关闭子窗口,则提交注册表。

页面加载包含调用 javascript 的函数。

SetJavaScript();
        if (Session["IsSuccess"] != null)
            if (Session["IsSuccess"].ToString().ToLower() == "success")
                TextBox1.Text = Session["IsSuccess"].ToString();
        if (ddlTicketType.SelectedValue.ToString().ToLower() == "cr")
            btnSubmit.Attributes.Add("OnClick", "OpenChild(); ");
        if (ddlTicketType.SelectedValue.ToString().ToLower() == "pr")

btnSubmit.Attributes.Add("OnClick", "clickno();");

由于 window.showmodaldialog 不适用于 chrome。我也使用过window.open,但它也无法正常工作,因为它打开了子表单并且在关闭它的注册表单后出现错误消息“请填写表格”。 以下是页面加载时调用的 javascript 代码。


private void SetJavaScript()
   {
    string str_Script = "";
    str_Script += "<script type='text/javascript' language='javascript'>";
    str_Script += "function OpenChild() ";
    str_Script += "{ CheckValidation();";
    str_Script += "var varx = document.getElementById('TextBox1').value;";

    str_Script += "if (varx== 'yes'){";
    str_Script += "var ParmA = '2';";
    str_Script += "var MyArgs = new Array(ParmA);";
    str_Script += "if (ParmA=='2'){";
    str_Script += "var WinSettings = 'center:yes;resizable:yes;dialogheight:800px;dialogwidth:1000px';";
    str_Script += "MyArgs = window.showModalDialog('user/cr1.aspx', MyArgs, WinSettings);";

    str_Script += "if (MyArgs == null)";
    str_Script += "{";
    str_Script += "}";
    str_Script += "else";
    str_Script += "{";
    str_Script += "document.getElementById('TextBox1').value =MyArgs[0].toString();";
    str_Script += "}";
    str_Script += "}}";
    str_Script += "</script> ";
    this.Page.RegisterStartupScript("Reconnect", str_Script);

}

请帮助我让它再次正常工作,因为它在 chrome 更新之前工作得很好。 请让我知道任何可以解决此问题的好的替代方案。

【问题讨论】:

    标签: javascript c# jquery asp.net forms


    【解决方案1】:

    正如您所读到的here,Window.showModalDialog() 已被弃用,Chrome 从版本 37 开始不再支持它,并且已从版本 43 中完全删除。

    改用Bootstrap Modal,或者,如果更改成本太高,试试这个library,这是一个window.showModalDialog polyfill

    【讨论】:

    • 我们没有其他选择吗 (window.showmodaldialog()) ?由于我的代码已经部署,我想对其进行一些小改动,而不是进行引导。非常感谢您的建议,非常感谢。
    • 显示模态对话框替代源代码:github.com/niutech/showModalDialog
    • Polyfill 也无法正常工作。请为此提出一些替代方案。
    【解决方案2】:

    我们在许多旧版 asp 应用程序中都存在这个问题。我发现了至少 3 种不同的方法,但选择了一些更简单的方法,我认为这可能是您问题的答案。它可以很好地修复经典的 asp 页面,但也可以在 .Net 环境中工作。这是该方法的伪代码:

    在调用表单javascript中:

    var chrome_pop_up_window = null; //global for next few functions
    function uploadChromeFinished(parameters) {
        //do something with parameters
        if(chrome_pop_up_window != null) {
            chrome_pop_up_window.close();
            chrome_pop_up_window = null;
        }
    }
    function OpenChild() {
        if(!window.showModalDialog)
             chrome_pop_up_window = window.open(url, "_blank", other_settings);
        else {
             var result = showModalDialog(...);
        }
    }
    

    然后在子页面中,我准备好一个文档,它知道是关闭窗口模式还是调用打开器的函数。 “开启者”是打开弹出窗口的页面。对于 .net,我会推荐一个设置隐藏变量以让页面知道它已完成的回发。

    if(document.getElementById("am_I_finished").value = 'true') {
          window.opener.uploadChromeFinished(parameters_if_needed);
    else {
         window.dialogArguments.something = some_value_if_needed;
         window.returnValue = true; //or false         
         windlow.close();
    }
    

    然后最终结果是无论是在 Chrome 还是 IE 中都会打开弹出窗口,并且无论是 Chrome 还是 IE,孩子都可以在关闭时将信息传回给父母,尽管在 Chrome 的情况下,父母实际上是在关闭孩子之后它从孩子那里获取参数值。无需插件或 json。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-29
      • 2013-04-16
      • 2014-09-02
      • 2013-04-18
      • 2011-12-11
      • 2013-07-25
      • 2016-01-26
      相关资源
      最近更新 更多