JS 弹出模态窗口解决方案

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

  (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 =400;
    var iWidth =500;
    var iTop = (window.screen.availHeight - 30 - iHeight) / 2;       //获得窗口的垂直位置;
    var iLeft = (window.screen.availWidth - 10 - iWidth) / 2;        //获得窗口的水平位置;
    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;
}
时间: 2024-10-12 13:06:28

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

extjs 弹出模态窗口

1.定义form [javascript] view plain copy var form1 = Ext.create('Ext.form.Panel', { id:'form1', frame: true, //title: 'Form Fields', //width: 340, bodyPadding: 5, //baseCls: "x-plain", fieldDefaults: { labelAlign: 'left', labelWidth: 90, anchor: '1

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

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title&

js 弹出对话框的方法总结

原文:http://www.cnblogs.com/xiaofengfeng/archive/2012/10/20/2732784.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.o

***小程序wx.getUserInfo不能弹出授权窗口后的解决方案

微信更新api后,wx.getUserInfo在开发和体验版本都不能弹出授权窗口.微信文档说明: 注意:此接口有调整,使用该接口将不再出现授权弹窗,请使用 <button open-type="getUserInfo"></button> 引导用户主动进行授权操作 当用户未授权过,调用该接口将直接报错 当用户授权过,可以使用该接口获取用户信息 对此,给出以下解决方案. wx.getUserInfo({ withCredentials: true, success

JS弹出窗口代码大全(详细整理)

1.弹启一个全屏窗口 复制代码代码如下: <html> <body http://www.jb51.net','脚本之家','fullscreen');">; <b>www.jb51.net</b> </body> </html> 2.弹启一个被F11化后的窗口 复制代码代码如下: <html> <body 'http://www.jb51.net','脚本之家','channelmode');"

Js弹出窗口代码,window.open方法

<html><script language=JavaScript> <!--function click() {if (event.button==2) {window.open('#','popwindows',"toolbar=no,menubar=no,width=200,height=200")}}document.onmousedown=click//--></script><head><meta http-

js弹出窗口总结6种弹窗方法

注: //关闭,父窗口弹出对话框,子窗口直接关闭 this.Response.Write("<script language=javascript>window.close();</script>"); //关闭,父窗口和子窗口都不弹出对话框,直接关闭 this.Response.Write("<script>"); this.Response.Write("{top.opener =null;top.close();}

VS C# .NET WebBrowser控件 利用插入JS代码,实现控制弹出IE窗口

最近在做一个客户端程序,使用到自带的WebBrowser控件时,发现当JS调用window.open()或a标签的target="_blank"时使用的是弹出IE窗口,不知道为什么是这种设计,根本不满足需求嘛.上网查了一下相关资料,发现这个控件并没有属性能控制这个功能,于是找第三方控件,发现也还是不行(可能是我不够仔细尝试),而且要多出个几十兆的DLL.经过我几个小时的努力,放弃了...! 知道C#是可以与网页的JS交互的,于是想到网页上重写window.open()的方法,建一个HT

JS弹出框、对话框、提示框,JS关闭窗口、关闭页面和JS控制页面跳转

一.JS弹出框.对话框.提示框 //====================== JS最常用三种弹出对话框 ======================== //1弹出对话框并输出一段提示信息 function ale() { //弹出一个对话框 alert("提示信息!"); } //2弹出一个询问框,有确定和取消按钮 function firm() { //利用对话框返回的值 (true 或者 false) if (confirm("你确定提交吗?")) { a