From 94d7e111674fc3e273bd6f0a7b5a60019a9f3ebc Mon Sep 17 00:00:00 2001 From: Hans-Peter Dietz Date: Wed, 13 Apr 2016 13:52:36 +0200 Subject: [PATCH] Enable the service to work with selectors --- CHANGELOG.md | 5 + dist/ngAnimatedScroll.service.min.js | 2 +- gulpfile.js | 2 +- lib/ngAnimatedScroll.service.js | 25 +++- package.json | 2 +- spec/ngAnimatedScroll.spec.js | 194 ++++++++++++++++++++++++--- 6 files changed, 206 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 970badb..3d3d543 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +1.4.0 +----- + +- Enable the service to work with selectors + 1.3.2 ----- diff --git a/dist/ngAnimatedScroll.service.min.js b/dist/ngAnimatedScroll.service.min.js index 641fc54..dd421aa 100644 --- a/dist/ngAnimatedScroll.service.min.js +++ b/dist/ngAnimatedScroll.service.min.js @@ -1 +1 @@ -!function(){"use strict";angular.module("AnimatedScroll",[]).factory("animatedScroll",["$q","$timeout","$interval",function(e,n,t){var r={DURATION:800,OFFSET:0,EASING_PATTERN:"easeInOutQuart",TIME_PER_FRAME:16,SCROLL_ELEMENT:window},u={easeInQuad:function(e){return e*e},easeOutQuad:function(e){return e*(2-e)},easeInOutQuad:function(e){return.5>e?2*e*e:-1+(4-2*e)*e},easeInCubic:function(e){return e*e*e},easeOutCubic:function(e){return--e*e*e+1},easeInOutCubic:function(e){return.5>e?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1},easeInQuart:function(e){return e*e*e*e},easeOutQuart:function(e){return 1- --e*e*e*e},easeInOutQuart:function(e){return.5>e?8*e*e*e*e:1-8*--e*e*e*e},easeInQuint:function(e){return e*e*e*e*e},easeOutQuint:function(e){return 1+--e*e*e*e*e},easeInOutQuint:function(e){return.5>e?16*e*e*e*e*e:1+16*--e*e*e*e*e}},a=function(e){return u[e]?u[e]:function(){return time}},o=function(e,n){for(var t=e.offsetTop-e.clientHeight,r=e.offsetParent;r;)t-=r.offsetTop,r=r.offsetParent;return t=Math.max(t-n,0)},i=function(e){return e===window?window.pageYOffset?window.pageYOffset:document.documentElement.scrollTop:e.scrollTop};return{scroll:function(u,s){var c=e.defer();if(!u)return c.reject(new Error("Missing parameter: element is not defined!")),c.promise;if(!(u instanceof Element||u instanceof angular.element))return c.reject(new Error("Invalid parameter: element must either be an angular.element or an Element!")),c.promise;s=s||{};var f=parseInt(s.duration,10)||r.DURATION,l=parseInt(s.offset,10)||r.OFFSET,m="string"==typeof s.easing?s.easing:r.EASING_PATTERN,E=parseInt(s.timePerFrame,10)||r.TIME_PER_FRAME,I=r.SCROLL_ELEMENT;(s.scrollElement instanceof Element||s.scrollElement instanceof angular.element)&&(I=s.scrollElement),I instanceof angular.element&&(I=I[0]),u instanceof angular.element&&(u=u[0]);var d=a(m);return n(function(){var e,n,r,a=i(I),s=0,m=o(u,l),O=m-a,T=t(function(){s+=E,e=s/f,e>1&&(e=1),r=i(I),n=a+O*d(e),I.scrollTop=n,n!==m&&r!==m||(t.cancel(T),c.resolve(u))},E)}),c.promise}}}])}(); \ No newline at end of file +!function(){"use strict";angular.module("AnimatedScroll",[]).factory("animatedScroll",["$q","$timeout","$interval",function(e,n,t){var r={DURATION:800,OFFSET:0,EASING_PATTERN:"easeInOutQuart",TIME_PER_FRAME:16,SCROLL_ELEMENT:window},u={easeInQuad:function(e){return e*e},easeOutQuad:function(e){return e*(2-e)},easeInOutQuad:function(e){return.5>e?2*e*e:-1+(4-2*e)*e},easeInCubic:function(e){return e*e*e},easeOutCubic:function(e){return--e*e*e+1},easeInOutCubic:function(e){return.5>e?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1},easeInQuart:function(e){return e*e*e*e},easeOutQuart:function(e){return 1- --e*e*e*e},easeInOutQuart:function(e){return.5>e?8*e*e*e*e:1-8*--e*e*e*e},easeInQuint:function(e){return e*e*e*e*e},easeOutQuint:function(e){return 1+--e*e*e*e*e},easeInOutQuint:function(e){return.5>e?16*e*e*e*e*e:1+16*--e*e*e*e*e}},o=function(e){return u[e]?u[e]:function(){return time}},a=function(e,n){for(var t=e.offsetTop-e.clientHeight,r=e.offsetParent;r;)t-=r.offsetTop,r=r.offsetParent;return t=Math.max(t-n,0)},i=function(e){return e===window?window.pageYOffset?window.pageYOffset:document.documentElement.scrollTop:e.scrollTop},l=function(){return new Error("Invalid parameter: element must either be an angular.element, Element or a valid selector string!")};return{scroll:function(u,s){var c=e.defer();if(!u)return c.reject(new Error("Missing parameter: element is not defined!")),c.promise;if("string"==typeof u){var f=document.querySelector(u);if(!f)return c.reject(l()),c.promise;u=f}else if(!(u instanceof Element||u instanceof angular.element))return c.reject(l()),c.promise;s=s||{};var m=parseInt(s.duration,10)||r.DURATION,E=parseInt(s.offset,10)||r.OFFSET,d="string"==typeof s.easing?s.easing:r.EASING_PATTERN,p=parseInt(s.timePerFrame,10)||r.TIME_PER_FRAME,I=r.SCROLL_ELEMENT;if(s.scrollElement instanceof Element||s.scrollElement instanceof angular.element)I=s.scrollElement instanceof angular.element?s.scrollElement[0]:s.scrollElement;else if("string"==typeof s.scrollElement){var f=document.querySelector(s.scrollElement);f&&(I=f)}u instanceof angular.element&&(u=u[0]);var O=o(d);return n(function(){var e,n,r,o=i(I),l=0,s=a(u,E),f=s-o,d=t(function(){l+=p,e=l/m,e>1&&(e=1),r=i(I),n=o+f*O(e),I.scrollTop=n,n!==s&&r!==s||(t.cancel(d),c.resolve(u))},p)}),c.promise}}}])}(); \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index 844a07f..9a2f4b3 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -77,7 +77,7 @@ }); gulp.task('build', function(done) { - require('run-sequence')(['clean', 'updateVersion'], 'dist', done); + require('run-sequence')(['clean', 'updateVersion', 'test'], 'dist', done); }); gulp.task('updateVersion', function(done) { diff --git a/lib/ngAnimatedScroll.service.js b/lib/ngAnimatedScroll.service.js index 3322731..c972b97 100644 --- a/lib/ngAnimatedScroll.service.js +++ b/lib/ngAnimatedScroll.service.js @@ -137,6 +137,10 @@ return element.scrollTop; }; + var getInvalidElementError = function() { + return new Error('Invalid parameter: element must either be an angular.element, Element or a valid selector string!'); + }; + return { /** * AnimateScroll.scroll() @@ -158,8 +162,16 @@ if (!element) { deferred.reject(new Error('Missing parameter: element is not defined!')); return deferred.promise; + } else if (typeof element === 'string') { + var tmp = document.querySelector(element); + if (tmp) { + element = tmp; + } else { + deferred.reject(getInvalidElementError()); + return deferred.promise; + } } else if (!(element instanceof Element || element instanceof angular.element)) { - deferred.reject(new Error('Invalid parameter: element must either be an angular.element or an Element!')); + deferred.reject(getInvalidElementError()); return deferred.promise; } @@ -171,11 +183,12 @@ var scrollElement = DEFAULT_OPTIONS.SCROLL_ELEMENT; if (options.scrollElement instanceof Element || options.scrollElement instanceof angular.element) { - scrollElement = options.scrollElement; - } - - if (scrollElement instanceof angular.element) { - scrollElement = scrollElement[0]; + scrollElement = options.scrollElement instanceof angular.element ? options.scrollElement[0] : options.scrollElement; + } else if (typeof options.scrollElement === 'string') { + var tmp = document.querySelector(options.scrollElement); + if (tmp) { + scrollElement = tmp; + } } if (element instanceof angular.element) { diff --git a/package.json b/package.json index 941ac4b..a9d4f62 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ng-animated-scroll", - "version": "1.3.1", + "version": "1.4.0", "description": "A promise based angular.js service to facilitate animated scrolling.", "main": "dist/ngAnimatedScroll.service.min.js", "scripts": { diff --git a/spec/ngAnimatedScroll.spec.js b/spec/ngAnimatedScroll.spec.js index d131257..dc1fefa 100644 --- a/spec/ngAnimatedScroll.spec.js +++ b/spec/ngAnimatedScroll.spec.js @@ -68,11 +68,50 @@ }); }); - describe('with a valid element', function() { + describe('providing an angular.element as element', function() { var deferred; var resolved; + var rejectArgs; + var list; var elementToScrollTo; + beforeEach(function() { + (function() { + var l = document.getElementById('list'); + if (l) { + l.parentElement.removeChild(l); + } + })(); + + list = angular.element('