Как обрабатывать события щелчка правой кнопкой мыши в angular.js?
Есть ли способ установить элемент таким образом, чтобы он выполнял одно действие по щелчку левой кнопкой мыши (ng-click), а затем другое действие с помощью щелчка правой кнопкой мыши?
Сейчас у меня есть что-то вроде:
<span ng-click="increment()">{{getPointsSpent()}}</span>
И я хотел бы также иметь возможность щелкнуть правой кнопкой мыши по диапазону, чтобы выполнить функцию decment();
Ответы
Ответ 1
Вы можете использовать директиву для привязки определенного действия при щелчке правой кнопкой мыши, используя событие 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});
});
});
};
});
Пример кода на скрипке
Ответ 2
Привет, это старый вопрос, но у меня есть решение, которое, по моему мнению, может быть проще в некоторых случаях. Директивы 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;
}
}
Вот рабочая скрипка. Он работает так же, как и принятый ответ, но не требует создания совершенно новой директивы. Хотя директива может быть лучшим решением, особенно если вы планируете прикрепить функции правого щелчка к множеству вещей. Но в любом случае другой вариант.
Ответ 3
Один из способов - использовать директиву, которая привязывает обработчик события к событию contextmenu
. Мне было трудно остановить пузырьки, чтобы предотвратить появление меню по умолчанию, поэтому добавлен собственный обработчик script для document
. Пробовали e.stopPropagation()
, e.preventDefault()
, return false
и т.д. Проверка цели в обработчике документов, похоже, хорошо работает
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
Ответ 4
Вы можете использовать эту директиву .
<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>
Ответ 5
попробуйте это
HTML
<div ng-app="sampleApp" ng-controller="AppCtrl ">
<div>
<a href="#"
prevent-right-click>Click Me
</a>
</div>
</div>
Angular
var app = angular.module("sampleApp", []);
app.controller("AppCtrl", function($scope) {
console.log('called');
})
app.directive('preventRightClick', [
function() {
return {
restrict: 'A',
link: function($scope, $ele) {
$ele.bind("contextmenu", function(e) {
e.preventDefault();
});
}
};
}
])