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
}
}
}):
主干事件模型似乎可用于捕获和冒泡阶段。 我想在捕获阶段禁用事件触发,并且只能 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
}
}
}):