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

Firefox和Safari中的javascript onclick行为不同?,javascript,firefox,safari,onclick,submit,Javascript,Firefox,Safari,Onclick,Submit,我正在调试一个问题,发现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

我正在调试一个问题,发现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>

使php重定向到第2页一旦表单在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> 

使php重定向到第2页一旦表单在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> 

你的问题是什么?这基本上就是波蒂所说的。取决于浏览器实现

如果你的问题是如何解决,那就改变一下

return true; into -> return false;

在你的链接中,你的问题是什么?这基本上就是波蒂所说的。取决于浏览器实现

如果你的问题是如何解决,那就改变一下

return true; into -> return false;

在您的链接中,正如您所说,Javascript是单线程的。但是,异步工作也很好

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

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

这也是AJAX的工作原理——AJAX中的“A”代表异步。Javascript发出HTTP请求,并将愉快地继续执行您想要的任何其他操作。HTTP请求由浏览器处理,当请求准备就绪时,浏览器会触发Javascript接收的事件。这就是为什么对于AJAX调用,您需要给它一个“success”函数,而不是在下一行代码中只说
if(success)

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


希望这能给你一些帮助。

正如你所说,Javascript是单线程的。但是,异步工作也很好

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

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

这也是AJAX的工作原理——AJAX中的“A”代表异步。Javascript发出HTTP请求,并将愉快地继续执行您想要的任何其他操作。HTTP请求由浏览器处理,当请求准备就绪时,浏览器会触发Javascript接收的事件。这就是为什么对于AJAX调用,您需要给它一个“success”函数,而不是在下一行代码中只说
if(success)

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


希望这能给你一些帮助。

代码本身就有未定义的行为。你正在设置两个HTTP请求之间的竞争。Pointy:请参阅下面我对加缪的评论。那么,这是否意味着Javascript实际上会为表单提交生成另一个HTTP请求,同时仍在尝试完成它在当前页面中所做的事情呢?该代码本身具有未定义的行为。你正在设置两个HTTP请求之间的竞争。Pointy:请参阅下面我对加缪的评论。那么,这是否意味着Javascript实际上会为表单提交生成另一个HTTP请求,同时仍在尝试完成它在当前页面中所做的事情呢?我正在提取一些代码,以展示正在发生的事情(在我正在调试的应用程序中)。应用程序逻辑设计本身肯定有缺陷。我只是想找出发生这种情况时Javascript的行为。也就是说,当表单提交发生在JavaScript代码的中间时,它会等待,直到当前页面中的所有JavaScript的其余部分在移动到表单提交之前完成吗?或者它的行为是否有所不同?我正在提取一些代码来展示(在我正在调试的应用程序中)正在发生的事情。应用程序逻辑设计本身肯定有缺陷。我只是想找出发生这种情况时Javascript的行为。i、 e.当表格提交时