等待满足某种条件后执行,目前不支持嵌套调用
As of
This script should not be not be installed directly. It is a library for other scripts to include with the meta directive // @require https://update.greatest.deepsurf.us/scripts/412875/1169596/WaitUntil.js
// ==UserScript==
// @name WaitUntil
// @namespace http://bbs.91wc.net/?wait-until
// @version 0.1.2
// @description 等待满足某种条件后执行,目前不支持嵌套调用
// @author Wilson
// ==/UserScript==
var WaitUntil = (function(g){
g._WaitUntil = g._WaitUntil || {};
g._WaitUntil.timer = g._WaitUntil.timer||{};
g._WaitUntil.counter = g._WaitUntil.counter||{};
g._WaitUntil.timesCounter = g._WaitUntil.timesCounter||{};
var timer = g._WaitUntil.timer;
var counter = g._WaitUntil.counter;
var timesCounter = g._WaitUntil.timesCounter;
var waitUntil=function(condfunc, callback, interval, trys, times){
var getGuid = getGuid||function() {
var d = new Date().getTime();
var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
var r = (d + Math.random()*16)%16 | 0;
d = Math.floor(d/16);
return (c=='x' ? r : (r&0x3|0x8)).toString(16);
});
return uuid;
};
var guid = guid || getGuid();
timesCounter[guid] = times || 1;
var isTimesInfinite = timesCounter[guid] === -1;
var waiter = function(condfunc, callback, interval, trys, guid){
interval = interval || 100;
trys = trys || 300;
counter[guid] = counter[guid] ? counter[guid]++ : 1;
timesCounter[guid]--;
if(counter[guid]>trys){
if(timer[guid]) clearTimeout(timer[guid]);
//callback('fail');
return;
}
timer[guid] = setTimeout(function(){
if(condfunc()){
if(timer[guid]) clearTimeout(timer[guid]);
callback('ok');
if(isTimesInfinite || timesCounter[guid] > 0){
waiter(condfunc, callback, interval, trys, guid);
}
} else {
if(timer[guid]) clearTimeout(timer[guid]);
waiter(condfunc, callback, interval, trys, guid);
}
}, interval);
}
waiter(condfunc, callback, interval, trys);
}
return waitUntil;
})(this);
//使用示例
//WaitUntil(function(){return typeof jQuery !=="undefined" && $(".test").length>0}, function(){
// alert($(".test").html());
//});
//其他参数
//condfunc 满足条件的函数
//callback 条件满足后执行的回调函数
//interval 监听满足条件的时间间隔,单位毫秒,默认100
//trys 尝试次数,超过这个数值就停止监听,默认为300(因默认间隔是100毫秒,所以默认停止监控时间为300*100毫秒,即30秒)
//times 执行次数,默认执行1次