下面的文章是本人翻译,原文地址:

http://vadimpopa.com/onblur-like-for-a-div-in-angularjs-to-close-a-popup/

在Angular中利用onblur来关闭一个类似DIV的弹出层

 我们经常遇到一种情况:当用户点击弹出层以外的任何地方时关闭弹出层。有很多其他方案来实现这一功能——其中包括最简单的就是给DIV加上tabindex属性并且利用onblur事件。

但是onblur并不适合我的情况,因为onblur事件只有当弹出层得到焦点之后才能触发。用户可能希望能够在弹出层没有获得焦点的情况下关闭。

 

· HTML

<div tabindex='-1' onblur='closeMyPopup()'></div>

· AngularJS

<div class='popup' tabindex='-1' data-ng-show='form.popups.myPopup' data-ui-event="{blur:'closeMyPopup()'}"></div>

于是我写了一个非常简单的AngularJS directive,当有DOM click事件触发并且click的target不是弹出层的子节点的时候这个这个directive会计算scope中表达式的值:

 1 app.directive('outsideClick', ['$document', '$parse', function($document, $parse){
 2     return {
 3         link: function($scope, $element, $attributes){
 4             var scopeExpression = $attributes.outsideClick,
 5                  onDocumentClick = function(event){
 6                      var isChild = $element.find(event.target).lenght>0;//这行代码有错
 7                      
 8                      if(!isChild){
 9                          $scope.$apply(scopeExpression);
10                      }
11                  };
12             $document.on('click', onDocumentClick);
13 
14             $element.on('$destroy', function(){
15                 $document.off('click', onDocumentClick);
16             });
17         }
18     }
19 }]);

使用起来也很容易:

1 <div class='popup' data-ng-show='form.popups.myPopup' outside-click='closeMyPopup()'></div>

上面那行有错的代码问题在于此时的evt.target是属于js原生的dom原生,而$element则是Angular内嵌的JQLite获取到的元素,一个是js对象,一个是jq对象,所以查找不到。可以把那段去掉自己写一个判断是否是父子节点的方法,很简单,这里就不赘述了。

 

英文水平有限,如有不正确的地方,欢迎指正

 posted on 2014-12-04 23:09  Nitter Kio  阅读(1739)  评论(0)    收藏  举报