【问题标题】:'Permission denied' in calling original setTimeout of htmlfile window调用 htmlfile 窗口的原始 setTimeout 时出现“权限被拒绝”
【发布时间】:2012-11-11 13:05:26
【问题描述】:

我正在尝试在 MSHTML 实例上覆盖计时器方法(setTimeoutclearTimeoutsetIntervalclearInterval),以便跟踪已添加到 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


    【解决方案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;
        };
    })();
    

    【讨论】:

    • 就(1)而言,global===this 返回true,因此显然有一个全局对象可以在 WSH 下通过this 访问,就像在其他 Javascript 环境中一样。跨度>
    • 我刚刚尝试过——将所有对window 的引用替换为global.window,但我仍然遇到同样的错误。
    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 2022-11-05
    • 2018-01-18
    • 2012-11-13
    • 2015-11-09
    • 1970-01-01
    • 2019-04-26
    相关资源
    最近更新 更多