谷歌浏览器Chrome不再支持showModalDialog的解决办法
2017-08-01 11:03
851 查看
2014年的某一天,chrome升级后,突然发现某个在用的系统不能弹出模态窗口了,查找各种资料后确认新版本(可能为Chrome 37+)确实把这个支持去掉了,有这么坑人的吗!?为避免大家少走弯路,特发布此文提供确认躺枪和解决办法。
弹出窗口编码:
浏览器异常:
Uncaught TypeError: undefined is not a function如果出现这个异常,很不幸你已经躺枪了。关于这个问题可以看这里:
http://windowsitpro.com/blog/google-kills-showmodaldialog-api-chrome-37-and-does-evil-exchange-owa
http://www.infoq.com/news/2014/09/chrome-showmodaldialog
其中有些临时解决办法,但貌似showModalDialog不会回来了。
常见的弹出窗口有div模拟或者用window.open代替,对于一个已经在用的系统来说,采用div方式转换成本较高,采用window.open改动会更少一些,但也会丢失其模态性。
这里采用简单的window.open方案,毕竟替换成本低很多。针对上文中提到的showModalDialog使用方式,替换为:
采用这种方式就可以打开一个和之前使用showModalDialog差不多的窗口。但是怎么返回值呢?
在弹出页面中有两种方式:
1、直接设置父窗口的DOM对象的值。
父窗口中应该有一个id为parentWindowControllId的DOM元素。
2、调用父窗口中的Javascript函数,由父窗口进行相应的处理。
父窗口提供一个DoAfterXXX的函数就可以了。
长远来看window.open由于其用户体验问题必将走向没落,大家还是尽快转移为好。
问题重现
弹出窗口编码: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如果出现这个异常,很不幸你已经躺枪了。关于这个问题可以看这里:
http://windowsitpro.com/blog/google-kills-showmodaldialog-api-chrome-37-and-does-evil-exchange-owa
http://www.infoq.com/news/2014/09/chrome-showmodaldialog
其中有些临时解决办法,但貌似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");
采用这种方式就可以打开一个和之前使用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由于其用户体验问题必将走向没落,大家还是尽快转移为好。
相关文章推荐
- 谷歌浏览器Chrome不再支持showModalDialog的解决办法
- 谷歌浏览器Chrome不再支持showModalDialog的解决办法
- 谷歌浏览器Chrome不再支持showModalDialog的解决办法
- 谷歌浏览器Chrome不再支持showModalDialog的解决办法
- Chrome谷歌浏览器下不支持css字体小于12px的解决办法【原创】
- Chrome谷歌浏览器下不支持css字体小于12px的解决办法
- Chrome谷歌浏览器下不支持css字体小于12px的解决办法
- Chrome谷歌浏览器下不支持css字体小于12px的解决办法
- 谷歌 字体小于12, Chrome谷歌浏览器下不支持css字体小于12px的解决办法
- Win7无法将图标(Chrome谷歌浏览器更新后无法锁定也适用)锁定到任务栏解决办法
- Chrome谷歌浏览器中js代码Array.sort排序的bug乱序解决办法
- directx10不再支持.x文件的解决办法
- xcode 4.2 不再支持 Window-Based Application 的解决办法
- 谷歌浏览器不支持showModalDialog解决方法
- EXT复合表头谷歌浏览器Chrome错位解决办法
- xcode 4.2 不再支持 Window-Based Application 的解决办法(转载)
- window.showModalDialog在谷歌浏览器下无法取得返回值的解决办法。
- ie chrome 跟 火狐 中 select 下拉框 option中不支持onclick事件的解决办法
- 关于chrome showModalDialog不兼容的解决办法
- xcode 4.3 不再支持 Window-Based Application 的解决办法