Javascript 如何使用Backbone.js停止事件传播?
使用Backbone.js视图,假设我希望包含以下事件:Javascript 如何使用Backbone.js停止事件传播?,javascript,events,backbone.js,Javascript,Events,Backbone.js,使用Backbone.js视图,假设我希望包含以下事件: events: { 'click a': 'link', 'click': 'openPanel' } 当我点击链接时,如何避免openPanel被触发。我想要的是有一个可点击的框,它将触发一个动作,但是这个框可以有触发其他动作的元素,而不是父动作。以Twitter.com和Tweets/右侧面板中的链接为例。在“link”函数中返回“false”。每个事件处理程序在被触发时都会被传递
events: {
'click a': 'link',
'click': 'openPanel'
}
当我点击链接时,如何避免openPanel被触发。我想要的是有一个可点击的框,它将触发一个动作,但是这个框可以有触发其他动作的元素,而不是父动作。以Twitter.com和Tweets/右侧面板中的链接为例。在“link”函数中返回“false”。每个事件处理程序在被触发时都会被传递一个事件对象。在处理程序中,需要利用jQuery的event.stopPropagation()方法。例如:
link: function(event) {
//do some stuff here
event.stopPropagation();
}
我一直在使用
e.stopImmediatePropagation()代码>以防止事件传播。我希望有一个更短的方法来做到这一点。我想返回假;但这是因为我熟悉jQuery,jQuerypreventDefault
方法也是一个不错的选择
window.LocationViewLI = Backbone.View.extend({
tagName: "li",
template: _.template('<a href="/locations/<%= id %>"><%= name %></a>'),
events: {
"click a": "handleClick"
},
handleClick: function(event) {
event.preventDefault();
console.log("LocationViewLI handleClick", this.model.escape("name") );
// debugger;
},
...
window.LocationViewLI=Backbone.View.extend({
标记名:“li”,
模板:u.模板(“”),
活动:{
“单击a”:“把手单击”
},
handleClick:函数(事件){
event.preventDefault();
console.log(“LocationViewLI handleClick”,this.model.escape(“name”);
//调试器;
},
...
另外两种可能适合您的方法:
1.
然后openPanel将不会捕获任何
或
子项上的单击事件(如果
标记中有图标)
2.
在openPanel
方法的顶部,确保事件目标不是
:
openPanel:函数(事件){
//如果事件目标(已删除的元素)为
//单击)是一个或某个元素中的任何元素
if(event&&event.target&&$(event.target).is('a,a*')返回;
//否则,像往常一样打开面板是安全的
}
请注意,这两种方法仍然允许从其他地方调用openPanel
函数(例如,从父视图或此视图上的其他函数)。只需不传递事件
参数就可以了。您也不必在链接
函数中执行任何特殊操作--只需处理单击事件并继续。尽管您可能仍然希望调用事件。preventDefault()
否。这只会阻止链接被打开。这是一个jQuery事件,只需像在jQuery中一样停止传播即可。“link”函数的第一个参数是jQuery事件。这似乎不起作用,可能是由于事件的绑定方式:它“起作用”,但仅在您得到类型错误的意义上(对象没有立即停止事件的“preventPropagation”方法)bubbling@YiJiang您是否尝试过主干视图中的stopDefault()
?;)视图事件之间没有“传播”——所有事件都委托给相同的DOM元素(view.el
)但是,然后捕获冒泡事件并根据指定的选择器过滤事件。target
。哇,对我来说也很有用……我们是在编写要求我们这样做的坏函数,还是这是正常行为?您没有编写坏函数。这是停止javascript中传播的默认方法之一。我没有看主干最近,但他们可能引入了另一种方法。但这并不具有相同的行为。preventDefault
阻止用户访问链接的href。stopImmediatePropagation
允许用户按预期访问链接的href,但阻止单击事件传播到外部处理程序。
events: {
'click a': 'link',
'click *:not(a, a *)': 'openPanel'
}
openPanel: function(event) {
// Don't open the panel if the event target (the element that was
// clicked) is an <a> or any element within an <a>
if (event && event.target && $(event.target).is('a, a *')) return;
// otherwise it's safe to open the panel as usual
}