カスタムオブジェクトにイベントリスナーを追加する 質問する

カスタムオブジェクトにイベントリスナーを追加する 質問する

いくつかのメソッドを持つオブジェクトを作成しました。これらのメソッドの一部は非同期なので、メソッドが完了したときにアクションを実行できるようにイベントを使用したいと思います。これを実現するために、オブジェクトに addEventListener を追加してみました。

jsfiddle

var iSubmit = {
    addEventListener: document.addEventListener || document.attachEvent,
    dispatchEvent: document.dispatchEvent,
    fireEvent: document.fireEvent,   


    //the method below is added for completeness, but is not causing the problem.

    test: function(memo) {
        var name = "test";
        var event;
        if (document.createEvent) {
            event = document.createEvent("HTMLEvents");
            event.initEvent(name, true, true);
        } else {
            event = document.createEventObject();
            event.eventType = name;
        }
        event.eventName = name;
        event.memo = memo || { };

        if (document.createEvent) {
            try {
                document.dispatchEvent(event);
            } catch (ex) {
                iAlert.debug(ex, 'iPushError');
            }
        } else {
            document.fireEvent("on" + event.eventType, event);
        }
    }
}

iSubmit.addEventListener("test", function(e) { console.log(e); }, false);


//This call is added to have a complete test. The errors are already triggered with the line before this one.

iSubmit.test();

これはエラーを返します:Failed to add eventlisterens: TypeError: 'addEventListener' called on an object that does not implement interface EventTarget."

このコードは PhoneGap アプリで使用され、Android/iOS で動作します。ただし、テスト中は、少なくとも 1 つのブラウザーで動作するようにできれば便利です。

PS> バブリングを有効にしてドキュメント ルートをリッスンできることはわかっていますが、各オブジェクトが独自に動作できる OOP を少しだけ使用したいと思います。

ベストアンサー1

addEventListener特定のイベント関連のインターフェースを実装する DOM 要素を対象としています。純粋な JavaScript オブジェクトでイベント システムが必要な場合は、カスタム イベント システムを探します。例としては、Backbone.EventsBackbone.js があります。基本的な考え方は、オブジェクトをハッシュとして使用して、登録されたコールバックを追跡することです。

個人的にはこれを使用します:エミッター

on()これはかなりシンプルでエレガントなソリューションです。 、off()、などの簡潔なメソッド名を使用emit()して、 で新しいインスタンスを作成することnew Emitter()も、 を使用してEmitter(obj)既存のオブジェクトにイベント機能を組み込むこともできます。このライブラリは CommonJS モジュール システムで使用するために作成されていますが、 行を削除することで他の場所でも使用できることに注意してくださいmodule.exports = ...

おすすめ記事