刚刚接手一个很老的ASP系统维护,以前的同事走的时候留下一个相当棘手的问题,我多方尝试也没有成功,特来此求教,闲话不表,我的问题如下:
功能场景:点击列表中的工单信息弹出一个工单的详细信息
问题:此功能在IE6,IE7和一部分IE8用户下没问题,但一部分IE8用户使用时浏览区弹出这么一个对话框“您正在查看的网页正在试图关闭窗口,您确定要关闭吗”,我点击是的话这个页面就关闭了,我点击否的话页面虽然在,但内容缺是空的(除了页面使用的背景图),由于原先的系统涉及到的代码有上千处,改代码不现实,因此我尝试了各种修改浏览器设置的方法,均为能解决这一问题,我尝试的方法有:
(1)点击兼容性视图,将目标网站添加到其中
(2)修改安全性—自定义级别中的脚本访问设置
(3) internet选项-高级 中的设置。再次真心求教大神或遇到过类似情况同仁们,如何通过除了修改代码和重装系统外的任何方法解决这一问题?
  ps:我原先的IE(也是IE8)可以正常浏览(不知道是不是和我安装操作系统时安装的不是完全本有关),尽早我重装了IE8之后就报那个错误了。js代码如下
function ShowPage(str)
{
    var o=parent.wLoader.correctPage(2)    
    var sRan="SHOWDETAIL"+parseInt(10000*Math.random())
    if(parent.windowMSGDetail==null) parent.windowMSGDetail=[]
    parent.windowMSGDetail[parent.windowMSGDetail.length]=parent.open("",sRan,"resizable=1,scrollbars=0,toolbar=0,location=0,left=50,top=50,width=700,height=400")
    o.innerHTML+="<input type=hidden name='selectedRow' value='"+str+"'>"
                +"<input type=hidden name='sID' value='"+parent.parent.document.all['__USER_ID'].value+"' />"    
    o.action="../Public/HandlePage.asp"
    o.target=sRan
    parent.document.body.onbeforeunload=function() 
    {        
        var oToClose=parent.windowMSGDetail
        for(var i=0;i<oToClose.length;i++)
        {
            try { oToClose[i].close() } catch(exp) {continue}
        }                    
    }
    o.submit()
}asp代码如下:
<%    
    var sDBOwner=Application("DBOwner")
    var table=new Grid()    
    table.limit="distinct"
    table.append("排放单号","A.ID",100)    
    table.append("罐号/系统号","B.BUCKET_NO",80)
    table.append("液位/压力","B.LIQUT_ALTITUDE",100)
    table.append("签发人","B.APPLY_USRID",60)
    table.append("签发时间","TO_CHAR(B.APPLY_DATE,'YYYY-MM-DD HH24:MI')",140)
    table.append("当前状态","C.Status_Info")            
    table.tables=sDBOwner + ".GREMS_STATUS A," + sDBOwner + ".GREMS_APPLY B," + sDBOwner+".GREMS_Status_Info C"
    table.filter="A.ID=B.ID AND A.CURRENT_STATUS=C.CURRENT_STATUS"    
    table.rAttri="@onclick=ShowPage(^1^)"
    table.sort="A.ID"
    s=(""+Request.QueryString("s")).toUpperCase()
    var sf
    switch(s)
    {
        case "DEFAULT":
        case "APP":sf=" < 16";break
        case "SAM":sf="IN ('APP','ALS','AQT','SMP')";break    
        case "ANA":sf="IN ('ALS','CQT','ISA')";break
        case "CHK":sf="IN ('ISA','WQT')";break
        case "COM":sf="IN ('CHK','CQT','RLS')";break
        case "CM2":sf="IN ( 'CFM','RLS')";break
        case "RLS":sf="IN ('RLS','PUS','HLT','RLG')";break
        default:
            Response.Clear()
            Response.End()
    }            
    var sFlag
    if(s == "APP"||s =="DEFAULT") sFlag="C.Status_NO" 
    else sFlag="A.CURRENT_STATUS"
    table.filter += " AND "+sFlag+" "+sf
    
    table.Build()
    table=null
%>

解决方案 »

  1.   

    弹出对话框,可以用div模拟 oToClose[i].close()这个的问题
      

  2.   

    看着就是执行close方法的提示
    处于安全性考虑,用脚本关闭窗口会弹出提示
    解决的办法当然是创建一个层(可以是一个绝对位置的div,里面放一个iframe),把要弹出的页面加载到这个iframe,这样可以通过隐藏该层来关闭弹窗,并且会随着父窗口关闭而关闭,不用另外写代码关闭它
      

  3.   

    http://www.2cto.com/kf/201206/137798.html
    人家要考虑安全.
    一般项目对这种常规弹窗都应该是封装滴,不可能随处乱用,页面到处写open,Close,所以很容易统一调整效果.调浏览器是下下策,用户有习惯,统一了再让人家改那是灰常不爽的.
      

  4.   


    您好,我也怀疑是这里的问题,可是在调试的过程中,我把这一句代码注释掉,情况还是没有改变,于是我参照网上的方法,把这一句改为
    oToClose[i].opener = null
            oToClose[i].open("", "_self")
            oToClose[i].close()
    这三句,还是不行