【问题标题】:KnockoutJS: Handle event capture phaseKnockoutJS:处理事件捕获阶段
【发布时间】:2020-07-28 04:32:05
【问题描述】:

让我们考虑使用 KnockoutJS 将通用事件绑定到 ViewModel 方法的标准方法:

<div data-bind="event: { mousedown: handler }"></div>

此代码会将handler 作为mousedown 事件的侦听器添加到&lt;div&gt;。与任何其他处理程序一样,它附加到事件的目标和冒泡阶段。

但是,我看不到一种方法可以将处理程序附加到事件的 capture phase,而无需在 Knockout JS 提供的 MVVM 模式之外手动调用 addEventListener

是否可以在 Knockout JS 中使用 data-bind 将处理程序绑定到事件捕获阶段?

【问题讨论】:

  • 创建一个调用handler1handler2的包装函数,并且自身返回true?
  • 感谢您的回复@dperry!也许我没有问正确:我不想将handler1handler2 包装在一起(我已经为此使用了包装函数),我想声明一个附加到捕获阶段的事件处理程序事件:quirksmode.org/js/events_order.html
  • 虽然不是最佳实践,但您可以内联它:data-bind="event: { mousedown: function(){handler1();handler2();return true;} }"
  • 我会更新问题以使其更清晰;)

标签: javascript knockout.js event-handling dom-events


【解决方案1】:

当您需要执行现有绑定处理程序无法执行的 DOM 操作时,您可以编写自定义绑定处理程序。这是捕获阶段事件处理程序的简单演示。您必须查看调试控制台才能看到输出。

ko.bindingHandlers.captureEvent = {
    init: function (element, valueAccessor) {
        var arg = valueAccessor();
        for (var eventName in arg) {
            element.addEventListener(eventName, arg[eventName], true);
        }
    }
};

vm = {
    handler: function (event) {
        console.debug(event.currentTarget.id);
    }
};

ko.applyBindings(vm);
#d1 {
    background-color: red;
    height: 35em;
    width: 35em;
}
#d2 {
    background-color: green;
    height: 25em;
    width: 25em;
}
#d3 {
    background-color: blue;
    height: 15em;
    width: 15em;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div id="d1" data-bind="captureEvent: {mousedown: handler}">
    <div id="d2" data-bind="captureEvent: {mousedown: handler}">
        <div id="d3" data-bind="captureEvent: {mousedown: handler}"></div>
    </div>
</div>

【讨论】:

  • 同意,这是一个很好的模式 - 不支持现有绑定,编写您自己的绑定。我一直在想,如果我们能获得一个第三方绑定的模块化存储库,那将是非常酷的。人们可以选择他们想要包含的内容,并通过这些绑定获得自定义下载。
猜你喜欢
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多