WaitUntil

等待满足某种条件后执行,目前不支持嵌套调用

目前為 2023-04-01 提交的版本,檢視 最新版本

此腳本不應該直接安裝,它是一個供其他腳本使用的函式庫。欲使用本函式庫,請在腳本 metadata 寫上: // @require https://update.gf.qytechs.cn/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次

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址