|
1 |
| - |
| 1 | +/*global angular, $*/ |
2 | 2 | /**
|
3 | 3 | * Adds a 'ui-scrollfix' class to the element when the page scrolls past it's position.
|
4 | 4 | * @param [offset] {int} optional Y-offset to override the detected offset.
|
5 | 5 | * Takes 300 (absolute) or -300 or +300 (relative to detected)
|
6 | 6 | */
|
7 |
| -angular.module('ui.directives').directive('uiScrollfix', [function() { |
8 |
| - return { |
9 |
| - link: function(scope, elm, attrs) { |
10 |
| - var top = elm.offset().top; |
11 |
| - if (!attrs.uiScrollfix) { |
12 |
| - attrs.uiScrollfix = top; |
13 |
| - } else { |
14 |
| - if (attrs.uiScrollfix.indexOf('-') === 0) { |
15 |
| - attrs.uiScrollfix = top - attrs.uiScrollfix.substr(1); |
16 |
| - } else if (attrs.uiScrollfix.indexOf('+') === 0) { |
17 |
| - attrs.uiScrollfix = top + parseInt(attrs.uiScrollfix.substr(1)); |
18 |
| - } |
19 |
| - } |
20 |
| - $(window).bind('scroll.ui-scrollfix', function(){ |
21 |
| - if (!elm.hasClass('ui-scrollfix') && window.pageYOffset > attrs.uiScrollfix) { |
22 |
| - elm.addClass('ui-scrollfix'); |
23 |
| - } else if (elm.hasClass('ui-scrollfix') && window.pageYOffset < attrs.uiScrollfix) { |
24 |
| - elm.removeClass('ui-scrollfix'); |
25 |
| - } |
26 |
| - }); |
27 |
| - } |
28 |
| - }; |
| 7 | +angular.module('ui.directives').directive('uiScrollfix', ['$window', function ($window) { |
| 8 | + 'use strict'; |
| 9 | + return { |
| 10 | + link: function (scope, elm, attrs) { |
| 11 | + var top = elm.offset().top; |
| 12 | + if (!attrs.uiScrollfix) { |
| 13 | + attrs.uiScrollfix = top; |
| 14 | + } else { |
| 15 | + // chartAt is generally faster than indexOf: http://jsperf.com/indexof-vs-chartat |
| 16 | + if (attrs.uiScrollfix.charAt(0) === '-') { |
| 17 | + attrs.uiScrollfix = top - attrs.uiScrollfix.substr(1); |
| 18 | + } else if (attrs.uiScrollfix.charAt(0) === '+') { |
| 19 | + attrs.uiScrollfix = top + attrs.uiScrollfix.substr(1); |
| 20 | + } |
| 21 | + } |
| 22 | + $($window).bind('scroll.ui-scrollfix', function () { |
| 23 | + // if pageYOffset is defined use it, otherwise use other crap for IE |
| 24 | + var offset; |
| 25 | + if (angular.isDefined($window.pageYOffset)) { |
| 26 | + offset = $window.pageYOffset; |
| 27 | + } else { |
| 28 | + var iebody = (document.compatMode && document.compatMode !== "BackCompat") ? document.documentElement : document.body; |
| 29 | + offset = iebody.scrollTop; |
| 30 | + } |
| 31 | + if (!elm.hasClass('ui-scrollfix') && offset > attrs.uiScrollfix) { |
| 32 | + elm.addClass('ui-scrollfix'); |
| 33 | + } else if (elm.hasClass('ui-scrollfix') && offset < attrs.uiScrollfix) { |
| 34 | + elm.removeClass('ui-scrollfix'); |
| 35 | + } |
| 36 | + }); |
| 37 | + } |
| 38 | + }; |
29 | 39 | }]);
|
0 commit comments