冒泡后点击绑定

时间:2016-10-06 12:34:14

标签: knockout.js event-bubbling

在事件冒泡后,有没有办法让点击运行?在下面的场景中,单击span会触发removeChildNode函数,该函数会从dom中删除span。这可以防止跨度点击触发点击[数据标识符]'节点。我希望事件能够冒泡,然后再执行要执行的功能。

<div data-identifier>
  <div data-bind="click: removeChildNode">
    <span>Click Me!</span>
  </div>
</div>

removeChildNode = function() { $(arguments[1].target).children()[0].remove(); }

$('body').on("click", 'span', function(event) {
  // use the span to navigate around and do something interesting
  $(event.target).closest('div[data-identifier]').click();
});

2 个答案:

答案 0 :(得分:1)

如果您要使用Knockout,则需要让它控制DOM,并操纵您的viewmodel。您应该有一些表示可移动子项的viewmodel实体,并且您的removeChildNode函数会将其删除(或将其设置为指示它已被删除的状态)。作为一般规则,jQuery选择器表明您未能对某些内容进行建模。

设置点击事件有两种方法是没有意义的。如果您要在一个地方使用jQuery click事件,则应该对所有点击事件使用jQuery而不使用Knockout。

也就是说,默认情况下,Knockout确实允许事件冒泡。您可以在节点移除器周围放置一个setTimeout,以便在移除节点之前为DOM传播事件,如果这样可以防止外部点击被触发。如果你把DOM完全留给Knockout,你将会遇到更少的问题。

答案 1 :(得分:0)

你应该点击你这样点击绑定

{{1}}

通过设置超时,您将延迟执行removeChildNode。

通过将你的调用包装成一个函数,你可以立即返回true,我认为告诉koJs冒泡这个事件。因此,您可以在延迟一段时间后实现冒泡并执行removeChild。

我没有尝试过这个小提琴,但我认为它应该有用,如果你试试它让我知道它是怎么回事,也许我应该确定我的答案在回答之前是可靠的,但我认为我是正确的这一个:)