Angular ngClick 阻止冒泡和默认行为

这其实是一个很简单的问题,如果你认真查看过Angular官方的API文档,本来不想记录的。但是这个问题不止一次的被人问起,所以今天在记录在这里。

在Angular中已经对一些ng事件如ngClick,ngBlur,ngCopy,ngCut,ngDblclick…中加入了一个变量叫做$event.

如ngClick在官方文档是这么描述的:

Expression to evaluate upon click. (Event object is available as $event)

在查看Angular代码ngEventDirs.js:

复制代码

var ngEventDirectives = {};
    forEach(
      'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),
      function(name) {
        var directiveName = directiveNormalize('ng-' + name);
        ngEventDirectives[directiveName] = ['$parse', function($parse) {
          return {
            compile: function($element, attr) {
              var fn = $parse(attr[directiveName]);
              return function(scope, element, attr) {
                element.on(lowercase(name), function(event) {
                  scope.$apply(function() {
                    fn(scope, {$event:event});
                  });
                });
              };
            }
          };
        }];
      }
    );

复制代码

   在上边代码我们可以得到两个信息:
  1. Angular支持的event: click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste
  2. Angular在执行事件函数时候传入了一个名叫$event的常量,该常量即代表当前event对象,如果你在Angular之前引入了jQuery那么这就是jQuery的event.

所以我们可以利用event的stopPropagation来阻止事件的冒泡:如下代码:jsbin

html 代码:

复制代码

<!DOCTYPE html>
    <html id="ng-app" ng-app="app">
    <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
      <meta charset="utf-8">
      <title>JS Bin</title>
    </head>
    <body ng-controller="demo as d">
       <div ng-click="d.click('parent',$event)">
         given some text for click
         <hr>
         <input type="checkbox" ng-model="d.stopPropagation" />Stop Propagation ?
         <hr>
         <button type="button" ng-click="d.click('button',$event)">button</button>

       </div>
    </body>
    </html>

复制代码

js 代码:

复制代码

angular.module("app",[])
.controller("demo",[function(){
  var vm = this;

  vm.click = function(name,$event){
    console.log(name +" -----called");
    if(vm.stopPropagation){
      $event.stopPropagation();
    }
  };

  return vm;
}]);

复制代码

可以在jsbin](http://jsbin.com/delow/3/watch?html,js,output)查看效果。

首先打开你的控制台,然在没选中Stop Propagation的情况下点击button你将会看见两条log记录,相反选中后则只会出现button的log信息。

 

在angularJS中免不了使用<a></a>标签,使用的时候,在google下,能够正常的过滤掉默认事件,但是在IE中,不行。

在IE8里面,如果不进行默认事件的阻止,那么会在执行完相应的代码后,再执行默认的事件。

 

那么,在angularjs中如何解决这个问题。在AngularJS中有一个$event参数。这个是angualrjs处理事件后对外暴露的接口,让开发者使用。下面是一个使用的小例子:

[html] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. <a href="#" ng-click="HotelDetail(x.HOTELID,$event)">详细信息</a>  


js代码:

[javascript] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. $scope.HotelDetail = function (hotelid,$event) {  
  2.         alert(hotelid);  
  3.         $event.preventDefault();  
  4.     };  


运行结果:

在google和IE8中都能弹出hotelid的值,不再进行默认的跳页动作。

转载于:https://my.oschina.net/u/2558718/blog/863085

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值