Javascript 对象[Object global]没有方法';附件';

Javascript 对象[Object global]没有方法';附件';,javascript,asp.net,google-chrome,dom,microsoft-ajax,Javascript,Asp.net,Google Chrome,Dom,Microsoft Ajax,我有一个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 attac

我有一个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);
        }
    }
}
function (sType, fHandler) {
        var shortTypeName = sType.replace(/on/, "");
        fHandler._ieEmuEventHandler = function (e) {
            window.event = e;
            return fHandler();
        };
        this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);
    }
问题是,在Chrome中,我遇到以下Javascript错误:

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

在以下行:

target.attachEvent(ieName || ("on" + name), onEvent);
附加调试器时,
target
是窗口对象,正如您所期望的,它在Chrome中没有
attachEvent()
方法

document.attachEvent()
是以下函数:

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);
        }
    }
}
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脚本中的错误吗?铬?或者是由于页面上的某些情况造成的


无论如何,我如何解决它?

您不应该重新分配
document.attachEvent
作为开始,因此您可能希望摆脱它<代码>附件事件因此为真。但这并不意味着
target.attachEvent
存在。在调用
target
之前,您似乎应该先检查
if(!!target.attachEvent)
,而不是只查看
attachEvent
变量。

我将保留这个问题,以防其他人遇到同样的问题。但是,该错误是由旧式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()
方法的真正理由,那么这将不会有帮助,在这种情况下,您需要想出一个替代解决方案

什么是
文档.attachEvent
?(在控制台中)Chrome没有
attachEvent
,这是一种IE方法。所以问题是,为什么
!!document.attachEvent
的计算结果似乎为
true
?我已更新了有关document.attachEvent的问题。该函数来自何处?你可能不想定义它,因为这会让另一个脚本认为它在IE中运行。@FelixKling我找到了它。它来自我们不再需要的遗留js库。感谢您为我指明了正确的方向。您的判断是正确的,document.attachEvent正在重新分配。但是,代码是AjaxControlToolkit中的脚本资源。我想我可以在codeplex上更新源代码,但暂时只删除重新分配的有问题的库。