2

MSHTMLインスタンスのタイマーメソッド(、、、および)を上書きしようとしているので、/に追加された関数を追跡し、setTimeoutそれらのclearTimeout関数が呼び出されるか削除されるまでスクリプトの終了をブロックできます。setIntervalclearIntervalsetTimeoutsetInterval

オリジナルがラッパー関数 内で呼び出されると、パーミッション拒否エラーが発生します。setTimeoutsetTimeout

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._setTimeoutwithの呼び出しで失敗しますObject doesn't support this property or method

IE8、WinXP SP3、JScript5.8を実行していることに注意してください。

4

1 に答える 1

1

保存した窓から電話してみませんsetTimeoutか?

var setTimeout;
var timeouts = {};
(function() {
    var window = new ActiveXObject('htmlfile').parentWindow;
    setTimeout = function(code, delay, lang){
        var id = window.setTimeout(code, delay, lang || 'javascript');
        timeouts[id] = true;
        return id;
    };
})();
于 2015-03-10T04:15:26.720 に答える