3

シナリオ

私のバックボーン アプリのビューは、複数のboxes(which are div elements). deleteユーザーが 1 つのボックスをクリックし、マウス ボタンを 500 ミリ秒間押したままにすると、左上隅にボタンを表示したいと考えています。ユーザーが他の場所をクリックすると#wrapper、そのdeleteボタンは非表示になります。

問題

したがってdelete、ボタンを表示することは問題ではありません。1秒間クリックしたままにすると、削除ボタンが表示され、0.5秒間削除ボタンが表示されてから非表示になります。#wrapperこの削除ボタンを実際に非表示にする親要素にもクリックイベントを追加しているため、非表示になります。

質問

#wrapperでは、子要素をクリックして押したままにしているときに、親要素がクリックイベントをトリガーしないようにするにはどうすればよいboxですか?

これが私のコードです

親要素モジュールのコードは次のとおりです

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');
    }

});
4

2 に答える 2

2

event引数として渡して使用します.stopPropagation()

removeMouseHoldDown: function (e) 
{
   e.stopPropagation();
}
于 2013-04-23T07:57:50.423 に答える
0

子関数に 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
    }
});
于 2013-08-19T13:28:58.013 に答える