MSHTMLインスタンスのタイマーメソッド(、、、および)を上書きしようとしているので、/に追加された関数を追跡し、setTimeout
それらのclearTimeout
関数が呼び出されるか削除されるまでスクリプトの終了をブロックできます。setInterval
clearInterval
setTimeout
setInterval
オリジナルがラッパー関数
内で呼び出されると、パーミッション拒否エラーが発生します。setTimeout
setTimeout
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);
window._setTimeout
withの呼び出しで失敗しますObject doesn't support this property or method
。
IE8、WinXP SP3、JScript5.8を実行していることに注意してください。