大家好,我用window.open打开了子窗口,一般的解决思路是在子窗口中使用window.opener来获取父窗口传值给子窗口,由于我的父窗口是用ASP.NET生成的服务器控件,不想,也不方便使用ClientID来获取元素ID,所以希望由父窗口传值给子窗口。但是在window.open后,返回的子窗口引用,然后通过这个引用去寻找子窗口的ID元素时候产生了NULL的错误,原因是子窗口没有完全加载完毕。问题来了。请问我如何用window.open打开子窗口,在子窗口完全加载完毕后再操作子窗口呢?

解决方案 »

  1.   

    你可以
    var sub = window.open(..);
    sub.onload = function(){}
    这样,但这个在IE下是不起作用的,FF是可以的,
    你可以在子页面写onload方法,去调父页的值!
      

  2.   

    没看懂楼主的意思如果是父窗口传值给子窗口
    用url 重写就可以了     open("XXX.aspx?a=asdfas")
    window.open() 方法 
      语法:window.open(pageurl,name,parameters); 
      window对象的open()方法用于创建一个新的窗口实例,新创建的窗口的外观由参数:parameters指定。新窗口中打开的文档由参数: pageurl指定。系统能够根据参数:name确定的名称访问该窗口。 如果是子窗口传值给父窗口:
    父窗口代码: var subValue = null; // 全局变量
              subValue =window.open(..);
    子窗口代码:
    window.returnValue=值;if(opener!=undefined){opener.subValue = 值;}
    IE下:用window.returnValue       w3c :opener.subValue
      

  3.   

    子窗口完全加载完毕后再操作子窗口呢?这个和父窗口 无关。
    在子窗口 : window.onload  处理就可以了
      

  4.   

    我这是一个预览页面,内容提较大,不能使用GET来通过url传递参数。我不希望是子页面来获取父页面的值,如果在子页面通过window.onload处理来获取父页面的值,
    在父页面中的是ASP.NET文本框控件,机器FCK控件的Value值,子页面是不太方面获取的。相反我在父页面直接将$("#<%=txtTitle.ClientID%>").val();赋值给子页面来说相对方便简单多。问题就在于,子页面如果没有完全加载完毕,我获取子页面元素会产生NULL的错误。如果设置等待时间也不合理,谁也不知道具体客户端加载到什么时间是完全加载完毕的,
    我只是在问。通过window.open打开新窗口,有什么机制来检测子页面是否加载完毕,确保我这个时候在父窗口是可以操作子窗口的元素的。
    谢谢。
      

  5.   

    window.document.readyState!="complete"
    这个用来检测页面是否全部打开。
    不过要 不停检测呀。直到打开才去做东西。如果父窗口传递过来的是一个比较大的参数不想通过 网址传递。可以很多种方式。楼主检测窗口打开也可以。方法:
    一:通过post 方法来加载。
    二:url 传值的时候传父窗口的 的控间Id :例如父窗口的一个隐藏域中的值传到子窗口。就在url中只传递隐藏域的id。例如:####?hidGuid=****在子窗口中同样等到加载完成后才能将父窗口的内容放到子窗口中。服务端pageload 的时候将父窗口传来的控件名称同样存在子窗口的一个隐藏域中就在子窗口的html代码最下面调用js方法即可。例如:
    <body>
     <from>
      *******html code
    **********最后调用 js方法
    <script language="javascript">
      saveInfo();
    </script>
     </form>
    </body>saveInfo 方法
    用 getElementById方法取出 子窗口隐藏域中的值 这个值就是父窗口的 控件id
    然后window.parent.opener.getElementById()取父窗口的控件实例。取值过来显示具体代码不再写了。但是:如果子窗口初始化的时候需要取到父窗口的数据做处理。最好用post 。如果只是显示方法二就挺好的。三。在open 之前将数据放入seesion 中。在子窗口中取session值处理。记着要清空session。