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;

}

 

你可能感兴趣的:(解决方案)