Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从弹出窗口向新选项卡提交表单,然后关闭弹出窗口,将阻止表单提交_Javascript_Html_Forms_Popup - Fatal编程技术网

Javascript 从弹出窗口向新选项卡提交表单,然后关闭弹出窗口,将阻止表单提交

Javascript 从弹出窗口向新选项卡提交表单,然后关闭弹出窗口,将阻止表单提交,javascript,html,forms,popup,Javascript,Html,Forms,Popup,我还没有完全确定这一点,因为其他人都在报道Chrome的成功,但我在Chrome44中重现了这个问题,而不是在Firefox33.1中。打开隐姓埋名模式(即无扩展),并在弹出窗口阻止程序设置中进行豁免没有任何效果 我有一个带有表单的弹出窗口,表单的目标是\u blank。其目的是表单提交将转到父窗口中的新选项卡。然后弹出窗口自动关闭 但是,除非我删除代码使弹出窗口自行关闭,否则新选项卡不会打开 我想象我在某个地方触发了弹出窗口预防(特别是因为我无法通过本地文件://URL;只能通过远程内容进行复

我还没有完全确定这一点,因为其他人都在报道Chrome的成功,但我在Chrome44中重现了这个问题,而不是在Firefox33.1中。打开隐姓埋名模式(即无扩展),并在弹出窗口阻止程序设置中进行豁免没有任何效果

我有一个带有表单的弹出窗口,表单的目标是
\u blank
。其目的是表单提交将转到父窗口中的新选项卡。然后弹出窗口自动关闭

但是,除非我删除代码使弹出窗口自行关闭,否则新选项卡不会打开

我想象我在某个地方触发了弹出窗口预防(特别是因为我无法通过本地
文件://
URL;只能通过远程内容进行复制),但我还不明白为什么在提交后关闭弹出窗口会毁了提交本身。我在开发者控制台中看不到任何相关内容

我还尝试了,而不是在submit上添加“
onclick=“setTimeout('window.close()”,1);返回true;”
,效果相同;事实上,这是我试图调试的应用程序中实际发现的糟糕代码

发生什么事了

这是一个可怕的独立测试用例,它再现了这个问题

var触发器=null;
var=null;
window.onload=函数(){
触发器=document.getElementById('trigger');
trigger.onclick=函数(){
popup=window.open(“”,'thePopup','width=450,height=450');
如果(弹出==null){
控制台。错误(“未能打开弹出窗口:(”);
}
否则{
populatePopup();
}
};
};
函数populatePopup(){
popup.document.write(“”);
popup.document.write(“”);
popup.document.write(“”);
popup.document.write(“”);
popup.document.write(“”);
}

如果不能使用ajax调用,可以尝试使用此表单target kludge: 基本上,您将表单的目标设置为包含在弹出窗口中的iframe。这将使表单提交的结果(即您正在抓取的google页面)显示在iframe中。然后,您可以在表单的onsubmit事件中将事件侦听器添加到此iframe的load事件中

<form method="GET" action="http://google.com/?q=test" target="after" onsubmit="close()">
<input type="submit" value="Click here now" />
</form>
<iframe id="after" name="after"></iframe>
<script>
function close() {
    document.querySelector('#after').addEventListener('load', function() {
        window.close();
    });
}
</script>

函数关闭(){
document.querySelector(“#after”).addEventListener('load',function(){
window.close();
});
}

Javascript事件处理程序在标准事件行为之前执行。因此,任何附加到Javascript onsubmit处理程序的代码都将在提交表单之前运行。因此使用了超时。找到更好的事件关闭弹出窗口(如提交后的服务器应答)或者自己填写表单post,或者只是在提交时使用一个超时,而不是onclick。@Shilly:Hum..将超时时间放回去,但使它变长(1s)确实有效。不过,猜测一个好的超时时间似乎很难:(超时的持续时间并不重要。即使有0秒的超时,超时运行的功能也将安排在浏览器执行的所有其他操作之后。(回流内容、运行其他脚本代码等)原始超时的问题是它触发了onclick,而不是onsubmit。@Shilly:很遗憾,显然不是。我知道不管请求的实际持续时间如何,它都应该对事件处理程序进行排队,但不管出于什么原因,1ms的超时对我来说根本不起作用(因此,我感到惊讶、困惑和疑问。好吧。我不知道表单提交的时间安排到底是如何工作的,所以如果您需要更长的超时时间……我有点担心,唉,它会不一致,所以请进行足够的测试。我真的没有真正理解这一点。我假设您正在将数据发布到某个服务器,而不关心服务器r。)响应?否则,当响应到达时,您只需关闭弹出窗口。呵呵,不错。在现实世界中,我现在增加了超时时间,但就问题的目的而言,这是非常好的。。。