summaryrefslogtreecommitdiff
path: root/www/lib/ion-image-lazy-load/ionic-image-lazy-load.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/lib/ion-image-lazy-load/ionic-image-lazy-load.js')
-rw-r--r--www/lib/ion-image-lazy-load/ionic-image-lazy-load.js124
1 files changed, 124 insertions, 0 deletions
diff --git a/www/lib/ion-image-lazy-load/ionic-image-lazy-load.js b/www/lib/ion-image-lazy-load/ionic-image-lazy-load.js
new file mode 100644
index 00000000..da9ff94d
--- /dev/null
+++ b/www/lib/ion-image-lazy-load/ionic-image-lazy-load.js
@@ -0,0 +1,124 @@
+/**
+ * Created by PAVEI on 30/09/2014.
+ * Updated by Ross Martin on 12/05/2014
+ * Updated by Davide Pastore on 04/14/2015
+ * Updated by Michel Vidailhet on 05/12/2015
+ */
+
+angular.module('ionicLazyLoad', []);
+
+angular.module('ionicLazyLoad')
+
+.directive('lazyScroll', ['$rootScope', '$timeout',
+ function($rootScope, $timeout) {
+ return {
+ restrict: 'A',
+ link: function ($scope, $element) {
+
+ var scrollTimeoutId = 0;
+
+ $scope.invoke = function () {
+ $rootScope.$broadcast('lazyScrollEvent');
+ };
+
+ $element.bind('scroll', function () {
+
+ $timeout.cancel(scrollTimeoutId);
+
+ // wait and then invoke listeners (simulates stop event)
+ scrollTimeoutId = $timeout($scope.invoke, 0);
+
+ });
+
+
+ }
+ };
+}])
+
+.directive('imageLazySrc', ['$document', '$timeout', '$ionicScrollDelegate', '$compile',
+ function ($document, $timeout, $ionicScrollDelegate, $compile) {
+ return {
+ restrict: 'A',
+ scope: {
+ lazyScrollResize: "@lazyScrollResize",
+ imageLazyBackgroundImage: "@imageLazyBackgroundImage"
+ },
+ link: function ($scope, $element, $attributes) {
+ if (!$attributes.imageLazyDistanceFromBottomToLoad) {
+ $attributes.imageLazyDistanceFromBottomToLoad = 0;
+ }
+ if (!$attributes.imageLazyDistanceFromRightToLoad) {
+ $attributes.imageLazyDistanceFromRightToLoad = 0;
+ }
+
+ if ($attributes.imageLazyLoader) {
+ var loader = $compile('<div class="image-loader-container"><ion-spinner class="image-loader" icon="' + $attributes.imageLazyLoader + '"></ion-spinner></div>')($scope);
+ $element.after(loader);
+ }
+
+ var deregistration = $scope.$on('lazyScrollEvent', function () {
+ //console.log('scroll');
+ if (isInView()) {
+ loadImage();
+ deregistration();
+ }
+ }
+ );
+
+ function loadImage() {
+ //Bind "load" event
+ $element.bind("load", function (e) {
+ if ($attributes.imageLazyLoader) {
+ loader.remove();
+ }
+ if ($scope.lazyScrollResize == "true") {
+ //Call the resize to recalculate the size of the screen
+ $ionicScrollDelegate.resize();
+ }
+ });
+
+ if ($scope.imageLazyBackgroundImage == "true") {
+ var bgImg = new Image();
+ bgImg.onload = function () {
+ if ($attributes.imageLazyLoader) {
+ loader.remove();
+ }
+ $element[0].style.backgroundImage = 'url(' + $attributes.imageLazySrc + ')'; // set style attribute on element (it will load image)
+ if ($scope.lazyScrollResize == "true") {
+ //Call the resize to recalculate the size of the screen
+ $ionicScrollDelegate.resize();
+ }
+ };
+ bgImg.src = $attributes.imageLazySrc;
+ } else {
+ $element[0].src = $attributes.imageLazySrc; // set src attribute on element (it will load image)
+ }
+ }
+
+ function isInView() {
+ var clientHeight = $document[0].documentElement.clientHeight;
+ var clientWidth = $document[0].documentElement.clientWidth;
+ var imageRect = $element[0].getBoundingClientRect();
+ return (imageRect.top >= 0 && imageRect.top <= clientHeight + parseInt($attributes.imageLazyDistanceFromBottomToLoad))
+ && (imageRect.left >= 0 && imageRect.left <= clientWidth + parseInt($attributes.imageLazyDistanceFromRightToLoad));
+ }
+
+ // bind listener
+ // listenerRemover = scrollAndResizeListener.bindListener(isInView);
+
+ // unbind event listeners if element was destroyed
+ // it happens when you change view, etc
+ $element.on('$destroy', function () {
+ deregistration();
+ });
+
+ // explicitly call scroll listener (because, some images are in viewport already and we haven't scrolled yet)
+ $timeout(function () {
+ if (isInView()) {
+ loadImage();
+ deregistration();
+ }
+ }, 500);
+ }
+ };
+ }]);