Объект [объект глобальный] не имеет метода 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() метод, в этом случае вам нужно будет найти альтернативное решение.

Другие вопросы по тегам