• 【问题与解决】showModalDialog is not defined 的解决方案


    背景:

    showModalDialog 是比较老的方法了,有些浏览器不再支持弹出模态窗口了。

    比如说谷歌浏览就不再支持了,有文章说明如下:

    Chrome’s Lack of Support for showModalDialog Breaks Some Enterprise Web Apps

    弹出窗口代码:

    var obj = new Object();  
    var retval = window.showModalDialog("request.aspx",obj,"dialogWidth=500px;dialogHeight=300px"); 
    if (retval == null) {
    ...
    }else {
    ...
    }

    浏览器报错:

    Uncaught TypeError: undefined is not a function

    其中有些临时解决办法,但貌似showModalDialog不会回来了。

    问题解决

    常见的弹出窗口有div模拟或者用window.open代替,对于一个已经在用的系统来说,采用div方式转换成本较高,采用window.open改动会更少一些,但也会丢失其模态性。

    这里采用简单的window.open方案,毕竟替换成本低很多。针对上文中提到的showModalDialog使用方式,替换为:

    var iWidth = 500; 
    var iHeight = 300; 
    var iTop = (window.screen.availHeight - 30 - iHeight) / 2; 
    var iLeft = (window.screen.availWidth - 10 - iWidth) / 2; 
    var win = window.open("request.aspx", "弹出窗口", "width=" + iWidth + ", height=" + iHeight + ",top=" + iTop + ",left=" + iLeft + ",toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no,alwaysRaised=yes,depended=yes");

    参数说明

    dialogWidth:对话框宽度。 
    dialogLeft:距离桌面左的距离。 
    dialogTop:离桌面上的距离。 
    center:{yes|no|1|0}:窗口是否居中,默认yes,但仍可以指定高度和宽度。 
    help:{yes|no|1|0}:是否显示帮助按钮,默认yes。 
    resizable:{yes|no|1|0}[IE5+]:是否可被改变大小。默认no。 
    status:{yes|no|1|0}[IE5+]:是否显示状态栏。默认为yes[Modeless]或no[Modal]。 
    scroll:{yes|no|1|0|on|off}:指明对话框是否显示滚动条。默认为yes。 还有几个属性是用在HTA中的,在一般的网页中一般不使用。 
    dialogHide:{yes|no|1|0|on|off}:在打印或者打印预览时对话框是否隐藏。默认为no。 edge:{sunken|raised}:指明对话框的边框样式。默认为raised。 unadorned:{yes|no|1|0|on|off}:默认为no。

    采用这种方式就可以打开一个和之前使用showModalDialog差不多的窗口。但是怎么返回值呢?

    在弹出页面中有两种方式:

    1、直接设置父窗口的DOM对象的值。

    window.opener.document.getElementById(“parentWindowControlId”).value = "数据";

    父窗口中应该有一个id为parentWindowControllId的DOM元素。

    2、调用父窗口中的Javascript函数,由父窗口进行相应的处理。

    var obj = { id:"id", name:"name" };  window.opener.DoAfterXXX(obj);

    父窗口提供一个DoAfterXXX的函数就可以了。

    长远来看window.open由于其用户体验问题必将走向没落,还是尽快转移为好。

  • 相关阅读:
    TimeVal类——Live555源码阅读(一)基本组件类
    QT国际化 一 (lupdate/linguits/lrelease)
    qmake的使用
    将Apache加入到linux系统service
    ubuntu下编译VLC
    Ubuntu14.04安装intel集显驱动
    net-snmp的dateandtime数据类型
    MySQL的主从复制原理
    【iOS开发-25】UIDevice查看系统信息,从一个问题開始怎样高速找到自己想要的属性和方法并看懂它
    POJ 3279 Fliptile (二进制+搜索)
  • 原文地址:https://www.cnblogs.com/yc-755909659/p/9641868.html
Copyright © 2020-2023  润新知