Как я могу обрабатывать события щелчка правой кнопкой мыши в angular.Джей?
есть ли способ настроить элемент так, чтобы он выполнял одно действие при щелчке левой кнопкой мыши (ng-click), а затем другое действие при щелчке правой кнопкой мыши?
сейчас у меня есть что-то вроде:
<span ng-click="increment()">{{getPointsSpent()}}</span>
и я хотел бы также иметь возможность щелкнуть правой кнопкой мыши на промежутке, чтобы выполнить функцию decrement();
4 ответов:
вы можете использовать директиву для привязки конкретного действия по щелчку правой кнопкой мыши, используя
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}); }); }); }; });
Привет, это старый вопрос, но у меня есть решение, я думаю, что может быть проще в некоторых случаях. Директивы ngMousedown (и ngMouseup) запускаются правой кнопкой мыши и имеют доступ к исходному событию мыши через
$eventТак что вы могли бы сделать это таким образом:<span ng-mousedown="handleClick($event)" oncontextmenu="return false"> <!-- use this to prevent context menu --> {{getPointsSpent()}} </span>затем в контроллере, вы можете сделать следующее:
$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; } }здесь рабочая скрипку. Он работает так же, как и принятый ответ, но не требует создания совершенно новой директивы. Хотя директива может быть лучшим решением, особенно если вы планируете прикрепить функции щелчка правой кнопкой мыши ко многим вещам. Но в любом случае, другой вариант.
одним из способов является использование директиву, которая связывает обработчик событий
contextmenuсобытие. Мне было трудно остановить пузырение, чтобы предотвратить меню по умолчанию, чтобы показать так добавлен обработчик собственного скрипта дляdocument. Пробовал сe.stopPropagation(),e.preventDefault(),return falseetc . Проверка цели в обработчике документов, кажется, работает хорошо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>
вы можете использовать этот директива.
<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>
Comments