Javascript 对象[Object global]没有方法';附件';
我有一个WebForms页面,其中包括MicrosoftAjax.debug.js(4.1.7.123)作为脚本资源: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
// 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上更新源代码,但暂时只删除重新分配的有问题的库。