遇到的问题

window.showModalDialog()函数仅能应用于IE浏览器,属于IE浏览器的函数,若想应用于其他浏览器,只能使用window.open()进行替代,但是由于两者并非完全一致,可以说open()完全无法胜任替代showModalDialog()工作,最主要的就是showModalDialog()提供了一个子窗口与父窗口的一个传值交互的功能。所以最好的方式就是自己写一个showModalDialog()方法,让浏览器直接调我们自己写的showModalDialog()方法。

解决方案

下面直接上代码。
showModalDialog.js

(function() {window.spawn = window.spawn || function(gen) {function continuer(verb, arg) {var result;try {result = generator[verb](arg);} catch (err) {return Promise.reject(err);}if (result.done) {return result.value;} else {return Promise.resolve(result.value).then(onFulfilled, onRejected);}}var generator = gen();var onFulfilled = continuer.bind(continuer, 'next');var onRejected = continuer.bind(continuer, 'throw');return onFulfilled();};window.showModalDialog = window.showModalDialog || function(url, arg, opt) {url = url || ''; //URL of a dialogarg = arg || null; //arguments to a dialogopt = opt || 'dialogWidth:300px;dialogHeight:200px'; //options: dialogTop;dialogLeft;dialogWidth;dialogHeight or CSS stylesvar caller = arguments.callee.caller.toString();var dialog = document.body.appendChild(document.createElement('dialog'));dialog.setAttribute('style', opt.replace(/dialog/gi, ''));dialog.innerHTML = '<a href="#" id="dialog-close" style="position: absolute; top: 0; right: 5px; font-size: 20px; color: #000; text-decoration: none; outline: none;">&times;</a><iframe id="dialog-body" src="' + url + '" style="border: 0; width: 100%; height: 100%;"></iframe>';document.getElementById('dialog-body').contentWindow.dialogArguments = arg;document.getElementById('dialog-close').addEventListener('click', function(e) {e.preventDefault();dialog.close();});dialog.showModal();//if using yield or async/awaitif(caller.indexOf('yield') >= 0 || caller.indexOf('await') >= 0) {return new Promise(function(resolve, reject) {dialog.addEventListener('close', function() {var returnValue = document.getElementById('dialog-body').contentWindow.returnValue;document.body.removeChild(dialog);resolve(returnValue);});});}//if using evalvar isNext = false;var nextStmts = caller.split('\n').filter(function(stmt) {if(isNext || stmt.indexOf('showModalDialog(') >= 0)return isNext = true;return false;});dialog.addEventListener('close', function() {var returnValue = document.getElementById('dialog-body').contentWindow.returnValue;document.body.removeChild(dialog);nextStmts[0] = nextStmts[0].replace(/(window\.)?showModalDialog\(.*\)/g, JSON.stringify(returnValue));eval('{\n' + nextStmts.join('\n'));});throw 'Execution stopped until showModalDialog is closed';};
})();

同时要注意window.dialogArguments与showModalDialog()属于关联方法,dialogArguments用于获取showModalDialog()打开的窗口的父窗口,所以dialogArguments也不被谷歌支持,需要调整一下

    var ua = navigator.userAgent;var ope = window.dialogArguments;//谷歌通过parent获取父窗口if (/chrome/i.test(ua)) {ope = window.parent;}

关于谷歌不兼容showModalDialog的解决方案相关推荐

  1. Chrome不支持showModalDialog的解决方案

    Chrome不支持showModalDialog的解决方案 昨天在使用showModalDialog的时候,遇到如下问题: 如果子窗口被刷新过,那么父窗口就接受不到子窗口的返回值. 为了解决这个问题, ...

  2. 常见前端浏览器兼容问题及解决方案

    常见前端浏览器兼容问题及解决方案 所谓的浏览器兼容性问题,是指因为不同的浏览器对同一段代码有不同的解析,造成页面显示效果不统一的情况.在大多数情况下,我们的需求是,无论用户用什么浏览器来查看我们的网站 ...

  3. Web前端页面的浏览器兼容性测试心得(三)总结一些IE8兼容问题的解决方案

    Web前端页面的浏览器兼容性测试心得(三)总结一些IE8兼容问题的解决方案 参考文章: (1)Web前端页面的浏览器兼容性测试心得(三)总结一些IE8兼容问题的解决方案 (2)https://www. ...

  4. php json json_unescaped_unicode,php中json_encode不兼容JSON_UNESCAPED_UNICODE的解决方案

    PHP5.4才支持JSON_UNESCAPED_UNICODE这个参数,此参数是让中文字符在json_encode的时候不用转义,减少数据传输量.但在PHP5.3中,就得自己写个函数来实现,以下就是解 ...

  5. 常见的移动端兼容问题以及解决方案

    常见的移动端兼容问题以及解决方案 禁止ios识别长串数字为电话 解决方法:添加 meta 属性 <meta content="telephone=no" name=" ...

  6. 关于pdfplumber和pdfminer不兼容的问题解决方案

    关于pdfplumber和pdfminer不兼容的问题解决方案 本人在实现有关pdf的读取任务当中,由于各类pdf文件的格式有所差异,因此使用了各种不同的pdf读取方式,但程序一直报错找不到特定的文件 ...

  7. 常见的浏览器兼容问题及解决方案

    1 浏览器内核 不同浏览器的内核也不尽相同,所以各个浏览器对网页的解析存在一定的差异. 常见的浏览器内核: 浏览器名称 内核 IE Trident内核,也称IE内核 Chrome(谷歌) 以前是Web ...

  8. 内存双通道不兼容举例以及解决方案.

    知乎上碰到两种不兼容的. ----------------------------------------------------------------------------------- 一种是 ...

  9. 运行虚拟机报错:vmware workstations与devicecredential不兼容(终极解决方案)

    运行虚拟机报错:vmware workstations与devicecredential不兼容 参考文献: 终极解决方案: https://jingyan.baidu.com/article/da10 ...

  10. seata不兼容mysql8的解决方案

    前言 数据库:8.0.16版本. seata:0.9.0 问题 启动seata之后,空指针异常之类的各种错误. 原因 seata不兼容8.x.x的数据库. 解决方案 删除旧jar包,更换新jar包 注 ...

最新文章

  1. Centos 7使用vsftpd搭建FTP服务器
  2. 关于__defineGetter__ 和__defineSetter__的说明
  3. c++ post请求_前端工程师进阶:网络请求方法详解,GET和POST的区别
  4. 22 Python IO、打印到屏幕、读取键盘输入、打开和关闭文件、文件定位、重命名和删除文件、Python里的目录、文件,目录相关的方法
  5. 【数据结构与算法】之深入解析“柱状图中最大的矩形”的求解思路与算法示例
  6. zookeeper的设计猜想-防止单点故障
  7. 洛谷——P1068 分数线划定
  8. TZOJ 4621 Grammar(STL模拟)
  9. Go http访问使用代理
  10. 空间参考不存在_空间实景三维信息如何服务于BIM应用
  11. 安装tif虚拟打印机
  12. 如何利用caffe自带的工具包绘制accuracy/loss曲线
  13. 【图像融合】基于matlab遗传算法图像融合【含Matlab源码 1624期】
  14. 2021-08-25剑指 Offer 13. 机器人的运动范围
  15. 资源协调与跨部门沟通技巧
  16. 统计学——线性回归决定系数R2
  17. 余世维《有效沟通》讲义1
  18. Altium Designer 18 生成网络表
  19. 小组取什么名字好_最好的小组该取什么名字呢?
  20. [论文笔记] 视频广告内容结构的多模态表示学习

热门文章

  1. Cisco Packet Tracer入门--三层交换机局域网搭建教程
  2. matlab mac问题,mac版的matlab出现问题,有大神帮忙看一下吗
  3. [转]java代码混淆以及及IDEA中springboot使用Allatori进行混淆
  4. 强化学习Q-Learning实现机器人走迷宫
  5. 2022-2027年中国北斗卫星导航系统行业市场调研及未来发展趋势预测报告
  6. Android开发:ZXing条码扫描-竖屏解决方案
  7. 宾馆管理系统(做了ppt忘记发博客了)
  8. 花了3个月,濒临崩溃的K8S集群有救了……
  9. 接口测试常见问题及答案
  10. 分享免费下载论文的网站