Backbone 事件 - 禁用捕获阶段

Backbone events - disable Capture phase

主干事件模型似乎可用于捕获和冒泡阶段。 我想在捕获阶段禁用事件触发,并且只能 trigger/handle 在冒泡阶段触发一个事件。

任何指针都会有很大帮助

Backbone 不对事件强加事件检测机制。

Backbone .on()

事实上,除了必须手动触发的 Backbone 事件之外,并且没有附加到 DOM (做类似 myView.on('event-name', someCallback , view), 并使用 myView.trigger('eventName')) 触发,所有由事件散列定义的视图 DOM 事件都委托给 jQuery。

Backbone.events

看一下绑定事件哈希中事件的Backbone方法,delegateEvents:

delegateEvents: function(events) {
  if (!(events || (events = _.result(this, 'events')))) return this;
  this.undelegateEvents();
  for (var key in events) {
    var method = events[key];
    if (!_.isFunction(method)) method = this[events[key]];
    if (!method) continue;

    var match = key.match(delegateEventSplitter);
    var eventName = match[1], selector = match[2];
    method = _.bind(method, this);
    eventName += '.delegateEvents' + this.cid;

    /*** (Seebiscuit Comment  ***
     * This is where the event is 
     * actually bound.        ***/
    if (selector === '') {
      this.$el.on(eventName, method); /* (Seebiscuit) Notice the jQuery */
    } else {
      this.$el.on(eventName, selector, method);
    }
  }
  return this;
}

来自 jQuery 函数的 on 手册页:

In Internet Explorer 8 and lower, a few events such as change and submit do not natively bubble but jQuery patches these to bubble and create consistent cross-browser behavior. jQuery.on

如果您进一步阅读文档,您会发现 jQuery 像大多数浏览器一样选择了冒泡事件。

现在不是所有的事件都会冒泡。入围名单(来自Browser Events):

  • change/submit/reset:在IE 6/7/8中不冒泡,但是jQuery让它们冒泡

  • focus/blur: jQuery 使用 focusin/focusout hacks to bubble focus/blur 事件

  • load/error/resize/readystatechange/...:window 或与事件委托无关的 XHR 对象上的方法

但是,由于 Backbone 使用 jQuery 的事件委托,您可以放心,即使在更棘手的情况下,您也不必担心事件捕获传播。

这应该有效:

Backbone.View.extend({
  events: {
    'click table tr > td > a': function (e) {
       e.preventDefault();
       e.stopPropagation();
      /// do stuff
     }
  }
}):