A窗口打开B窗口,B窗口提交到A窗口时,同时关闭B窗口

主题:
不甘心: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。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值