Javascript ajax调用后的Body onload事件
每次我调用ajax之后,我都会用Javascript ajax调用后的Body onload事件,javascript,jquery,ajax,Javascript,Jquery,Ajax,每次我调用ajax之后,我都会用$(“html”).html(ajaxresponse)替换整个html。但是在ajax完成后,我的body元素上的onload事件不会触发 <body onload="{% if not test.is_finished %} doTimer() {% endif %}"> 所以我有一个计时器,我想一直数到测试结束。例如,在ajax调用之后,如果test.is_finished更改为true我不希望doTimer()函数再运行。如果我不使用
$(“html”).html(ajaxresponse)
替换整个html。但是在ajax完成后,我的body元素上的onload事件不会触发
<body onload="{% if not test.is_finished %} doTimer() {% endif %}">
所以我有一个计时器,我想一直数到测试结束。例如,在ajax调用之后,如果
test.is_finished
更改为true
我不希望doTimer()
函数再运行。如果我不使用ajax,它可以正常工作。您有什么建议吗?body onload事件将只执行一次或在窗口刷新时执行。
我假设您使用的是setInterval,如果不是,您可以使用setInterval,在ajax调用完成后,您可以清除该间隔。只有在加载(或重新加载)网页时才会触发
onload
事件。基于AJAX的请求不会触发页面(重新)加载,因此当请求到达时,onload
侦听器不会启动。这就是它的工作原理
当AJAX响应到达时,尝试调用doTimer()
回调,而不是使用onload
。如果需要在页面加载时调用它,请在两个位置调用它(onload
&当AJAX请求到达时)
下面是一个例子,可以给你一个想法。请注意,它做出了某些假设:
- 应根据用户交互触发请求(例如:单击按钮)
- 端点返回带有两个字段的JSON:
和tests\u finished
markup
- 如果且仅当
的值为tests\u finished
true
<button id="submit">Send AJAX</button>
<div id="output"></div>
{
"tests_finished": Boolean,
"markup": String
}
JavaScript
var AJAX_URL = 'PATH/TO/RESOURCE';
var $output = $('#output');
var $button = $('#submit');
$button.on('click', runAjax);
function runAjax() {
$.ajax(AJAX_URL, {
// your settings
})
.done(processResponse)
.fail(processFailures);
}
function processResponse(json) {
$result.html(json.markup);
if (json.tests_finished) {
doTimer(); // <-- called here instead of "onload"
}
}
function processFailures(exc) {
console.error(exc);
}
function doTimer() {
// ...
}
var AJAX_URL='PATH/TO/RESOURCE';
变量$output=$(“#output”);
var$按钮=$(“#提交”);
$button.on('click',runAjax);
函数runAjax(){
$.ajax(ajax\u URL{
//你的设置
})
.done(processResponse)
.失败(处理失败);
}
函数processResponse(json){
$result.html(json.markup);
如果(json.tests_finished){
doTimer();//因为ajax调用后没有加载,所以根本没有理由为此使用body load事件,即使它确实有效。还有什么最好的解决方案呢?我没有使用setInterval。我的计时器在服务器端运行,每次发出请求时,我都会将剩余的几秒钟发送给客户端。