博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高版本chrome不再支持window.showmodaldialog 的临时替换方案【用window.open】
阅读量:5084 次
发布时间:2019-06-13

本文共 2285 字,大约阅读时间需要 7 分钟。

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

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

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

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

common.js

 

[javascript] 
 
 
  1. var has_showModalDialog = !!window.showModalDialog;//定义一个全局变量判定是否有原生showModalDialog方法  
  2. if(!has_showModalDialog &&!!(window.opener)){         
  3.     window.οnbefοreunlοad=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) var mixedVar = mixedVar;  
  16.         //因window.showmodaldialog 与 window.open 参数不一样,所以封装的时候用正则去格式化一下参数  
  17.         if(features) var features = 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.         var left = (window.screen.width - parseInt(features.match(/width[\s]*=[\s]*([\d]+)/i)[1]))/2;  
  21.         var top = (window.screen.height - parseInt(features.match(/height[\s]*=[\s]*([\d]+)/i)[1]))/2;  
  22.         window.myNewWindow = window.open(url,"_blank",features);  
  23.     }  
  24. }  

 

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

 

[javascript] 
 
 
  1. function selectHotel(){  
  2.     url = 'hotel/listHotelForChoose.action';  
  3.     var hotelIdList = 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. function selectHotelChrome(option){
    //为打开的窗口定义方法,让打开的窗口关闭时通过window.opener赋值回来并执行  
  8.     $("#content").append(option);  
  9. }  

子窗口这样调用:

 

 

[javascript] 
 
 
  1. function chooseHotels() {  
  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. }  
  13. 来源: 

 

转载于:https://www.cnblogs.com/Jeremy2001/p/9750455.html

你可能感兴趣的文章
(转)linux sort,uniq,cut,wc命令详解
查看>>
关于ExecuteNonQuery执行的返回值(SQL语句、存储过程)
查看>>
UVa540 Team Queue(队列queue)
查看>>
mysql数据增删改查
查看>>
shell中下载最新版本或指定版本的办法(Dockerfile 中通用)
查看>>
极客时间-左耳听风-程序员攻略-分布式架构工程设计
查看>>
akka之种子节点
查看>>
不知道做什么时
查看>>
matlab 给某一列乘上一个系数
查看>>
密码学笔记——培根密码
查看>>
Screening technology proved cost effective deal
查看>>
MAC 上升级python为最新版本
查看>>
创业老板不能犯的十种错误
查看>>
Animations介绍及实例
查看>>
判断请求是否为ajax请求
查看>>
【POJ2699】The Maximum Number of Strong Kings(网络流)
查看>>
spring boot配置跨域
查看>>
BZOJ 1996 合唱队(DP)
查看>>
进击吧!阶乘——大数乘法
查看>>
安卓学习资料推荐-25
查看>>