Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法


Posted in Javascript onOctober 30, 2016

What?模态对话框失效了?

上个礼拜修改测试一个后台管理项目,在测试与各个浏览器兼容性的时候,发现在chrome浏览器下showModalDialog方法显示的并不是模态对话框,就像新打开一个页面一样,父窗口仍然可以随意获取焦点,并可以打开多个窗体,而且返回值returnValue也无法返回,一直是undefined。这么多问题很令人头疼,下面就各个主流最新版的浏览器进行了一下测试。

浏览器 是否支持 状态
IE9
Firefox13.0
safari5.1
chrome19.0 × 并不是模态对话框,而是open了一个新窗体
Opera12.0 × 什么也发生,连个窗体都不弹

Chrome到底打开的是什么

因为打开的不是模态对话框,而是像open了一个新窗体一样,那只要验证一下子窗体window.opener是否为空就明白了。

<script type="text/javascript">
    alert(window.opener);
</script>

在chrome中,显示的是一个[object window]对象,而IE则是undefined。现在知道原来chrome将showModalDialog当作window.open来处理了。也就是说我们完全可以用window.opener来操作chrome浏览器下子窗体。这里还发现个很有趣的现象,firefox中测试window.opener也并不为空,于是我又测试了下使用showModalDialog在子窗体中关于window.opener和window.dialogArguments在各个浏览器里的状况,由于Opera浏览器连个窗体都不弹,下面测试就剔除它了。

说明下父窗体的showModalDialog的方法中arguments传递是window对象,下面是测试的结果:

浏览器 模态对话框 window.opener window.dialogArguments returnValue
IE9 undefined [object Window]
Firefox13.0 [object Window] [object Window]
safari5.1 [object Window] [object Window]
chrome19.0 × [object Window] undefined ×

以上是我测试的结果,各个浏览器所支持的程度还是不一样的。还要说一下Firefox浏览器下,子窗体假如刷新的话window.dialogArguments照样会丢失,变成undefined。以上结果中我们可以看出返回值returnValue就只有chrome浏览器返回的是undefined,其他浏览器都没有问题。那该如何解决这个问题呢?

解决returnValue问题

通过以上的种种测试,我们已经知道chrome的showModalDialog方法很像执行了window.open方法,那么我们可以利用window.opener来实现window.returnValue的功能。

注意:temp=Math.random()这个随机参数是为了解决缓存问题,不少朋友测试出undefined是因为是缓存的问题。 追加于2012-10-17

父窗体部分js代码:

window.onload = function () {
  var returnValue = window.showModalDialog("son.html?temp=" + Math.random(), window);
  //for chrome
  if (returnValue == undefined) {
    returnValue = window.returnValue;
  }

  alert(returnValue);
}

子窗体部分js代码:

if (window.opener != undefined) {
    //for chrome
    window.opener.returnValue = "opener returnValue";
}
else {
    window.returnValue = "window returnValue";
}
window.close();

这样也在IE,FireFox,Chrome,Safari等浏览器下都可以通用了。

最后

最后有人要问那该如何实现模态对话框呢?我觉得应该是可以用一些js技巧去实现的,但是我不并推荐这样做,我也查询了很资料都不能很好的解决这个问题。当然,也可以有其他一些思路,比如为了不弹出更多的窗体,可以在点击打开窗体的时候将那个open按钮设置为不可用,只有关闭了子窗体再设置成可用。这些大家都可以自己去实践下,或许有更好的方法。

最后我想说的是在当今的网页设计中很流行用div在页面内去模拟一个窗体,样式自定义,交互都很不错,不一定非要用模态窗体,如何模拟网上一大把,今天就写到这里吧,有什么错误的地方请大家多指正~~

Javascript 相关文章推荐
JavaScript 事件冒泡简介及应用
Jan 11 Javascript
dotopAlert 提示用户需安装播放器的代码
Sep 17 Javascript
jQuery学习笔记 更改jQuery对象
Sep 19 Javascript
Jquery中CSS选择器用法分析
Feb 10 Javascript
浅谈jquery的html方法里包含特殊字符的处理
Nov 30 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
Apr 12 Javascript
jquery实现图片轮播器
May 23 jQuery
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
Dec 15 Javascript
JS基于for语句编写的九九乘法表示例
Jan 04 Javascript
解决VUEX兼容IE上的报错问题
Mar 01 Javascript
解决微信小程序中的滚动穿透问题
Sep 16 Javascript
vue data变量相互赋值后被实时同步的解决步骤
Aug 05 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
Oct 29 #Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
Oct 29 #Javascript
JS给Array添加是否包含字符串的简单方法
Oct 29 #Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
Oct 29 #Javascript
jQuery 移动端拖拽(模块化开发,触摸事件,webpack)
Oct 28 #Javascript
RequireJS简易绘图程序开发
Oct 28 #Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
Oct 28 #Javascript
You might like
php 上一篇,下一篇文章实现代码与原理说明
2010/05/09 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
php+ajax实时输入自动搜索匹配的方法
2014/12/26 PHP
Nginx下配置codeigniter框架方法
2015/04/07 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
PHP实现微信图片上传到服务器的方法示例
2017/06/29 PHP
javascript中的关于类型转换的性能优化
2010/12/14 Javascript
js select option对象小结
2013/12/20 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
2017/03/23 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
2017/08/14 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
vue 使用post/get 下载导出文件操作
2020/08/07 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
2020/11/06 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
简单了解python反射机制的一些知识
2019/07/13 Python
详解Python文件修改的两种方式
2019/08/22 Python
Python读取配置文件(config.ini)以及写入配置文件
2020/04/08 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
python实现快速文件格式批量转换的方法
2020/10/16 Python
matplotlib部件之套索Lasso的使用
2021/02/24 Python
2014年关于两会精神的心得体会
2014/03/17 职场文书
争先创优个人总结
2015/03/04 职场文书
业务员年终工作总结2015
2015/05/28 职场文书
python numpy中multiply与*及matul 的区别说明
2021/05/26 Python
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL