javascript - 通用 Javascript 事件

标签 javascript events callback

在 Javascript 中,我看到已经有一个 Event 接口(interface)和一个名为 CustomEvent 的子接口(interface)。我想知道这些是否适合 c# 类型的 event/delegate 系统。我想创建一种订阅事件的方式,但我一直卡在如何优雅地取消订阅上。

function MyClass(){
    this.onDoCoolThing = null;
}

MyClass.prototype.doCoolThing = function(){
    // do thing  
    if(this.onDoCoolThing !== null){
        for(var i = 0; i < this.onDoCoolThing.length; i++){
            if(this.onDoCoolThing[i] instanceof Function)
              this.onDoCoolThing[i]();
        }
    }     
}

首先,我该如何订阅?这些是我的想法:

C# 方法

var myClass = new MyClass();
myClass.onDoCoolThing += myCallbackFunction.bind(this, param1);
myClass.onDoCoolThing += myOtherCallbackFunction.bind(this, param1);

数组样式 如果C#方法不行:

myClass.onDoCoolThing.push(myCallBackFunction.bind(this, param1);

如果可以说,带有回调的对象被销毁了,我不知道如何取消订阅。它会被 GC 吗?

这就是为什么我想知道这项工作是否已经完成并在本地对象中找到,但我真的没有在任何地方看到它。

最佳答案

没有办法在 vanilla JS 中干净地做到这一点。

但是,jQuery 提供了一个委托(delegate)方法,因此您可以在 DOM 加载后分配处理程序。只需拉入 jQuery 库即可。你可以在 Vanilla JS 中手动编写一个函数来完成它,但让 jQuery 为你处理它要容易得多。

http://api.jquery.com/delegate/

关于javascript - 通用 Javascript 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34137352/

相关文章:

javascript 事件处理程序无法正常工作

python - Python 中按下按钮时的 Action

javascript - 计算用户向下滚动页面的像素数

javascript - Jquery 动画在关闭时出现两次

mysql - MySQL 中同一事件有可能重叠吗?

ruby-on-rails - 为什么当属性更新为 nil 时不触发 before_save/after_save?以及如何触发?

ruby-on-rails - :before_save and :before_update Active Record callbacks? 和有什么区别

javascript - 用 systemjs 替换 requirejs——变量在本地范围内不可见

c# - 如何防止网页刷新

javascript - 如何使用 JavaScript Promise 提示异步操作?