javascript - 自定义对象上的 addEventListener

标签 javascript object cordova addeventlistener

我创建了一个具有多种方法的对象。其中一些方法是异步的,因此我想使用事件来在方法完成时执行操作。为此,我尝试将 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();

这将返回错误:无法添加事件监听器:TypeError:'addEventListener' 在未实现接口(interface) EventTarget 的对象上调用。”

现在这段代码将用于 phonegap 应用程序,当我这样做时,它可以在 android/ios 上运行。但是,在测试过程中,如果我能让它至少在一个浏览器中运行,那就太好了。

PS> 我知道我可以启用冒泡,然后听取文档根目录,但我希望有一点 OOP,每个对象都可以独立工作。

最佳答案

addEventListener 适用于实现特定事件相关接口(interface)的 DOM 元素。如果你想要一个基于纯 JavaScript 对象的事件系统,你正在寻找一个自定义事件系统。一个例子是 Backbone.js 中的 Backbone.Events。基本思想是使用对象作为哈希来跟踪已注册的回调。

我个人使用这个:emitter .

这是一个相当简单和优雅的解决方案 - 带有甜美的简短方法名称,如 on()off()emit()。您可以使用 new Emitter() 创建新实例,或使用 Emitter(obj) 将事件功能混合到现有对象中。请注意,此库是为与 CommonJS 模块系统一起使用而编写的,但您可以通过删除 module.exports = ... 行在其他任何地方使用它。

关于javascript - 自定义对象上的 addEventListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20835768/

相关文章:

javascript - 我可以使用哪些方法来操作对象中数组的数据? (仅限伪代码)

android - WebGL 在 PhoneGap Android KitKat 中不工作

javascript - 从数据库中检索数据并将其显示在网页上的折线图中

javascript - React redux-saga 如何将 prop 传递给嵌套子级

javascript - 通过复制粘贴重新创建网页?

javascript - 在javascript中实例化新对象

javascript - 我可以在 Angular + ngrx 中使用对象扩展语法吗?

javascript - 将字符串输出到数组并从数组输出项目

javascript - Cordova 5.2.x 地理定位不准确

jquery - 在 jQueryMobile + PhoneGap 中使用多页模板在页面之间导航时出现闪烁问题