Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.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调用后的Body onload事件_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript ajax调用后的Body onload事件

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()函数再运行。如果我不使用

每次我调用ajax之后,我都会用
$(“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
HTML:

<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。我的计时器在服务器端运行,每次发出请求时,我都会将剩余的几秒钟发送给客户端。