How can I stop event propagation with Backbone.js?

2019-03-08 23:53发布

Using a Backbone.js View, say I want to include the following events:

    events: {
        'click a': 'link', 
        'click': 'openPanel' 
    }

How can I avoid openPanel to be fired when I click on a link. What I want is to have a clickable box which will trigger an action, but this box can have elements which should trigger other actions, and not the parent action. Think for example Twitter.com, and links in Tweets/right hand panel.

5条回答
放荡不羁爱自由
2楼-- · 2019-03-09 00:46

Return "false" in your "link" function.

查看更多
看我几分像从前
3楼-- · 2019-03-09 00:50

I've been using e.stopImmediatePropagation(); in order to keep the event from propagating. I wish there was a shorter way to do this. I would like return false; but that is due to my familiarity with jQuery

查看更多
Lonely孤独者°
4楼-- · 2019-03-09 00:51

Each of your event handlers will be passed an event object when it's triggered. Inside your handler, you need to leverage jQuery's event.stopPropagation() method. For example:

link: function(event) {  
  //do some stuff here
  event.stopPropagation();
}
查看更多
不美不萌又怎样
5楼-- · 2019-03-09 00:54

Two other methods that might work for you:

1

events: {
    'click a': 'link', 
    'click *:not(a, a *)': 'openPanel' 
}

Then openPanel will not capture click events on any <a> or child of an <a> (in case you have an icon in your <a> tag).

2

At the top of the openPanel method, make sure the event target wasn't an <a>:

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
}

Note that both of these methods still allow the openPanel function to be called from elsewhere (from a parent view or another function on this view, for example). Just don't pass an event argument and it'll be fine. You also don't have to do anything special in your link function -- just handle the click event and move on. Although you'll probably still want to call event.preventDefault().

查看更多
来,给爷笑一个
6楼-- · 2019-03-09 00:57

The JQuery preventDefault method would also be a good option.

    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;
        },
        ...
查看更多
登录 后发表回答