当我尝试使用它来刷新页面时,settimeout 无法正常工作
settimeout not working properly when i tried to use it to refresh a page
此代码的目的是根据随机变量等待 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
问题是当您将 iframe
指向当前文档时,包含 iframe
的文档只被加载一次(这就是为什么您看到相同的时间间隔一遍又一遍地使用)并且当 iframe
在其中加载相同的文件时,它为 interval 生成的值与控制 iframe
.[=18 加载的值不同=]
我认为您应该对 setTimeout
中的当前文件执行 AJAX 请求。这样你就可以通过再次调用 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>
此代码的目的是根据随机变量等待 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
问题是当您将 iframe
指向当前文档时,包含 iframe
的文档只被加载一次(这就是为什么您看到相同的时间间隔一遍又一遍地使用)并且当 iframe
在其中加载相同的文件时,它为 interval 生成的值与控制 iframe
.[=18 加载的值不同=]
我认为您应该对 setTimeout
中的当前文件执行 AJAX 请求。这样你就可以通过再次调用 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>