假设我有一个锚标记,例如

<a href="#" ng-click="do()">Click</a>


如何防止浏览器导航到AngularJS中的#?

评论

就像克里斯在下面说的那样,只需忽略href。

克里斯(Jesse)并不是这样说的,而是使用href =“来保持鼠标指针的行为。

您只需从href中删除#号即可。

或者只使用href =“ javascript:void(0);”保留指针但不执行任何操作(直到您添加另一个点击处理程序)

您能否将Chris接受的最佳答案和投票最多的答案更改为stackoverflow.com/a/11672909?

#1 楼

更新:此后,我改变了主意。经过更多的开发并花了很多时间在解决这个问题上,我相信对这个问题的更好解决方案是执行以下操作:

<a ng-click="myFunction()">Click Here</a>


然后更新您的css以获得更多规则:

a[ng-click]{
    cursor: pointer;
}


它更加简单,并提供完全相同的功能,并且效率更高。希望对将来寻找该解决方案的其他人有所帮助。


以下是我以前的解决方案,我留在这里只是出于遗留目的:

如果您经常遇到此问题,可以通过以下简单指令来解决此问题:

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();
                });
            }
        }
   };
});


它检查所有锚标记(<a></a>)查看其href属性是否为空字符串("")或哈希('#')或是否存在ng-click分配。如果发现这些条件中的任何一个,它将捕获事件并阻止默认行为。

唯一的缺点是,它将对所有锚标记运行此指令。因此,如果页面上有很多锚标记,而您只想防止其中的少量锚标记的默认行为,则此指令的效率不是很高。但是,我几乎总是想要preventDefault,因此我在AngularJS应用程序中都使用了此指令。

#3 楼

您可以将$ event对象传递给您的方法,然后对其调用$event.preventDefault(),这样就不会发生默认处理:

<a href="#" ng-click="do($event)">Click</a>

// then in your controller.do($event) method
$event.preventDefault()


评论


是的,您还可以调用$ event.stopPropagation()以使事件不会冒泡(基本上,您可以访问W3C定义的Event对象:w3.org/TR/DOM-Level-2- Events / events.html#Events-Event)

–mna
2012年7月31日,1:12

请注意,在撰写本文时,在IE8 / 9和Opera上将href留空(或不存在)是不可行的。这是一年前的事,但我还没有机会再试一次(当时我在Github上打开了一个问题,但我认为他们是在一段时间前重新设置了问题)。如果这是固定的(或者您不关心这些浏览器),则请务必使用Chris的答案!如果有人可以尝试并评论/编辑答案,那就更好了。

–mna
2013年6月6日14:19

@PuerkitoBio-我可以确认IE8及以下版本仍需要$ event.preventDefault()... IE税。

– Scotty.NET
13年7月18日在15:47

将$ event传递给控制器​​意味着在控制器中引用DOM,这意味着您已经将视图和控制器耦合在一起。您可以在评估的表达式中直接调用$ event方法:例如ng-click =“ do(); $ event.preventDefault()...尽管,但这不是必需的,因为@Chris的答案是正确的。处于嵌套ngClicks且希望调用$ event.stopPropagation()的人。

– Ben Lesh
13年10月8日在21:13

最后是SEO友好的解决方案。您可能还想在不重新加载ng-view的情况下更新浏览器URL-joelsaupe.com/programming/…这样,您的链接不会重新加载视图,但可以在新标签页中打开,搜索引擎可以关注它们。好极了!

–汤姆
2014年7月19日在12:49