Scénario
Ma vue dans mon application de backbone se compose de plusieurs boxes(which are div elements)
. Lorsque l'utilisateur clique sur une boîte et maintenez le bouton de la souris enfoncé pendant 500 millisecondes, je souhaite afficher un bouton de delete
sur le coin supérieur gauche. Lorsque l'utilisateur clique sur n'importe où #wrapper
alors ce bouton de delete
doit se cacher.
Problème
Donc, le bouton de delete
n'est pas le problème. Il affiche un bouton de suppression lorsque je clique et maintenez enfoncé pendant une seconde, il affiche le bouton de suppression pendant une demi-seconde puis se cache. Il se cache car #wrapper
également un événement de clic à son élément parent #wrapper
qui cache en fait ce bouton de suppression.
Question
Alors, comment puis-je arrêter l'élément parent #wrapper
de déclencher un événement de clic lorsque je #wrapper
et maintenez enfoncé la box
élément enfant?
Voici mon code
Voici le code du module élément élémentaire
var Boxes = Backbone.View.extend({ el: '#wrapper', events: { 'click': 'method' //when clicked on wrapper ie 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 } });
Voici le module pour les éléments enfants
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'); } });
Passez l' event
comme argument et utilisez .stopPropagation()
.
removeMouseHoldDown: function (e) { e.stopPropagation(); }
Je viens de résoudre cela en ajoutant event.stopPrpagation sur la fonction enfant. Donc, par exemple,
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 } });