Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.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 在表单提交之前发送Ajax请求_Javascript_Html - Fatal编程技术网

Javascript 在表单提交之前发送Ajax请求

Javascript 在表单提交之前发送Ajax请求,javascript,html,Javascript,Html,是否可以在表单的onsubmit()中发送ajax请求?我一直在尝试,结果很不稳定,主要原因可能是如果浏览器发送我的请求的时间比发送原始表单的时间长,那么一旦加载页面的位置发生变化,我的请求就会被丢弃,因此有时它甚至从未到达服务器 基本上,我想做的是添加一个收集登录事件的审核日志收集器,我想以最小的入侵将其挂接到现有的应用程序上。这很容易实现。只需推迟表单提交,直到AJAX请求完成 使表单onsubmit属性调用AJAX函数并返回false(这将取消表单提交)。AJAX调用完成后,以编程方式提交

是否可以在表单的onsubmit()中发送ajax请求?我一直在尝试,结果很不稳定,主要原因可能是如果浏览器发送我的请求的时间比发送原始表单的时间长,那么一旦加载页面的位置发生变化,我的请求就会被丢弃,因此有时它甚至从未到达服务器


基本上,我想做的是添加一个收集登录事件的审核日志收集器,我想以最小的入侵将其挂接到现有的应用程序上。

这很容易实现。只需推迟表单提交,直到AJAX请求完成

使表单
onsubmit
属性调用AJAX函数并返回false(这将取消表单提交)。AJAX调用完成后,以编程方式提交表单

例如:

<form name="myform" onsubmit="javascript: startAjax(); return false;">
...
<script type="text/javascript">
function startAjax() {} // Calls ajaxComplete() when finished

function ajaxComplete()
{
  document.myform.submit();
}
</script>

...
函数startAjax(){}//在完成时调用ajaxComplete()
函数ajaxComplete()
{
document.myform.submit();
}

还有另一种解决此问题的方法,即可以将ajax调用作为同步调用

例如:

xmlhttp.open("GET", imageUrlClickStream, false);

通过这种方式,我们可以确保表单提交将等待ajax调用得到响应。

将onsubmit替换为onclick,因为onsubmit是循环的,所以对我来说效果很好

<form name="myform" onclick="javascript: startAjax(); return false;">
...
<script type="text/javascript">
function startAjax() {} // Calls ajaxComplete() when finished

function ajaxComplete()
{
  document.myform.submit();
}
</script>

...
函数startAjax(){}//在完成时调用ajaxComplete()
函数ajaxComplete()
{
document.myform.submit();
}

如果您在AJAX请求中使用特定的JavaScript框架,请告诉我,我可以给您一个更具体的答案。虽然这可能有效,但这是一个非常糟糕的做法。执行同步请求会冻结页面执行,因为浏览器必须等待响应才能继续执行任何其他JavaScript代码。如果我对Ajax请求的结果不感兴趣,并希望在发送Ajax请求后立即提交表单,该怎么办?我是否仍然可以使用这种方法并在
startAjax()
函数本身中执行显式表单submit?这不会进入循环吗?onsubmit()会导致某种循环。改为使用onclick()。