Событие onload тела после вызова ajax - PullRequest
0 голосов
/ 22 октября 2019

Каждый раз, когда я делаю вызов ajax, я заменяю весь html новым контентом с $("html").html(ajaxresponse). Но событие onload на моем элементе body не срабатывает после завершения ajax.

 <body onload="{% if not test.is_finished %} doTimer() {% endif %}">

Итак, у меня есть таймер, который я хочу продолжать считать до завершения теста. Например, после вызова ajax, если test.is_finished изменилось на true, я не хочу, чтобы функция doTimer() работала больше. Он отлично работает, если я не использую ajax. У вас есть предложения, как мне заставить его работать?

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Событие onload происходит только в том случае, если веб-страница загружается (или перезагружается). Запросы на основе AJAX не вызывают загрузку страницы (пере), и поэтому ваш onload слушатель не срабатывает при поступлении запроса. Вот как это должно работать.

Вместо использования onload попытайтесь вызвать ваш обратный вызов doTimer(), когда придет ответ AJAX. Если вам нужно, чтобы он вызывался при загрузке страницы, вызывайте его в обоих местах (onload и при поступлении AJAX-запросов).

Ниже приведен пример, который должен дать вам представление. Обратите внимание, что он делает определенные предположения:

  • Запросы должны выполняться на основе взаимодействия с пользователем (например: нажата кнопка)
  • Ваша конечная точка возвращает JSON с двумя полями: tests_finished и markup
  • Вы хотите запустить doTimer() тогда и только тогда, когда tests_finished имеет значение true

HTML:

<button id="submit">Send AJAX</button>
<div id="output"></div>

Структура JSON:

{
  "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() {
  // ...
}
0 голосов
/ 22 октября 2019

событие загрузки тела будет выполнено только один раз или при обновлении окна. Я предполагаю, что вы используете setInterval, если вы не можете использовать setInterval и после завершения ajax-вызова вы можете очистить интервал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...