javascript - Aurelia 委托(delegate) vs 触发器 : how do you know when to use delegate or trigger?

标签 javascript aurelia

我正在努力学习如何使用 Aurelia 框架。这样做时,我正在阅读文档 here关于他们绑定(bind)事件的方法。该文档建议默认使用委托(delegate)。我已经 fork 了他们在他们的一篇博客文章中提供的 plunkr,并向其中添加了一点。完整的内容是 here .


app.html

<template>
    <input value.bind="pageInput" blur.delegate="showAlert()" placeholder="delegate()" />
    <input value.bind="pageInput" blur.trigger="showAlert()" placeholder="trigger()" />

    <button type="button" click.delegate="showAlert()">delegate()</button>
    <button type="button" click.trigger="showAlert()">trigger()</button>
</template>

app.js

export class App {
  showAlert() {
    alert('showAlert()');
  }
}

正如您在 plunkr 中看到的那样,blur.trigger/click.delegate/click.trigger 都会触发事件,但 blur.delegate 不会。

为什么会这样?

您如何确定 .delegate 何时无法工作(当然无需手动测试)?

最佳答案

除非不能使用delegate,否则使用delegate

事件委托(delegate)是一种用于提高应用程序性能的技术。它利用大多数 DOM 事件的“冒泡”特性,极大地减少了事件订阅的数量。使用事件委托(delegate),处理程序不会附加到单个元素。相反,单个事件处理程序附加到顶级节点,例如 body 元素。当一个事件冒泡到这个共享的顶级处理程序时,事件委托(delegate)逻辑会根据事件的 target 调用适当的处理程序。 .

找出是否event delegation可以与特定事件一起使用,google mdn [event name] event。事实上,在任何网络平台相关的谷歌搜索前加上 mdn 通常会返回来自 Mozilla Developer Network 的高质量结果。进入事件的 MDN 页面后,检查事件是否冒泡。只有冒泡的事件才能与 Aurelia 的 delegate 绑定(bind)命令一起使用。 blurfocusloadunload 事件不会冒泡,因此您需要使用trigger 绑定(bind)命令订阅这些事件。

这是 MDN page for blur .它包含有关模糊和焦点事件的事件委托(delegate)技术的更多信息。

上述一般指南的异常(exception)情况:

满足以下条件时,在按钮上使用trigger:

  1. 您需要禁用该按钮。
  2. 按钮的内容由其他元素组成(而不只是文本)。

这将确保对禁用按钮的子项的点击不会冒泡到委托(delegate)事件处理程序。更多信息 here .

在某些 iOS 用例中使用 trigger 进行 click:

iOS 不会在 abuttoninputselect 以外的元素上冒泡点击事件。如果您在非输入元素(如 div)上订阅 click 并针对 iOS,请使用 trigger 绑定(bind)命令。 更多信息 herehere .

关于javascript - Aurelia 委托(delegate) vs 触发器 : how do you know when to use delegate or trigger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33904248/

相关文章:

Aurelia:性能/效率差异:repeat.for 中声明的 View 元素与内联 DOM

javascript - Aurelia,如何进行可选绑定(bind)

javascript - 将鼠标悬停在文本上时,更改文本和背景图像

javascript - 如何使用javascript永久更改选择选项文本

javascript - 将 owl carousel 包含到 npm 项目中。All ways

webpack - 如何在 Visual Studio 项目中通过 Webpack 使用 Aurelia 中的监视/热重载?

aurelia - 确定是否在提示中作为对话框打开

javascript - 在 Backbone 中绑定(bind)时防止函数被调用两次?

c# - 无法在 gridview 中打开超链接位置

javascript - jquery 自动完成与 aurelia.js 怎么样?