最近在项目中使用弹出模态窗口,功能要求:

  (1)模态窗口选择项目

  (2)支持选择返回事件处理

在IE中有showModalDialog 方法,可以很好的解决该问题,但是在Chrome中和FF中就有问题了,它们不支持showModalDialog方法。因此需要采用不同的处理方法。

IE中的窗口打开函数option参数定义之间必须用分号分隔,Chrome是用逗号分隔,使用时需要注意这点。

var option = "";
//居中显示,
option = "dialogWidth=" + iWidth + "px;dialogHeight=" + iHeight + 'px;dialogTop=' + iTop + 'px;dialogLeft=' + iLeft + "px;center=yes;help=no;status=no;scroll=yes;resizable=yes";
if (window.ActiveXObject) { //IE
option = "dialogWidth=" + iWidth + "px;dialogHeight=" + iHeight + 'px;dialogTop=' + iTop + 'px;dialogLeft=' + iLeft + "px;center=yes;help=no;status=no;scroll=yes;resizable=yes";
}
else { //非IE
option = 'height=' + iHeight + ',innerHeight=' + iHeight + ',width=' + iWidth + ',innerWidth=' + iWidth + ',top=' + iTop + ',left=' + iLeft+",help=no,status=no,scroll=yes,resizable=yes";
}

第一:统一的核心方法

  对于Chrome只能采用open方法弹出窗口,但是该方法不是模态的,因此代码不能实现等待窗口关闭后才返回值,只能在窗口关闭后调用一个回调函数来执行主页面的方法。

//定义回调函数变量
var CallBackFunc=undefined;
//传入回调函数名称
function SetCallBack(funcName)
{
CallBackFunc=funcName;
} //触发回调函数
function ShowOpenDialog()
{
//Do something ....
//调用主界面回调函数方法
if (CallBackFuncName != undefined) {
CallBackFuncName();
}
}

第二:在主界面调用时

$(document).ready(function(){
//设置回调函数
SetCallBack(MainDo);
//执行弹出窗口方法
ShowOpenDialog('http://....');
}); function MainDo()
{
alert('Do Result');
}

第三:弹出窗口返回值的处理

if(window.ActiveXObject){ //IE
window.returnValue =返回值;
window.close();
}else{ //非IE
if(window.opener) {
window.opener.统一返回方法(返回值);
}
window.close();
}

完整统一的核心代码:

//定义回调函数变量
var CallBackFunc=undefined;
//传入回调函数名称
function SetCallBack(funcName)
{
CallBackFunc=funcName;
}
//执行
function ShowOpenDialog(strUrl)
{
var iHeight =;
var iWidth =;
var iTop = (window.screen.availHeight - - iHeight) / ; //获得窗口的垂直位置;
var iLeft = (window.screen.availWidth - - iWidth) / ; //获得窗口的水平位置;
var option = "";
//居中显示,
option = "dialogWidth=" + iWidth + "px;dialogHeight=" + iHeight + 'px;dialogTop=' + iTop + 'px;dialogLeft=' + iLeft + "px;center=yes;help=no;status=no;scroll=yes;resizable=yes";
if (window.ActiveXObject) { //IE
option = "dialogWidth=" + iWidth + "px;dialogHeight=" + iHeight + 'px;dialogTop=' + iTop + 'px;dialogLeft=' + iLeft + "px;center=yes;help=no;status=no;scroll=yes;resizable=yes";
}
else { //非IE
option = 'height=' + iHeight + ',innerHeight=' + iHeight + ',width=' + iWidth + ',innerWidth=' + iWidth + ',top=' + iTop + ',left=' + iLeft+",help=no,status=no,scroll=yes,resizable=yes";
} var args = window.showModalDialog(strUrl, window, option);
if (window.ActiveXObject) { //IE
var args = window.showModalDialog(strUrl, window, option);
return SetSelectResult(args);
} else { //非IE
window.open(strUrl, window, option);
}
} //核心返回方法
function SetSelectResult(resultValues) {
//对resultValues 进行自定义处理
//*******
//调用主界面回调函数方法
if (CallBackFuncName != undefined) {
CallBackFuncName();
}
CallBackFuncName = undefined;
return true;
}

JS 弹出模态窗口解决方案的更多相关文章

  1. JS弹出模态窗口下拉列表特效

    效果体验:http://hovertree.com/texiao/js/20/ 或者扫描二维码在手机体验: 点击选择城市后,在弹出的层中的输入框,输入英文字母 h,会有HoverTree和Hewenq ...

  2. 2019-6-23-WPF-解决弹出模态窗口关闭后,主窗口不在最前

    title author date CreateTime categories WPF 解决弹出模态窗口关闭后,主窗口不在最前 lindexi 2019-06-23 11:48:38 +0800 20 ...

  3. WPF 解决弹出模态窗口关闭后,主窗口不在最前

    本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口.使用另一个窗口在模态窗口前面.从任务栏打开模态窗口.关闭模态窗口.这时发现,主窗口会在刚才使用的另一个窗口下面 这是 Windows ...

  4. js 弹出div窗口 可移动 可关闭 (转)

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. JS弹出子窗口

    目的 在一个主窗口中,点击一个链接, 弹出一个子窗口 , 父窗口保留 在子窗口中点击关闭, 关闭子窗口. 子窗口的位置位于屏幕的中间 实现 main.html <!DOCTYPE html> ...

  6. js 弹出div窗口 可移动 可关闭

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. JS 弹出小窗口

    弹出窗口函数 function openwindow(url,name,iWidth,iHeight){ var url; //转向网页的地址; var name; //网页名称,可为空; var i ...

  8. js弹出对话框的方法总结

    九种js弹出对话框的方法总结,需要的朋友可以参考一下 [1.最基本的js弹出对话框窗口代码] 这是最基本的js弹出对话框,其实代码就几句非常简单: <script LANGUAGE=" ...

  9. js 弹出对话框的方法总结

    原文:http://www.cnblogs.com/xiaofengfeng/archive/2012/10/20/2732784.html <!DOCTYPE html PUBLIC &quo ...

随机推荐

  1. <转>ORA-12154: TNS: 无法解析指定的连接标识符

    相信作为ORACLE数据库的开发人员没有少碰到“ORA-12154: TNS: 无法解析指定的连接标识符”,今天我也又碰到了类似的情况,将我的解决方法进行小结,希望能对碰到同样问题的友人们提供帮助. ...

  2. 难得的中文ASP.NET 5/MVC 6入门教程

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:由于ASP.NET 5还未正式发布,即使是官方文档都还不完善,更不要说系统的中文文档了 ...

  3. 安装wine的问题

  4. Unity3d 提示 "The scripts file name does not match the name of the class defined in the script!"的解决办法

    有两个原因,一个是文件的名称和类名不一致 第二个原因是有命名空间, 排除应该是可以修复的

  5. Mysql数据库操作系统及配置参数优化

    数据库结构优化 表的水平拆分常用的水平拆分方法为:1.对 customer_id进行 hash运算,如果要拆分成5个表 则使用mod(customer_id,5)取出0-4个值2.针对不同的 hash ...

  6. 三层+MVC导出Excel(2)

    背景: 出门在外,一切以健康为主,学习为辅,健康搞好了,学习也不能拉下,在外工作期间,我们在做数据导出的时候,自己封了一个类,利用NPOI进行数据导出Excel,自我感觉良好,特给大家分享一下,希望对 ...

  7. 【java基础】面向过程~面向对象

    相信大家都知道这两个东西,可是大家是如何知道的呢?我们又该如何区分这个东西到底是面向过程还是面向对象的呢? 那,我们首先就要知道什么是面向过程,什么是面向对象: 面向过程"(Procedur ...

  8. css新增选择器

  9. 在Windows下快速搭建SVN服务器 VisualSVN

    下载https://www.visualsvn.com/server/download/ 1.安装 安装SVN服务器: 安装的时候可以选择http协议还是https协议,http协议速度快一些,而ht ...

  10. 2016.8.14 HTML5重要标签以及属性学习

    1.响应网格系统,这使得它很容易把元素放在行,并指定每个元素的相对宽度 . 要注意的是: 在使用网格布局系统之前,要不把布局的元素都添加到同一个<div>中,而且这个<div> ...