javascript onclick在Firefox和Safari中的行为不同



我正在调试一个问题,发现Firefox和Safari在处理onclick JavaScript时出现了奇怪的行为。

这是我的代码:

<form id="createMessageForm" action="onclick.php?refresh=<?php echo ++$_REQUEST['refresh'];?>" method="post" >
<input type="hidden" id="iteration" value="1"/>
</form>
<a href="page2.html" target="_blank" onclick="document.getElementById('createMessageForm').submit();return true;">Hello</a>

在Firefox中加载它时,它总是为我打开"page2"。但在Safari中加载它,它只为我打开大约1/10次或更少的"page2"。这就像取决于浏览器是否能完成"return true;"是否提交表格之前的声明。

我认为JavaScript总是单线程的,那么在这样的代码中预期的行为是什么呢?

Javascript是单线程的。然而,它也很乐意异步工作。

HTTP请求在javascript中是异步事件,因为它们可能需要未知的时间才能完成。Javascript调用HTTP请求,然后继续执行它必须执行的任何其他操作,直到HTTP请求完成并将控制权返回给Javascript(或者在这种情况下,完成并触发浏览器加载新页面)。

在您的案例中,您基本上是从Javascript发出两个HTTP请求,一个接一个。第二个被触发是因为Javascript不等待第一个响应;它只是继续到下一个。您所看到的不可预测的结果基本上是两个HTTP请求中的任何一个先完成响应,然后让浏览器加载新页面的结果。

AJAX也是这样工作的——AJAX中的"A"代表异步。Javascript发出HTTP请求,并很乐意继续做任何你想做的事情。HTTP请求由浏览器处理,当请求准备好时,它会触发Javascript接收的事件。这就是为什么AJAX调用需要给它一个"success"函数,而不仅仅是在下一行代码中说if(success)

这让我提出了一个解决你问题的建议。将表单提交作为AJAX事件激发。这样,浏览器在响应时就永远不会尝试将其加载为新页面。如果你愿意,你仍然可以告诉浏览器在之后立即触发单独的页面加载,尽管我建议等待第一次调用完成,否则你不知道它是否真的成功了。

希望这能给你一些帮助。

使php重定向到page2一旦表单在onclick.php中的服务器端提交并处理,就没有任何理由做你正在做的事情,至少你写的代码没有显示任何理由这样做。

我引用它:

<form id="createMessageForm" action="onclick.php?refresh=<?php echo ++$_REQUEST['refresh'];?>" method="post" >
<input type="hidden" id="iteration" value="1"/>
</form>
<a href="page2.html" target="_blank" onclick="document.getElementById('createMessageForm').submit();return true;">Hello</a> 

您的问题是什么?基本上就是Pointy说的。取决于浏览器实现。

如果你的问题是如何修复它,只需更改

return true; into -> return false;

在您的链接中

最新更新