Angular解决IE和Firefox下button内部元素ng-click事件被屏蔽

如果我们在button元素内部有其它的子元素并且绑定点击事件,比如:

而我们的代码是这样的:

<body ng-controller="ctrl">
    <script> angular.module("app",[]) .controller("ctrl",function($scope){ $scope.sayButton = function(e){ alert('button'); }; $scope.saySpan = function(e){ alert('span'); }; }) </script>
    <button class="btn btn-default btn lg" ng-click="sayButton($event)">
        Button
        <span class="star glyphicon glyphicon-star" ng-click="saySpan($event)"></span>
    </button>

</body>

这种情况下 chrome下点击span元素,会提示两个,即’span’和’button’,而对于IE则只提示’button’。(点击button均只提示’button’)

解决IE的处理点击事件错误的方式就是找“别的元素”来代替”button”元素,”狸猫换太子“。所以代码就变成了这样:

<div class="btn btn-default btn lg" ng-click="sayButton($event)">
    Button
    <span class="star glyphicon glyphicon-star" ng-click="saySpan($event)"></span>
</div>

这样结果对于chrome和IE结果都是一样的,点击span元素先提示’span’后提示’button’,点击button元素只提示’button’。

还有个问题就是阻止事件冒泡了,解决方法只需要在函数最后添加e.stopPropagation(); 这句代码,所以最终我们的结果就是:

<body ng-controller="ctrl">
    <script> angular.module("app",function($scope){ $scope.sayButton = function(e){ alert('button'); e.stopPropagation(); }; $scope.saySpan = function(e){ alert('span'); e.stopPropagation(); }; }) </script>
    <div class="btn btn-default btn lg" ng-click="sayButton($event)">
        Button
        <span class="star glyphicon glyphicon-star" ng-click="saySpan($event)"></span>
    </div>

</body>

效果图:(IE下)

Chrome下:

博客写到这FireFox也终于打开了,顺便看看效果
FireFox下:

代码https://github.com/justforuse/Pro_Angular-demo/tree/master/button-inner




此文档的作者:justforuse
Github Pages:justforuse

相关文章

AngularJS 是一个JavaScript 框架。它可通过 注:建议把脚本放在 元素的底部。这会提高网页加载速度,因...
angluarjs中页面初始化的时候会出现语法{{}}在页面中问题,也即是页面闪烁问题。出现这个的原因是:由于...
AngularJS 通过被称为指令的新属性来扩展 HTML。AngularJS 指令AngularJS 指令是扩展的 HTML 属性,带有...
AngularJS 使用表达式把数据绑定到 HTML。AngularJS 表达式AngularJS 表达式写在双大括号内:{{ expres...
ng-repeat 指令可以完美的显示表格。在表格中显示数据 {{ x.Name }} {{ x.Country }} 使用 CSS 样式为了...
$http是 AngularJS 中的一个核心服务,用于读取远程服务器的数据。读取 JSON 文件下是存储在web服务器上...