这个tampermonkey代码有什么错误?

时间:2015-02-11 16:21:53

标签: javascript setinterval tampermonkey clearinterval

我的目标是去http://quizlet.com/12039115/scatter并获得2秒以下的分数。我的计划是通过使用setInterval / clearInterval禁用计时器来完成此操作。 我从一些网站上取了一些代码并尝试根据我的目的进行调整;它失败了。现在我需要知道出了什么问题。 原始代码可在blog.jazzychad.net/2011/03/20/inspect-javascript-timers-greasemonkey.html找到。当我将它加载到Tampermonkey并在页面上运行时,只打印出setInterval(多次):

INSPECT_TIMERS: setInterval - 100ms
quizlib.2X5g7.js:340
INSPECT_TIMERS: function (){return c.apply(b,a||arguments)}

因此,我可以看到它找到了计时器ID。现在我需要clearInterval()。这里出了问题。

以上输出的代码:

var go = function(window){

    var oldSetInterval = window.setInterval;
    var newSetInterval = function(f,t) {
        __log("INSPECT_TIMERS: setInterval - " + t + "ms");
        __log("INSPECT_TIMERS: " + f);
        var id = oldSetInterval(f,t);
        return id;
    };
    window.setInterval = newSetInterval;
    //setTimeoutDeleted
    function __log(msg) {
        if (window.console && window.console.log) {
            window.console.log(msg);
        }
    }
};

var script = document.createElement('script');
script.setAttribute("type", "application/javascript");
script.textContent = '(' + go + ')(window);';
document.body.appendChild(script); // run the script

当我添加

clearInterval(id);

之前

return id;    

页面确实无法响应点击以启动"游戏"。我接近这个错吗?我是否需要某种延迟,或者我错过了大局?

1 个答案:

答案 0 :(得分:1)

你的问题是,有多个setInterval来电,看起来像是我的3。

如果您在点击“开始游戏”之前在控制台中运行此代码,它会将以下调用记录到setInterval

var originalSetInterval = window.setInterval;
window.setInterval = function(func, intr) {
    var id = originalSetInterval.apply(window, arguments);
    console.log('----setInterval----');
    console.log('function:', func);
    console.log('interval:', intr);
    console.log('id:', id);
    console.log('-------------------');
    return id;
};

然后当您点击“开始游戏”时,您将获得如下输出。

----setInterval----
function: function()
interval: 17
id: 10
-------------------
----setInterval----
function: function()
interval: 17
id: 12
-------------------
----setInterval----
function: function()
interval: 100
id: 13
-------------------

在继续阅读之前,请随意停止阅读并自行尝试。

您可能不想在所有这些上调用clearInterval。运行时钟的那个似乎是具有100间隔的那个。要在不触及其他间隔的情况下禁用该间隔,可以使用简单的if语句。

var originalSetInterval = window.setInterval;
window.setInterval = function(func, intr) {
    var id = originalSetInterval.apply(window, arguments);
    console.log('----setInterval----');
    console.log('function:', func);
    console.log('interval:', intr);
    console.log('id:', id);
    console.log('-------------------');
    if (intr === 100) {
        clearInterval(id);
    }
    return id;
};

这样做会成功停止时钟。但是,一旦你完成游戏,你会发现游戏仍然知道你花了多长时间。时钟只是一个视觉元素。

如果您想欺骗游戏,则需要定位实际计算最终得分的代码。听起来像是学习如何使用浏览器开发人员工具的好机会,特别是JavaScript调试器(使用漂亮的打印功能使缩小的JS更容易阅读)。