等待满足某种条件后执行,目前不支持嵌套调用
بۇ قوليازمىنى بىۋاسىتە قاچىلاشقا بولمايدۇ. بۇ باشقا قوليازمىلارنىڭ ئىشلىتىشى ئۈچۈن تەمىنلەنگەن ئامبار بولۇپ، ئىشلىتىش ئۈچۈن مېتا كۆرسەتمىسىگە قىستۇرىدىغان كود: // @require https://update.greatest.deepsurf.us/scripts/412875/1169576/WaitUntil.js
// ==UserScript==
// @name WaitUntil
// @namespace http://bbs.91wc.net/?wait-until
// @version 0.1.1
// @description 等待满足某种条件后执行,目前不支持嵌套调用
// @author Wilson
// ==/UserScript==
var WaitUntil = (function(){
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 timer = {}, counter={}, timesCounter = {};
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;
})();
//使用示例
//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次