0

我有一个 WebForms 页面,其中包含 MicrosoftAjax.debug.js (4.1.7.123) 作为脚本资源:

// Name:        MicrosoftAjax.debug.js
// Assembly:    AjaxControlToolkit
// Version:     4.1.7.123
// FileVersion: 4.1.7.0123
// (c) 2010 CodePlex Foundation

在加载这个脚本自我调用,最终调用这个函数:

var attachEvent = !!document.attachEvent;

...

function listenOnce(target, name, ieName, callback, isReadyState, isScript) {
    function onEvent() {
        if (!attachEvent || !isReadyState || /loaded|complete/.test(target.readyState)) {
            if (attachEvent) {
                target.detachEvent(ieName || ("on" + name), onEvent);
            }
            else {
                target.removeEventListener(name, onEvent, false);
                if (isScript) {
                    target.removeEventListener("error", onEvent, false);
                }
            }
            callback.apply(target);
            target = null;
        }
    }
    if (attachEvent) {
        target.attachEvent(ieName || ("on" + name), onEvent);
    }
    else {
        if (target.addEventListener) {
        target.addEventListener(name, onEvent, false);
        }
        if (isScript) {
            target.addEventListener("error", onEvent, false);
        }
    }
}

问题是在 Chrome 中我收到以下 Javascript 错误:

未捕获的类型错误:对象 [object global] 没有方法“attachEvent”

在以下行:

target.attachEvent(ieName || ("on" + name), onEvent);

附加调试器的target是 window 对象,正如您所期望的那样,Chrome 中没有该attachEvent()方法。

document.attachEvent()是以下函数:

function (sType, fHandler) {
        var shortTypeName = sType.replace(/on/, "");
        fHandler._ieEmuEventHandler = function (e) {
            window.event = e;
            return fHandler();
        };
        this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);
    }

这是 Microsoft Ajax 脚本中的错误吗?铬合金?或者它是由页面上的某些条件引起的?

无论哪种方式,我该如何解决它?

4

2 回答 2

1

你不应该document.attachEvent从一开始就重新分配,所以你可能想摆脱它。 attachEvent正因为如此。但这并不意味着target.attachEvent存在。似乎您应该if (!!target.attachEvent)在调用它之前进行检查,target而不是仅仅查看您的attachEvent变量。

于 2013-10-09T16:12:15.697 回答
0

我会留下这个问题,以防其他人遇到同样的问题。但是,该错误是由旧 Javascript 库重新分配该document.attachEvent()方法引起的。

这是有问题的代码:

function emulateAttachEvent() {
    HTMLDocument.prototype.attachEvent = 
    HTMLElement.prototype.attachEvent = function (sType, fHandler) {
        var shortTypeName = sType.replace(/on/, "");
        fHandler._ieEmuEventHandler = function (e) {
            window.event = e;
            return fHandler();
        };
        this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);
    };
    HTMLDocument.prototype.detachEvent = 
    HTMLElement.prototype.detachEvent = function (sType, fHandler) {
        var shortTypeName = sType.replace(/on/, "");
        if (typeof fHandler._ieEmuEventHandler == "function")
            this.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);
        else
            this.removeEventListener(shortTypeName, fHandler, true);
    };
}

幸运的是,我能够删除遗留库。但是,如果您有重新分配方法的真实案例,这将无济于事document.attachEvent(),在这种情况下,您将需要提出替代解决方案。

于 2013-10-09T16:21:15.463 回答