我的目标是去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;
页面确实无法响应点击以启动"游戏"。我接近这个错吗?我是否需要某种延迟,或者我错过了大局?
答案 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更容易阅读)。