【问题标题】:How does JQuery create it's Custom Events and can I recreate in Javascript?JQuery 如何创建它的自定义事件,我可以在 Javascript 中重新创建吗?
【发布时间】:2014-08-01 14:43:13
【问题描述】:

我希望使用与 JQuery 相同的方法在 Javascript 中创建事件 - 有人知道 JQuery 是如何做到的吗?

我的理由是使用这样的原始 Javascript:

var myEvent = new CustomEvent("userLogin", eventProperties);

...实际上不适用于 Android 原生浏览器,因为它不像 Chrome 和其他浏览器那样支持 DOM Level 3。

但是,JQuery 确实在 Android 的股票浏览器上工作,并且只使用:

$.event.trigger('MyEvent');

我的问题是,这背后的代码是什么?我试图通过 JQuery 的source code 找到它,但无法理解它!

【问题讨论】:

    标签: javascript jquery android-browser custom-events


    【解决方案1】:

    这里的基本内容是:当您将事件处理程序与 jQuery 挂钩时,jQuery 不会直接将该处理程序添加到 DOM 元素。相反,jQuery 在 DOM 元素上挂上了它自己的处理程序(如果它还没有处理程序的话)。当事件发生时,jQuery 查看 jQuery 注册的事件处理程序列表并按顺序触发它们。 (这有几个原因;最初主要是围绕 IE 内存泄漏以及 IE 以一个顺序触发处理程序,而其他所有人以不同顺序触发的事实;因此 jQuery 接管并确保了顺序。)

    (你也许能看到我的目标……)

    因此,当您使用trigger 时,jQuery 会将合成事件发送到 DOM 元素,但它并不依赖该合成事件来工作;它直接调用您通过 jQuery 注册的处理程序。事实上,它设置了一个标志,以便它知道它已经完成了,所以如果浏览器 确实 将事件发送到 jQuery 的处理程序,jQuery 知道忽略它(因为它已经完成了它的工作) .

    您可以从the current uncompressed jQuery file 的第 4,464 行开始看到它的全部荣耀。

    所以基本上 jQuery 构建了自己的发布/订阅系统,并且只使用浏览器事件系统作为它的输入。所以自定义事件通常根本不需要与浏览器对话。

    【讨论】:

    • 难道 jQuery 不是还为带有监听器的元素添加了一个额外的属性,因此它有自己的元素唯一标识符吗?
    • @RobG:是的,确实如此:与元素关联的 jQuery 事件处理程序存储在 data 函数管理的同一数据缓存中,并且 jQuery 第一次为元素,它将 jQuery expando 属性添加到元素对象(jQuery111008836618564091623 或类似)。该属性的值是它用于在数据缓存中查找信息(包括事件处理程序)的键。
    • 感谢 Crowder 的解释——我没有意识到 JQuery 是以这种方式进行的。我想我将只包含 JQuery 并节省自己重写功能来做到这一点,因为不值得在这个实例上投入时间。再次感谢。
    • @OliC:不用担心,很高兴有帮助。
    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 2021-03-21
    • 2014-06-14
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多