Объект [объект глобальный] не имеет метода attachEvent
У меня есть страница 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:
Uncaught TypeError: Object [object global] не имеет метода attachEvent
На следующей строке:
target.attachEvent(ieName || ("on" + name), onEvent);
Присоединение отладчика, target
это объект окна, который, как и следовало ожидать, не имеет 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? Хром? Или это вызвано каким-то условием на странице?
В любом случае, как я могу решить это?
2 ответа
Вы не должны переназначать document.attachEvent
для начала, так что вы можете избавиться от этого. attachEvent
верно из-за этого. Это не значит что target.attachEvent
существует, однако. Кажется, вы должны проверить if (!!target.attachEvent)
прежде чем позвонить на target
вместо того, чтобы просто смотреть на ваш 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()
метод, в этом случае вам нужно будет найти альтернативное решение.