1

我正在调试一个问题,并在 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 中加载它,它只为我打开“page2”大约 10 次,或者更少。这就像取决于浏览器是否可以完成'return true;' 表单提交与否之前的声明。

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

4

3 回答 3

1

正如您所说,Javascript 是单线程的。然而,它也很高兴异步工作。

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

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

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

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

希望能给你一些帮助。

于 2012-11-29T22:06:05.443 回答
0

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

我引用它:

<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> 
于 2012-11-29T21:53:29.487 回答
0

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

如果你的问题是如何解决它只是改变

return true; into -> return false;

在你的链接中

于 2012-11-29T22:05:09.430 回答