Je suis codant un menu contextuel simple dans VUE.J. Lorsque j'ai un clic droit sur un élément particulier, il ouvre le menu (à l'aide de @ contextmendu.prevent) .Cela fonctionne.
Mais quand je clique à l'extérieur du menu, je veux que cela disparaisse. Cela ne fonctionne pas ... J'utilise V-on: flou pour cela, a également essayé @blur. Aucun d'entre eux ne fonctionne pas. Voici mon HTML: P>
methods: { setMenu(top, left) { this.top = top - 170 + "px"; this.left = left + "px"; }, // opening menu : calling set menu whith x and y openContextMenuTrack(track, event) { this.openedMenu = "contextMenuTrack"; this.targetOfMenu = track; this.$nextTick((() => { this.$refs.contextMenuTrack.focus(); this.setMenu(event.y, event.x); }).bind(this)); }, closeMenu() { this.openedMenu = undefined; this.targetOfMenu = undefined; } }
3 Réponses :
Le Votre problème est généralement résolu en créant une directive personnalisée qui crée une méthode Lorsque vous cliquez à l'extérieur du menu. p> quelque chose comme ceci: p> https://www.npmjs.com/package/v-click-outide p> espère que cela aide P> edit: strong> p> Un exemple avec un meilleur paquet ( Vue-Clickaway ): P> flou code> n'existe que pour les commandes de formulaire (
Merci beaucoup. Je vais vérifier V-Click-à-l'air, si cela fonctionne, je validerai votre réponse :)
Cela n'a pas fonctionné vraiment bien. En fait, lorsque je clique à l'extérieur de l'élément, le menu se ferme. Mais lorsque je clique sur une option du menu, le menu se ferme sans effectuer l'action liée à cette option. Aucun conseil?
J'ai ajouté un exemple avec un meilleur paquet à ma réponse ci-dessus
Cela aiderait si vous recherchez une manière non recommandée;) $ REFS serait délicat d'avoir le même résultat.
let x = document.querySelector('.targetClass).addEventListener('click', (e) => { if(e.target.className == 'targetClass') { this.close() } })
Je viens de le faire sur un projet:
created: function() { let self = this; window.addEventListener("click", function(e) { if (self.$el.querySelector('.targetClass') && !self.$el.querySelector('.targetClass').contains(e.target)) { this.close() } }); }, destroyed: function(){ let self = this; window.removeEventListener("click", function(e) { if (self.$el.querySelector('.targetClass') && !self.$el.querySelector('.targetClass').contains(e.target)) { this.close() } }); },