2013-03-31 10 views
61

C'è un modo per impostare un elemento in modo che esegua un'azione con il tasto sinistro del mouse (ng-clic) e poi un'altra azione su un tasto destro del mouse?Come gestisco gli eventi del clic con il tasto destro in angular.js?

In questo momento ho qualcosa di simile:

<span ng-click="increment()">{{getPointsSpent()}}</span> 

E mi piacerebbe essere anche in grado di fare clic destro sul lasso di svolgere la funzione di decremento();

risposta

125

È possibile utilizzare una direttiva per associare un'azione specifica sul tasto destro del mouse, utilizzando l'evento contextmenu:

app.directive('ngRightClick', function($parse) { 
    return function(scope, element, attrs) { 
     var fn = $parse(attrs.ngRightClick); 
     element.bind('contextmenu', function(event) { 
      scope.$apply(function() { 
       event.preventDefault(); 
       fn(scope, {$event:event}); 
      }); 
     }); 
    }; 
}); 

Code example on fiddle

+0

Questo funziona benissimo, ma se provo ad aprire una nuova finestra dal gestore viene bloccato quando attivato facendo clic con il tasto destro del mouse e non quando attivato dal clic sinistro. Sono al cromo. http://jsfiddle.net/aslakhellesoy/QLHUV/3/ –

+0

@ AslakHellesøy Probabilmente perché il browser non riconosce la direttiva ng-right-click come evento avviato dall'utente. – Magne

+0

@ AslakHellesøy Funziona per me in Chrome (versione 34.0.1847.116 m) – Martin

7

Un modo è utilizzare una direttiva che associa un gestore eventi all'evento contextmenu. Ho avuto difficoltà a fermare il bubbling per evitare che il menu predefinito venisse visualizzato in modo tale che il gestore di script nativo fosse aggiunto per document. Provato con e.stopPropagation(), e.preventDefault(), return false ecc. Verifica del bersaglio in gestore documento sembra funzionare bene

app.directive('rightClick',function(){ 
    document.oncontextmenu = function (e) { 
     if(e.target.hasAttribute('right-click')) { 
      return false; 
     } 
    }; 
    return function(scope,el,attrs){ 
     el.bind('contextmenu',function(e){ 
      alert(attrs.alert);    
     }) ; 
    } 
}); 
<button right-click alert="You right clciked me">Right click me</button> 

DEMO http://plnkr.co/edit/k0TF49GVdlhMuioSHW7i

20

Ciao questa è una vecchia domanda ma ho una soluzione che a mio avviso potrebbe essere più semplice in alcuni casi. Le direttive ngMousedown (e ngMouseup) sono innescato dal tasto destro del mouse e avere accesso alla manifestazione originale del mouse attraverso $event in modo che si possa fare in questo modo:

<span ng-mousedown="handleClick($event)" 
     oncontextmenu="return false"> <!-- use this to prevent context menu --> 
      {{getPointsSpent()}} 
</span> 

Poi nel controller, è possibile effettuare le seguenti operazioni:

$scope.handleClick(evt) { 
    switch(evt.which) { 
     case 1: 
      increment(); // this is left click 
      break; 
     case 2: 
      // in case you need some middle click things 
      break; 
     case 3: 
      decrement(); // this is right click 
      break; 
     default: 
      alert("you have a strange mouse!"); 
      break; 
    } 
} 

Ecco un working fiddle. Funziona allo stesso modo della risposta accettata ma non richiede la creazione di una direttiva completamente nuova. Anche se una direttiva può essere una soluzione migliore, soprattutto se si prevede di allegare funzioni di clic con il pulsante destro a un sacco di cose. Ma comunque, un'altra opzione.

+0

Piuttosto forte, grazie. Per chiunque abbia problemi con esso, l'attributo oncontextmenu deve essere esattamente sull'elemento su cui si fa clic. Aveva sul contenitore e il menu di contesto continuava ad aprirsi. (Chrome 51.0.2700.0 dev-m) –

+1

@ Termi2610 funziona per me con il menu oncontext sul contenitore. versione chrome: 54.0.2840.71 – yannick1976

+0

@ yannick1976 Ho appena testato con la mia versione attuale (53.0.2785.143 m) con lo stesso contenitore che ho usato ad aprile. E sì, funziona. Sembra che fosse un bug nella versione che ho usato prima. –

Problemi correlati