我有一个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错误:
未捕获TypeError:对象[object global]没有方法'attachEvent'
在以下行中:
target.attachEvent(ieName || ("on" + name), onEvent);
附加调试器,target
是窗口对象,正如您所期望的那样,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脚本中的错误吗?铬?或者它是由页面上的某些条件引起的?
无论哪种方式,我该如何解决?
答案 0 :(得分:1)
你不应该重新分配document.attachEvent
,所以你可能想要摆脱它。因此,attachEvent
是正确的。但这并不意味着target.attachEvent
存在。您似乎应该在if (!!target.attachEvent)
上调用之前检查target
,而不是仅查看attachEvent
变量。
答案 1 :(得分: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()
方法的真实案例,这将无济于事,在这种情况下,您需要提出替代解决方案。