Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Backbone.js停止事件传播?_Javascript_Events_Backbone.js - Fatal编程技术网

Javascript 如何使用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”。每个事件处理程序在被触发时都会被传递

使用Backbone.js视图,假设我希望包含以下事件:

    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,jQuery
preventDefault
方法也是一个不错的选择

    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
}