如何在函数调用之间进行超时?

时间:2013-09-24 19:21:08

标签: javascript function greasemonkey settimeout

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

这会同时打开所有(多个功能“打开”):

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

但我想在每个函数调用(clickOpenBtn)之间延迟。

我的完整代码段:

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);
}


我该怎么办?

2 个答案:

答案 0 :(得分:1)

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

waitForKeyElements ("...", function (p) {
    $("input.submit[onclick*='Open']", p).each(clickOpenBtn);
});

function clickOpenBtn (index, jNode) {
    setTimeout(function () {
        triggerMouseEvent (jNode[0], "click");
    }, 1000 * index);
}

答案 1 :(得分: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);
}
相关问题