主题:
不甘心:A窗口打开B窗口,B窗口提交到A窗口时,同时关闭B窗口,如何实现?内容:
javascript:window.form1.submit();window.close() 问题在于,提交时,有时window.close()先执行完成,于是submit()没有被执行。 8次提交有5-6次不成功。回复:
B ----- <form target="_parent" οnsubmit="window.close()"回复:
加个setTimeout不就行了吗?回复:
先把form1的method改为get再试试 javascript:window.form1.submit();window.close()回复:
to wsj(骆驼) :_parent是FRAME中用的吧?用PARENT无法找到A窗体。 to ZeusLion(亮) :延时不是办法,时间不好确定。 to JK_10000(JK1) :改成GET有什么道理呢? 我先把 window.close()放到onsubmit中试试。回复:
file A: window.open('filename.XXX','', 'height=300,width=300'); file B:submit先提交给自己,在文件最后检测提交标志 if( **** == "1") { window.close(); opener.focus(); opener.location.reload(); //refresh the opener window }回复:
测试: index.htm: <a href=a.htm target="a">test_index</a> a.asp <a href=b.htm target="_blank">test</a> b.htm <html><head/><body> <form target="a" action="a.asp" method="post" οnsubmit="window.close();"> <input type="text" name=t value="111"> <INPUT type="submit" value="Submit" id=submit1 name=submit1> </form> </body>回复:
to JK_10000(JK1) :改成GET有什么道理呢? ------------------------------------------ 如果用get方式提出请求,它的数据通过url重组送到服务器,即:一旦请求,数据就传出,不会丢失。 如果用post方式提出请求,它的数据是服务器端程序通过http协议到客户端取,如果在把数据取出来之前窗口的窗口已完成关闭,将找不到数据源,造成“提交失败”的现象----请注意:post方式并不“提交”数据。 这样分析,可以认为get方式不会提交失败。 说明: 1.以上内容部分是JK自己的理解,如有错误,见谅 2.JK没有测试,如果楼主测试失败,见谅回复:
form1的action文件最后加一句 <script language='javascript'> window.close(); </script> 就可以回复:
...... </body> </html> <script language='javascript'> if (是否提交){ window.close(); } </script>回复:
可以用 在b页的onunload时 window.returnValue 返回到A页 在提交到A页回复:
在A里面关闭B回复:
我猜想,楼主把A窗作为主窗口,某个问题需要弹出个新窗口B(也许便于排版什么的)来操作,然后在该新窗口点击提交,同时关闭新窗口,回到主窗口。 这个思路在实际使用中比较合理。 并猜想服务器对表单提交的回应是发送到主窗口A。(不会没有回应吧?) 指出服务器回应窗口/框架的是FORM的target属性。 B窗口中,得到A窗口的名字用sNameWindowA=window.opener.name --------------------------------------------------------- 偶认为,楼主代码出错的原因有可能是: JS编译器发出submit()指令后,立即执行window.close()指令;这样JS编译器的任务倒是完成了,但是WebBrowser控件(就是IE自身)尚未执行完submit指令带来的数据发送任务,就接到了关闭窗口指令;关闭窗口指令在WebBrowser中优先级高于数据发送任务(例如你大概可以在数据发送/下载过程中点击关闭窗口),这样数据发送尚未完成便被终止了,造成提交不成功。 所以, 1.如果在B窗中提交,必须在关闭指令被执行前确认数据提交成功。 这里,单纯的setTimeout是没有用的,因为你不知道网络状况如何,无法给出一个确切的时间段。 如果定时检查发送状态由B窗自行关闭,还不如在A窗口的回应中(或者OnUnload事件处理程序中,——究竟A窗是在什么时候开始unload,在数据发送开始时,还是接到首个服务器端回应页面数据时,这个你恐怕要自己试,才能决定是否能用onUnload事件)加上关闭B窗指令来得方便。 但是你在A窗回应页面的body onload事件中关闭B是肯定不会出错的。(通过调整服务器端程序的执行顺序,你可以安全地将执行关闭B窗的指令提前。不过正如刚才所说的,你得试试) 这里,你可以在B窗的submit()指令之后,加上window.opener.focus(),这样在提交一执行就立即将焦点还给A窗,不过B窗并未关闭,等待数据上载完成。 2.在A窗中设一个visible='none'的DIV,在B窗口点击提交按键(之所以说是提交按键,这个按键不一定非要包含在FORM中,如果没有包含,全部由函数回应点击;如果包含,在onsubmit中回应false取消提交,再由函数处理)时, 将整个form1的outerHTML写到A窗的隐含DIV中,submit A窗的这个form(不要带有target属性或target=_self),关闭B窗。 你可能需要setTimeout一点时间来确保form1在A窗的DIV中生效,不过我想100ms足够了。 或者,在插入的form1后面再插入一小段动态Script脚本来执行提交也行,如此便不用设定时了。 ----------------------------------------------------------------- 以上两种方法应该都能成功解决你的问题。回复:
WebBrowser和JS编译器是不大同步的,大家可以用两个挺长时间的空循环,中间和后面加上往窗口里写上点东西来看看。 例如: { 循环1000次 document.write("AAAAAA"); 循环10000次 document.write("BBBBBB"); } 你以为会先看到AAAAAA,等一会再看到BBBBBB么? 不会的,你一定会同时看到这两个玩意。回复:
由于有更重要的问题,先结了此帖,新帖讨论。回复:
超级菜鸟的提议很好,但不知道如何在A窗口中关闭B。