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 相关文章推荐
使用JS操作页面表格,元素的一些技巧
Feb 02 Javascript
Js保留小数点的4种效果实现代码分享
Apr 12 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
May 01 Javascript
jquery+正则实现统一的表单验证
Sep 20 Javascript
100多个基础常用JS函数和语法集合大全
Feb 16 Javascript
Angular2平滑升级到Angular4的步骤详解
Mar 29 Javascript
Vue.js实战之使用Vuex + axios发送请求详解
Apr 04 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
Mar 20 Javascript
webpack 样式加载的实现原理
Jun 12 Javascript
JavaScript基础之静态方法和实例方法分析
Dec 26 Javascript
彻底揭秘keep-alive原理(小结)
May 05 Javascript
vue响应式原理与双向数据的深入解析
Jun 04 Vue.js
原生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 addslashes 函数详细分析说明
2009/06/23 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
JS仿百度搜索自动提示框匹配查询功能
2013/11/21 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
利用JS实现数字增长
2016/07/28 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
js实现无缝滚动图
2017/02/22 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
JavaScript Array对象基本方法详解
2019/09/03 Javascript
JS document文档的简单操作完整示例
2020/01/13 Javascript
Python使用scrapy抓取网站sitemap信息的方法
2015/04/08 Python
Python迭代和迭代器详解
2016/11/10 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
Pycharm激活方法及详细教程(详细且实用)
2020/05/12 Python
python interpolate插值实例
2020/07/06 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
希腊香水和化妆品购物网站:Parfimo.gr
2019/10/03 全球购物
RUIFIER官网:英国奢侈高级珠宝品牌
2020/06/12 全球购物
如果让你测试一台高速激光打印机,你都会进行哪些测试
2012/12/04 面试题
演讲稿怎么写才完美
2014/01/02 职场文书
2014年办公室人员工作总结
2014/12/09 职场文书
大学生个人总结范文
2015/02/15 职场文书
驳回起诉民事裁定书
2015/05/19 职场文书
放飞理想主题班会
2015/08/14 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
ES6 解构赋值的原理及运用
2021/05/25 Javascript
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫