e.preventDefault on child element in angularjs 在angularjs中,对子元素使用e.preventDefault
问题的出现原因是在AngularJS中,当一个子元素触发了事件,并且同时也有父元素监听同样的事件时,如果不做处理,父元素的事件处理函数也会被触发。
解决方法是在子元素的事件处理函数中,通过传递$event
对象到父元素的事件处理函数中,然后在父元素的事件处理函数中通过调用$event.stopPropagation()
来阻止事件的冒泡。
以下是解决方法的代码示例:
HTML模板:
<div ng-click="parentHandler($event)"> <div ng-click="childHandler($event)"> </div> </div>
子元素的事件处理函数:
$scope.childHandler = function ($event) { if (wanna_stop_it()) { $event.stopPropagation(); } ... };
通过以上方法,我们可以在子元素的事件处理函数中决定是否停止事件的冒泡,从而避免父元素的事件处理函数被触发。
这种方法比在HTML属性中执行多个表达式更加优雅和简洁。同时也要记得在HTML中传递$event
作为参数给ng-click
指令。
此外,如果希望立即停止冒泡,可以使用$event.stopImmediatePropagation()
方法。
以上方法简单而有效,却常常被忽视。许多人会看到已选择的答案并想着"真的吗?这么丑陋?",却没有意识到可以将$event
作为参数传递。非常好用!
问题出现的原因是在使用 ng-click 指令时,子元素的点击事件会冒泡到父元素,导致父元素的点击事件也被触发。解决方法是使用自定义的指令 isolate-click,在其中阻止事件冒泡,以实现点击子元素时不触发父元素的点击事件。
在使用 isolate-click 指令时,可以将其应用于需要限制点击范围的元素上,如按钮。如果希望只限制按钮的点击范围,而不是整个单元格,可以将按钮包裹在一个 span 元素中,并将 isolate-click 指令应用于 span 元素。
isolate-click 指令的代码如下:
angular.module('awesome', []).directive('isolateClick', function() { return { link: function(scope, elem) { elem.on('click', function(e){ e.stopPropagation(); }); } }; });
注意,需要注意的是,使用 isolate-click 指令会阻止所有在最后一个单元格上的点击事件,而不仅仅是按钮的点击事件。如果不希望这样,可以将按钮包裹在一个 span 元素中,并将 isolate-click 指令应用于 span 元素。
但是需要注意的是,其他插件可能会监听这些点击事件。如果使用的是在点击外部关闭的工具提示插件,可能永远无法关闭,因为外部的点击事件不会传播到 body 元素。
解决方法是在事件中添加一个属性,如 ignoreNgClick=true,并在处理事件时判断是否忽略该事件。可以在原始的 ngClick 指令中进行修改,但这样做可能会导致代码变得混乱。可以考虑使用另一个自定义指令 continue-click,在父元素上应用该指令,以继续事件传播,从而解决这个问题。
使用 isolate-click 指令可以限制点击范围,但需要注意可能与其他插件冲突的问题。在需要继续事件传播的情况下,可以使用 continue-click 指令来解决。