【问题标题】:clicking on child element also triggers click event on it parent [duplicate]单击子元素也会触发其父元素的单击事件[重复]
【发布时间】:2013-04-23 07:55:41
【问题描述】:

场景

我的主干应用程序中的视图由几个boxes(which are div elements) 组成。当用户单击一个框并按住鼠标按钮 500 毫秒时,我想在左上角显示一个 delete 按钮。当用户点击其他任何地方#wrapper 时,delete 按钮应该隐藏。

问题

所以显示delete 按钮不是问题。当我单击并按住一秒钟时,它确实显示删除按钮,它显示删除按钮半秒钟然后隐藏。它之所以隐藏是因为我还将单击事件添加到它的父元素#wrapper,它实际上隐藏了这个删除按钮。

问题

那么当我单击并按住子元素box 时,如何阻止父元素#wrapper 触发点击事件?

这是我的代码

这是父元素模块的代码

var Boxes = Backbone.View.extend({
    el: '#wrapper',

    events: {
        'click': 'method' //when clicked on wrapper i.e. parent of box trigger method function
    },

    render: function (PaintBoxModel) {
        var paintBoxView = new PaintBoxView({ model: PaintBoxModel });
        this.$el.find('#contents').append(paintBoxView.render().el);
        return this;
    },

    method: function () {
        console.log('method');
        App.Vent.trigger('bodyclicked'); //trigger an event
    }

});

这是子元素的模块

var Box = Backbone.View.extend({
    events: {
        'mousedown': 'mouseHoldDown',
        'mouseup': 'removeMouseHoldDown'
    },

    initialize: function () {
        this.timeoutId = 0;
        App.Vent.on('bodyclicked', this.removeDeleteBtnShadow.bind(this)); //here I am listening to the click event when parent `#wrapper` is clicked
    },

    mouseHoldDown: function () {
        this.timeoutId = setTimeout(this.addDeleteBtnShadow.bind(this), 500);
    },

    removeMouseHoldDown: function () {
        clearTimeout(this.timeoutId);
    },

    addDeleteBtnShadow: function () {
            this.$el.append('<a href="#" class="remove">X</a>');
            this.$el.addClass('is-shadow');
    },

    removeDeleteBtnShadow: function () {
        this.$el.find('.remove').remove();
        this.$el.removeClass('is-shadow');
    }

});

【问题讨论】:

  • event.stopPropagation()

标签: javascript jquery backbone.js


【解决方案1】:

event 作为参数传递并使用.stopPropagation()

removeMouseHoldDown: function (e) 
{
   e.stopPropagation();
}

【讨论】:

  • 我已经尝试过了,但它不起作用。
  • 第一个 e.stopPropagation() 应该添加到 removeDeleteBtnShadow 函数中。我已经累了,但它给了我这个错误Uncaught TypeError: Cannot call method 'stopPropagation' of undefined
  • return false;你试过了吗。
  • 其中 dipesh 有一个 stopPropagation
  • 刚试了下还是一样的问题。
【解决方案2】:

我刚刚通过在子函数上添加 event.stopPrpagation 解决了这个问题。比如——

var parentView = new Backbone.View.extend({
    ...
    events: {
        "click": "renderSomething"
    },
    renderSomething: function() {
        //some rendering code
    }
});

var childView = new Backbone.View.extend({
    ...
    events: {
        "click": "renderSomething"
    },
    renderSomething: function(event) {
         event.stopPropagation(); //this will stop the event from being propagated to the parent
        //some rendering code
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 2010-11-02
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多