【发布时间】:2012-11-11 13:05:26
【问题描述】:
我正在尝试在 MSHTML 实例上覆盖计时器方法(setTimeout、clearTimeout、setInterval 和 clearInterval),以便跟踪已添加到 setTimeout/setInterval 和在调用或删除这些函数之前阻止脚本退出。
当在包装器 setTimeout 函数中调用原始 setTimeout 时,我收到 Permission denied 错误:
var window = new ActiveXObject('htmlfile').parentWindow.window;
var _setTimeout = window.setTimeout;
var timeouts = {};
setTimeout = function (code, ms, lang) {
//script fails here - Permission denied
var id = _setTimeout(code, ms, lang || 'javascript');
timeouts[id] = true;
return id;
};
setTimeout(function () {
window.alert('Timed function');
}, 1000);
var testTimeouts = function () {
var i;
for (i in timeouts) {
if (timeouts[i]) {return false;}
}
};
while (!testTimeouts()) {
WScript.Sleep(100);
}
window.alert('At end of script');
我可以在原始setTimeout 被覆盖之前将代码传递给它:
window.setTimeout(function () {
window.alert('Timed function');
}, 1000);
WScript.Sleep(2500);
window.alert('At end of script');
保留原始上下文(如似乎已经消失的答案中所建议的那样)不起作用:
window._setTimeout = window.setTimeout;
var timeouts = {};
window.setTimeout = function (code, ms, lang) {
var id = window._setTimeout(code, ms, lang || 'javascript');
timeouts[id] = true;
return id;
};
window.setTimeout(function () {
window.alert('Timed function');
}, 1000);
使用Object doesn't support this property or method 调用window._setTimeout 时失败。
我应该注意到我运行的是 IE8、WinXP SP3、JScript 5.8。
【问题讨论】:
标签: javascript mshtml wsh