showModalDialog弹出一个窗口,使子窗口在父窗口之上。且子窗口必须关闭才能对父窗口操作

来源:互联网 发布:mac 网页数据采集器 编辑:程序博客网 时间:2024/05/18 00:04

一、在主窗体中:

1、
 function  BySearch(layerid) 
{  
     if(window.showModalDialog("../BySearch.aspx?id="+layerid,window,"status=no;dialogWidth=800px;dialogHeight=600px;menu=no;resizeable=yes;scroll=yes;center=yes;edge=raise")=="OK")   {
   // window.location.reload();
     window.document.forms(0).submit();

  //注意此处若使用document.location.reload(); 会导致“要再次显示该网页,internet exploer 需要重新发送您以前提交的信息”的问题,因此用window.document.forms(0).submit(); 更好。

      }
  }

 

同时在老网页的GridView中需要添加Page_PreRender事件,在Page_PreRender中将GridView中的数据重新绑定一次即可,否则window.document.forms(0).submit(); 不起作用。

  protected void Page_PreRender(object sender, EventArgs e)
    {
        bindData();
    }

2、BntSearch.Attributes.Add("onclick", "BySearch(" & layerid & ")")

 

二、在子窗体中:

   服务器端按钮:

   Response.Write("<script language=javascript>window.returnValue='OK';self.close();</script>")

 

三、在子窗体中清空ShowModalDialog数据缓存

    Response.Expires = -1

 

 

 

 

四、以下为弹出窗体参考:

        有时修改了某些数据,然后通过ShowModalDialog来显示,这时通常显示出来的数据还是上一次的数据

        可能ShowModalDialog缓存机制的问题,这时你就需要手动的去清除缓存或者写一些代码……

        HTML方面

        <meta http-equiv="pragram" content="no-cache">

        禁止浏览器从本地缓存中调阅页面。

        网页不保存在缓存中,每次访问都刷新页面。

        <meta http-equiv="cache-control" content="no-cache, must-revalidate">

        同上面意思差不多,必须重新加载页面

        <meta http-equiv="expires" content="0">

        网页在缓存中的过期时间为0,一旦网页过期,必须从服务器上重新订阅。

        .NET方面

        Response.Expires = -1;

 

 

 

 

<script language="javascript" type="text/javascript">
    function  ScanMessageDetail(messageId) 
{  
 if(window.showModalDialog("testclose.aspx?messageid="+messageId,"","status=no;dialogWidth=800px;dialogHeight=500px;menu=no;resizeable=yes;scroll=yes;center=yes;edge=raise")=="OK")   {

       window.document.forms(0).submit(); 
       document.location.href = "DataListTest.aspx";
      }
  }
</script>
在后台中注册脚本
protected void GridView1_RowDataBound(object sender,GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            e.Row.Attributes.Add("onclick", "ScanMessageDetail(4939)");
        }
    }

 

在目标页的关闭按钮

客户端按钮:
<input id="Button1" type="button" value="关闭"  onclick="javascript:window.returnValue='OK';self.close();"/>

服务器端按钮:
1、在子窗口<head>里加一句   <base   target=_self>
2、Protected Sub BntClose_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        按钮事件
        Response.Write("<script language=javascript>window.returnValue='OK';self.close();</script>")
    End Sub
3、若子窗口中用的是UpdatePanel,则用Response.Write会出错,此时应用<Triggers>
   </ContentTemplate>
   <Triggers>
     <asp:PostBackTrigger ControlID="BntClose" />
    </Triggers>      
   </asp:UpdatePanel> 

 

 

在字窗口里面设置  
  <body   onbeforeclose="parent.location.value='你想要的地址'">

window.opener.location="xxxx.asp"试试

 

 

 


showModalDialog()子窗口刷新父窗口 收藏
今天再次使用showModalDialog(),发现了两个问题,一是子窗口如何刷新父窗口,二是窗口的参数问题。

1 子窗口刷新父窗口

   如果是window.open();问题就好办,直接用window.opener.location.reload();就搞定了

   但是如果是window.showModalDialog(),它里面是没有window.opener的,不能用opener引用父窗口,直接调用用报错。

总结了一下有两种方法可以解决,一是在子窗口中刷新父窗口,二是在子窗口关闭后,父窗口自己刷新。

 (1)在子窗口中刷新父窗口

       父窗口: 因为子窗口不能直接引用父窗口,所以需要父窗口主动传递指针变量,就是window.showModalDialog的第二个参数,参数为“window”,

示例:

var returnValue = window.showModalDialog(url,window,"dialogHeight=350px;dialogWidth=400px;center=yes;status=no;scroll=no;resizable=yes");

注意:window不要加引号。

子窗口:执行完操作后调用window.dialogArgument.location.reload();

网上说只调用这一句就可以了,但我试了不行,具体原因没查到,自己猜测要这么用,父窗口必须是iframe. 如果父窗口不是iframe,想要实现这个功能,还可以在body中加入"onUnload=window.dialogArgument.location.reload()" ,这样子窗口关闭时就可以刷新父窗口了。

(2)在父窗口中刷新自己

这个实现比较简单,在子窗口关闭后,父窗口自己刷新,例如:

var returnValue = window.showModalDialog(url,window,"dialogHeight=350px;dialogWidth=400px;center=yes;status=no;scroll=no;resizable=yes");
        if(returnValue == "true"){
            window.location.reload();
        }

还有一种方法就是在子窗口中调用父窗口的一个方法,该方法自己刷新本页面(父窗口);

子窗口:window.dialogArgument.reloadPage();window.close;

父窗口: function reloadPage(){window.location.reload();}

但是我试验后不行,能调用到这个方法,但是就是不刷新,原因不详。

2 showModalDialog参数问题:

vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures]);

第三个参数用来描述对话框的外观等信息,我调整了半天都不见效,后来发现原因出现在两个地方:

(1)长度,宽度,都是用 dialogHeight, dialogWidth表示,而不是heigh,width,和window.open()是不同的。

(2)多个参数用";"分割,而不是用","。

原创粉丝点击