Question
Let's say I have an anchor tag such as
<a href="#" ng-click="do()">Click</a>
How can I prevent the browser from navigating to # in AngularJS ?
Answer
UPDATE : I've since changed my mind on this solution. After more development and time spent working on this, I believe a better solution to this problem is to do the following:
<a ng-click="myFunction()">Click Here</a>
And then update your css
to have an extra rule:
a[ng-click]{
cursor: pointer;
}
Its much more simple and provides the exact same functionality and is much more efficient. Hope that might be helpful to anyone else looking up this solution in the future.
The following is my previous solution, which I am leaving here just for legacy purposes:
If you are having this problem a lot, a simple directive that would fix this issue is the following:
app.directive('a', function() {
return {
restrict: 'E',
link: function(scope, elem, attrs) {
if(attrs.ngClick || attrs.href === '' || attrs.href === '#'){
elem.on('click', function(e){
e.preventDefault();
});
}
}
};
});
It checks all anchor tags (<a></a>
) to see if their href
attribute is
either an empty string (""
) or a hash ('#'
) or there is an ng-click
assignment. If it finds any of these conditions, it catches the event and
prevents the default behavior.
The only down side is that it runs this directive for all anchor tags. So if
you have a lot of anchor tags on the page and you only want to prevent the
default behavior for a small number of them, then this directive isn't very
efficient. However, I almost always want to preventDefault
, so I use this
directive all over in my AngularJS apps.