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