forked from TheSharpieOne/angular-off-click
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathoffClick.js
More file actions
50 lines (44 loc) · 1.69 KB
/
offClick.js
File metadata and controls
50 lines (44 loc) · 1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
angular.module('offClick',[])
.directive('offClick', ['$document', function ($document) {
function targetInFilter(target,filter){
if(!target || !filter) return false;
var elms = angular.element(filter);
var elmsLen = elms.length;
for (var i = 0; i< elmsLen; ++i)
if(elms[i].contains(target)) return true;
return false;
}
return {
restrict: 'A',
scope: {
offClick: '&',
offClickIf: '&'
},
link: function (scope, elm, attr) {
if (attr.offClickIf) {
scope.$watch(scope.offClickIf, function (newVal, oldVal) {
if (newVal && !oldVal) {
$document.on('click', handler);
} else if(!newVal){
$document.off('click', handler);
}
}
);
} else {
$document.on('click', handler);
}
scope.$on('$destroy', function() {
$document.off('click', handler);
});
function handler(event) {
// This filters out artificial click events. Example: If you hit enter on a form to submit it, an
// artificial click event gets triggered on the form's submit button.
if (event.pageX == 0 && event.pageY == 0) return;
var target = event.target || event.srcElement;
if (!(elm[0].contains(target) || targetInFilter(target, attr.offClickFilter))) {
scope.$apply(scope.offClick());
}
}
}
};
}]);