高版本chrome不再支持window.showmodaldialog 的临时替换方案【用window.open】

摘要:
接管别人的项目,因开发时用了showmodaldialog导致最近很多用户chrome升级到最新之后就无法弹窗了。原因是新版chrome[37+]不再支持showmodaldialog。showmodaldialog并不是W3C标准内的方法,起源于IE,当是低版本的firefox也是不支持的,后来不知怎么了又纳入了这个方法。window.showModalDialog;//定义一个全局变量判定是否有原生showModalDialog方法if(!){window.onbeforeunload=function(){window.opener.hasOpenWindow=false;//弹窗关闭时告诉opener:它子窗口已经关闭}}//定义window.showModalDialog如果它不存在if{window.showModalDialog=function{if{alert("您已经打开了一个窗口!

接管别人的项目,因开发时用了showmodaldialog 导致最近很多用户chrome升级到最新之后 就无法弹窗了。原因是新版chrome[37+]不再支持showmodaldialog。

showmodaldialog 并不是W3C标准内的方法,起源于IE, 当是低版本的firefox也是不支持的,后来不知怎么了又纳入了这个方法。貌似opera和safari都不支持。随着web标准的日益规范化,估计Firefox 和 IE都不会再支持它了。所以建议经常使用它做数据交互的同学可以抛弃它了,改用js和div封装的弹窗组件吧。

下面我贴出我解决此问题的方法。

因为我这个项目是嵌套很多iframe的。弹窗口会有数据回传。弹窗之上又有弹窗也会有值回传。3级或者更多。所以我把兼容的js代码写在一个文件,所有涉及弹窗口的页面均调用这个脚本文件:

common.js

[javascript]view plaincopy
  1. varhas_showModalDialog=!!window.showModalDialog;//定义一个全局变量判定是否有原生showModalDialog方法
  2. if(!has_showModalDialog&&!!(window.opener)){
  3. window.onbeforeunload=function(){
  4. window.opener.hasOpenWindow=false;//弹窗关闭时告诉opener:它子窗口已经关闭
  5. }
  6. }
  7. //定义window.showModalDialog如果它不存在
  8. if(window.showModalDialog==undefined){
  9. window.showModalDialog=function(url,mixedVar,features){
  10. if(window.hasOpenWindow){
  11. alert("您已经打开了一个窗口!请先处理它");//避免多次点击会弹出多个窗口
  12. window.myNewWindow.focus();
  13. }
  14. window.hasOpenWindow=true;
  15. if(mixedVar)varmixedVar=mixedVar;
  16. //因window.showmodaldialog与window.open参数不一样,所以封装的时候用正则去格式化一下参数
  17. if(features)varfeatures=features.replace(/(dialog)|(px)/ig,"").replace(/;/g,',').replace(/:/g,"=");
  18. //window.open("Sample.htm",null,"height=200,width=400,status=yes,toolbar=no,menubar=no");
  19. //window.showModalDialog("modal.htm",obj,"dialogWidth=200px;dialogHeight=100px");
  20. varleft=(window.screen.width-parseInt(features.match(/width[s]*=[s]*([d]+)/i)[1]))/2;
  21. vartop=(window.screen.height-parseInt(features.match(/height[s]*=[s]*([d]+)/i)[1]))/2;
  22. window.myNewWindow=window.open(url,"_blank",features);
  23. }
  24. }

执行弹出的当前页的方法用例:(有返回值)

[javascript]view plaincopy
  1. functionselectHotel(){
  2. url='hotel/listHotelForChoose.action';
  3. varhotelIdList=window.showModalDialog(url,"hotel","dialogWidth:1020px;dialogHeight:500px;help:no;resizable:no;center:yes;scroll:yes;status:no");
  4. if(!has_showModalDialog)return;//chrome返回因为showModalDialog是阻塞的open不一样;
  5. $("#content").append(hotelIdList);
  6. }
  7. functionselectHotelChrome(option){//为打开的窗口定义方法,让打开的窗口关闭时通过window.opener赋值回来并执行
  8. $("#content").append(option);
  9. }

子窗口这样调用:

[javascript]view plaincopy
  1. functionchooseHotels(){
  2. /*
  3. *省略了自己的业务.......
  4. */
  5. if(window.opener!=undefined){//forchrome
  6. window.opener.selectHotelChrome(contentIds);//关闭前调用父窗口方法
  7. }
  8. else{
  9. window.returnValue=contentIds;
  10. }
  11. window.close();
  12. }

免责声明:文章转载自《高版本chrome不再支持window.showmodaldialog 的临时替换方案【用window.open】》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android定位服务关闭和定位(悬浮)等权限拒绝的判断C#工作总结(一):Fleck的WebSocket使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

爬虫 selenium+Xpath 爬取动态js页面元素内容

介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏览器 from selenium import webdriver browser=web...

chrome浏览器更换favicon.ico后不更新缓存解决方案

chrome浏览器更换favicon.ico后不更新缓存 1、按ctrl+F5强制刷新或网页上右键重新载入。2、再不行就删除缓存。3、但这样太讨厌了,还有个小窍门屡试不爽,那就是直接在浏览器地址栏访问favicon文件。4、如果访问还是原先的ico文件,在浏览图片时刷新一下,再回到网站看一下,已经解决了,毕竟谁都不愿意为这个问题去清缓存和cookies什么...

Chrome浏览器安装插件postwoman

首先,点击浏览器中的“扩展程序”标签 -> 管理扩展程序               点击左上角的“扩展程序”:              然后,点击底部的“打开Chrome应用商店”:               在应用商店里面搜索即可:               使用,点击扩展中的 postwoman:              点击“接口调试...

Selenium3+python3自动化(四十一)--Chrome浏览器静默模式启动(headless)

前言 Chrome浏览器可以实现静默模式,在电脑上不显示页面,也能实现自动化测试。 小编环境: python 3.7 selenium 3.141.0 Chrome浏览器 84.0.4147.135 chromedriver    84.0.4147.30 headless 1.启动浏览器的时候不想看到浏览器运行,那就加载浏览器的静默模式,让它在后台偷偷运...

Chrome 扩展crx开发

Chrome扩展提供的入口 左键 crx,popup 右键 crx,homelink + option 右键上下文菜单 Chrome扩展的文件结构 Chrome扩展就是一个文件夹下包括一堆符合规范的文件。首先是清单文件manifest.json,指定了该扩展的整体布局和结构。实例: { // 清单文件的版本,这个必须写,而且必须是2 "mani...

Puppeteer之爬虫入门

译者按: 本文通过简单的例子介绍如何使用Puppeteer来爬取网页数据,特别是用谷歌开发者工具获取元素选择器值得学习。 原文: A Guide to Automating & Scraping the Web with JavaScript (Chrome + Puppeteer + Node JS) 译者: Fundebug 为了保证可...