How do I handle right-click events in angular.js?

前端 未结 4 775
有刺的猬
有刺的猬 2020-11-28 23:23

Is there a way to have an element set up so that it performs one action on left-click (ng-click) and then another action on a right-click?

Right now I have something

相关标签:
4条回答
  • 2020-11-28 23:31

    Hi this is an old question but I have a solution that I think may be simpler in some cases. The ngMousedown (and ngMouseup) directives are triggered by the right mouse button and have access to the original mouse event through $event so you could do it this way:

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

    Then in the controller, you can do the following:

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

    Here is a working fiddle. It works the same as the accepted answer but doesn't require the creation of a whole new directive. Although a directive may be a better solution, especially if you plan to attach right-click functions to lots of things. But anyway, another option.

    0 讨论(0)
  • 2020-11-28 23:31

    You can use this 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>
    
    0 讨论(0)
  • 2020-11-28 23:46

    One way is using a directive that binds an event handler to contextmenu event. I had hard time stopping bubbling to prevent default menu to show up so added native script handler for document. Tried with e.stopPropagation(), e.preventDefault() , return false etc . Checking for target in document handler seems to work well

    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

    0 讨论(0)
  • 2020-11-28 23:58

    You can use a directive to bind specific action on right click, using the contextmenu event :

    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 讨论(0)
提交回复
热议问题