waitForKeyElement.js,但等待时间最长

时间:2019-03-05 03:40:17

标签: javascript jquery greasemonkey tampermonkey

使用waitForKeyElement.js时,我想知道是否有一个很好的解决方案来实现最长等待时间?有时我应该具有这些元素,但是有时在Ajax响应较差的情况下它们不会出现,或者可能需要一段时间才能出现。在这种情况下,我只是希望它继续运行并执行单独的功能。

编辑:例如,当尝试“购买”商品时,它通常总是以“成功”框响应,这是程序正在等待的内容,但是有时,如果服务器出错或该项目不再可用于“购买”,在这种情况下,可以插入另一个错误元素,但这是一个不同的元素,因此它将继续等待,而不是继续处理下一个项目。

1 个答案:

答案 0 :(得分:2)

该问题没有示例用例,也没有MCVE。很有可能是XY Problem

也就是说,没有一种优雅的方法来设置最大等待时间(因为以前从来没有需求,也没有需求)

您可以使用以下代码获得效果:

const maxTime       = 5;  //  seconds
var watchdogTimer   = setTimeout (fallBackFunc, maxTime * 1000);
waitForKeyElements ("#foo", desiredFunc, true);

function desiredFunc (jNode) {
    console.log ("Foo found!");
    clearTimeout (watchdogTimer);
}
function fallBackFunc () {
    console.log ("Oh, poo. No foo.");
}



在这种情况下,不必卸载waitForKeyElements计时器,但是您也可以通过在fallBackFunc()的末尾添加以下代码来做到这一点:

function fallBackFunc () {
    console.log ("Oh, poo. No foo.");

    /*-- Optional body double to take fire from waitForKeyElements that the 
        has `true` parameter set.  This is almost never needed.
    */
    var nonce = "IdeallySomeGloballyUniqueStringThatIs_a_ValidCssClass";
    //-- Added node should have properties that match the WFKE selector
    $("body").append (`<span id="foo" class="${nonce}" style="display:none;">blah</span>`);
    setTimeout (function () {$(`.${nonce}`).remove(); }, 333); // time must be > 300
}


关于问题编辑:

  

...(页面)以程序正在等待的“成功”框作为响应,但是有时此框不会发生...在这种情况下,可能会插入其他错误元素...

通常的做法是将waitForKeyElements设置为同时侦听成功节点和错误节点。 (请参见jQuery selectors doc。)

然后,waitForKeyElementscallback将针对传递给它的节点类型采取适当的操作。
不需要看门狗定时器(除非页面可以保持活动状态并且不返回任何节点类型-几乎从来没有这种情况)。

例如:

waitForKeyElements ("#goodNode, #errorNode", completeTransaction, true);

function completeTransaction (jNode) {
    if (jNode.is ("#goodNode") ) {  //  Match one of the WFKE selectores
        console.log ("Transaction success!");
    }
    else {
        console.log ("Transaction error.");
    }
}

这种方法的好处是:(A)不必等待最大计时器用完,并且(b)如果在每种情况下都没有将最大计时器设置得足够长,则不会受到破坏。