71 votes

Comment gérer les événements de clic droit dans angular.js ?

Existe-t-il un moyen de configurer un élément de manière à ce qu'il exécute une action en cas de clic gauche (ng-click), puis une autre action en cas de clic droit ?

Pour l'instant, j'ai quelque chose comme :

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

Et j'aimerais aussi pouvoir faire un clic droit sur l'étendue pour exécuter la fonction decrement() ;

139voto

Bastien Caudan Points 2281

Vous pouvez utiliser une directive pour lier une action spécifique au clic droit, en utilisant la directive contextmenu événement :

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

Exemple de code sur le violon

0 votes

Cela fonctionne très bien, mais si j'essaie d'ouvrir une nouvelle fenêtre à partir du gestionnaire, il se bloque lorsqu'il est déclenché par un clic droit, mais pas lorsqu'il est déclenché par un clic gauche. Je suis sur chrome. jsfiddle.net/aslakhellesoy/QLHUV/3

0 votes

@AslakHellesøy Probablement parce que le navigateur ne reconnaît pas la directive ng-clic droit comme un événement initié par l'utilisateur.

0 votes

@AslakHellesøy Fonctionne pour moi dans Chrome (version 34.0.1847.116 m)

27voto

bradimus Points 517

Bonjour, c'est une vieille question mais j'ai une solution qui, je pense, peut être plus simple dans certains cas. Les directives ngMousedown (et ngMouseup) sont déclenchées par le bouton droit de la souris et ont accès à l'événement original de la souris par le biais de $event donc vous pourriez le faire de cette façon :

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

Ensuite, dans le contrôleur, vous pouvez faire ce qui suit :

$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;
    }
}

Voici un violon de travail . Elle fonctionne de la même manière que la réponse acceptée, mais ne nécessite pas la création d'une toute nouvelle directive. Bien qu'une directive puisse être une meilleure solution, surtout si vous prévoyez d'attacher des fonctions de clic droit à de nombreux éléments. Mais quoi qu'il en soit, une autre option.

7voto

charlietfl Points 41873

L'une des méthodes consiste à utiliser une directive qui lie un gestionnaire d'événements à l'adresse suivante contextmenu événement. J'ai eu du mal à arrêter les bulles pour empêcher le menu par défaut de s'afficher. J'ai donc ajouté un gestionnaire natif script pour l'évènement document . Essayé avec e.stopPropagation() , e.preventDefault() , return false etc . La vérification de la cible dans le gestionnaire de documents semble bien fonctionner.

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

1voto

boia Points 43

Vous pouvez utiliser ce directive .

<div ng-controller="demoCtrl" save-content="classic-html">
  <div contextmenu="{{lists}}" class="box" click-menu="clickMenu(item)" right-click="rightClick($event)">
    <span>normal dropmenu</span>
  </div>
</div>

<script type="text/javascript">
angular.module('demo', ['ngContextMenu'])

  .controller('demoCtrl', ['$scope', function($scope) {
    $scope.lists = [{
      name: '11'
    }, {
      name: '22'
    }]

    $scope.clickMenu = function (item) {
      console.log(item);
    };

    $scope.rightClick = function (event) {
      console.log(event);
    };
  }])
</script>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X