0

スクリプト リソースとして MicrosoftAjax.debug.js (4.1.7.123) を含む WebForms ページがあります。

// 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: オブジェクト [オブジェクト グローバル] にはメソッド 'attachEvent' がありません

次の行で:

target.attachEvent(ieName || ("on" + name), onEvent);

デバッガーをアタッチするのは window オブジェクトです。ご想像のとおり、Chrometargetにはメソッドがありません。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 スクリプトのバグですか? クロム?それとも、ページ上の何らかの条件が原因ですか?

いずれにせよ、どうすれば解決できますか?

4

2 に答える 2

0

他の誰かが同じ問題に遭遇した場合に備えて、この質問はそのままにしておきます。document.attachEvent()ただし、エラーは、メソッドを再割り当てするレガシー Javascript ライブラリによって発生していました。

これは問題のあるコードでした:

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()。その場合、別の解決策を考え出す必要があります。

于 2013-10-09T16:21:15.463 に答える