【问题标题】:How to make a timeout between function calls?如何在函数调用之间进行超时?
【发布时间】:2013-09-24 19:21:07
【问题描述】:

我的代码工作正常,除了它同时打开所有链接。我想使用延迟。

这会同时打开所有(多个函数“打开”):

waitForKeyElements ("input.submit[onclick*='Open']", clickOpenBtn);

但我希望每个函数调用之间有一个延迟 (clickOpenBtn)。

我的完整代码sn-p:

setTimeout(CheckForZero, 30000); // OR just call CheckForZero() if you don't need to defer until processing is complete
function CheckForZero() {
    waitForKeyElements ("input.submit[onclick*='Open']", clickOpenBtn);
    setTimeout(CheckForZero, 30000);
}

function clickOpenBtn (jNode) {
    triggerMouseEvent (jNode[0], "click");
}

function triggerMouseEvent (node, eventType) {
    var clickEvent = document.createEvent ('MouseEvents');
    clickEvent.initEvent (eventType, true, true);
    node.dispatchEvent (clickEvent);
}


我能做什么?

【问题讨论】:

    标签: javascript function greasemonkey settimeout


    【解决方案1】:

    在这种情况下,将节点推入 FIFO 队列并使用 setInterval,而不是 setTimeout 来处理队列。代码变为:

    var nodesToClick = []; //-- This array will hold the FIFO queue.
    
    waitForKeyElements ("input.submit[onclick*='Open']", loadNodeQueue);
    
    function loadNodeQueue (jNode) {
        nodesToClick.push (jNode[0]);   //-- Add to end
    }
    
    var nodeClkInterval = setInterval (workNodeQueue, 30000);
    
    function workNodeQueue () {
        if (nodesToClick.length) {
            var node = nodesToClick.shift (); //-- Remove from beginning
            triggerMouseEvent (node, "click");
        }
    }
    
    function triggerMouseEvent (node, eventType) {
        var clickEvent = document.createEvent ('MouseEvents');
        clickEvent.initEvent (eventType, true, true);
        node.dispatchEvent (clickEvent);
    }
    

    【讨论】:

    • 我需要为你的回答 +1。
    【解决方案2】:

    您应该更具体地了解在 waitForKeyElements 中使用的选择器,类似于所有链接的父节点。这样 actionFunction 会执行一次,然后你可以这样做:

    waitForKeyElements ("...", function (p) {
        $("input.submit[onclick*='Open']", p).each(clickOpenBtn);
    });
    
    function clickOpenBtn (index, jNode) {
        setTimeout(function () {
            triggerMouseEvent (jNode[0], "click");
        }, 1000 * index);
    }
    

    【讨论】:

    • 这有3个问题:(1)父节点可能在填充之前就已经找到了。 (2) 第一批后将找不到后续输入。 (3) 发送给triggerMouseEvent的类型参数错误。
    • 感谢@BrockAdams。修复了类型参数。可能需要其他“问题”。
    • 谢谢。值得怀疑,但以防万一。
    猜你喜欢
    • 2016-08-20
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多