settimeout не работает должным образом, когда я пытался использовать его для обновления страницы - PullRequest
0 голосов
/ 25 октября 2018

Цель этого кода - обновить страницу через 1 секунду или 5 секунд в зависимости от случайной величины.Однако приведенный ниже код делает так, чтобы он либо обновлялся после времени ожидания 1 секунды КАЖДЫЙ ОДИН РАЗ, либо обновлялся после времени ожидания 5 секунд КАЖДЫЙ РАЗ.

Как мне сделать так, чтобывремя ожидания обновления составляет ЛИБО 1 секунда ИЛИ 5 секунд при каждом обновлении?

// ==UserScript==
// @name        google.com
// @namespace   John Galt
// @description Basic Google Hello
// @match       *^https://www.google.com/$*
// @version     1
// @require     https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @grant       GM_xmlhttpRequest
// @run-at document-end
// ==/UserScript==

//*****************************************START OF SET_TIMEOUT
(function ($) {
  'use strict';
  var interval;
  if (Math.floor(Math.random() * 2) == 0) { interval = 1000; }
  else { interval = 5000; }
  if (window == window.top) {
    var body = $('body').empty();
    var myframe = $('<iframe>')
      .attr({ src: location.href })
      .css({ height: '95vh', width: '100%' })
      .appendTo(body)
      .on('load', function () {
        setTimeout(function () {
          myframe.attr({ src: location.href });
        }, interval);
      });
  }
})(jQuery);
//*****************************************END OF SET_TIMEOUT

1 Ответ

0 голосов
/ 25 октября 2018

Проблема в том, что, когда вы указываете iframe на текущий документ, документ, содержащий iframe, загружается только один раз (и поэтому вы видите, что один и тот же интервал используется снова и снова) икогда iframe загружает в него тот же файл, значение, которое он генерирует для интервала, не совпадает с тем, что контролирует загрузку iframe.

. Я думаю, вам следует просто выполнитьAJAX-запрос для текущего файла внутри вашего setTimeout.Таким образом, вы можете обработать ошибку сервера, просто повторив вызов AJAX.Это было бы намного проще.Нет iframe.

(function ($) {
 'use strict';

 // Store possible delay values in an array
 var possibleDelays = [1000, 5000];
      
 function reload() {
   $.ajax(location.href)
    .done(function () {
       $("h1").text(new Date().toLocaleTimeString());
       // Success! Do it again!
       setTimeout(reload, possibleDelays[Math.round(Math.random())]);
    }).fail(reload); // When there's an error, try again
  }

  // Initiate the process with an interval that is generated right here.
  setTimeout(reload, possibleDelays[Math.round(Math.random())]);
})(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<h1></h1>
...