为什么AngularJS中的$ event.preventDefault()不会阻止上下文菜单出现?

时间:2014-05-11 07:01:20

标签: javascript angularjs events

就像标题所说的那样,我不确定为什么$event.preventDefault()没有阻止右键单击显示上下文菜单。

我已经用this simple example写了一些来证明这个问题。

HTML:

<body ng-controller="MainCtrl">
    <div id="me" ng-mousedown="stopContext($event)">CLICK ME {{num}}</div>
</body>

使用Javascript:

  $scope.stopContext = function(ev) {
    $scope.num += 1;
    ev.preventDefault();
  };

提前致谢。

1 个答案:

答案 0 :(得分:12)

为了阻止上下文菜单,您需要捕获(并阻止) contextmenu 事件。

不幸的是,Angular没有针对此事件的指令,因此您必须自己创建一个。

从Angular的源代码(版本1.2.16)“复制”:

app.directive('myContextmenu', function ($parse) {
  return {
    compile: function (tElem, tAttrs) {
      var fn = $parse(tAttrs.myContextmenu);

      return function (scope, elem) {
        elem.on('contextmenu', onContextmenu);

        function onContextmenu(evt) {
          scope.$apply(function () {
            fn(scope, {$event: evt});
          });
        });
      };
    }
  };
});

然后,您可以像这样使用它:

<div id="me" my-contextmenu="stopContext($event)">CLICK ME {{num}}</div>

另请参阅此 short demo 测试了最新版本的Chrome,Firefox和Safari,并找到了工作。