/** * 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('
')($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); } }; }]);