move image code to client/topic/images
parent
d60930a51d
commit
5ca8456340
@ -0,0 +1,119 @@
|
||||
'use strict';
|
||||
|
||||
|
||||
define('forum/topic/images', [
|
||||
'forum/topic/postTools',
|
||||
'navigator',
|
||||
'components',
|
||||
], function (postTools, navigator, components) {
|
||||
var Images = {
|
||||
_imageLoaderTimeout: undefined,
|
||||
};
|
||||
|
||||
Images.unloadImages = function (posts) {
|
||||
var images = posts.find('[component="post/content"] img:not(.not-responsive)');
|
||||
|
||||
if (config.delayImageLoading) {
|
||||
images.each(function () {
|
||||
$(this).attr('data-src', $(this).attr('src'));
|
||||
}).attr('data-state', 'unloaded').attr('src', 'about:blank');
|
||||
} else {
|
||||
images.attr('data-state', 'loaded');
|
||||
Images.wrapImagesInLinks(posts);
|
||||
}
|
||||
};
|
||||
|
||||
Images.loadImages = function (threshold) {
|
||||
if (Images._imageLoaderTimeout) {
|
||||
clearTimeout(Images._imageLoaderTimeout);
|
||||
}
|
||||
|
||||
Images._imageLoaderTimeout = setTimeout(function () {
|
||||
/*
|
||||
If threshold is defined, images loaded above this threshold will modify
|
||||
the user's scroll position so they are not scrolled away from content
|
||||
they were reading. Images loaded below this threshold will push down content.
|
||||
|
||||
If no threshold is defined, loaded images will push down content, as per
|
||||
default
|
||||
*/
|
||||
|
||||
var images = components.get('post/content').find('img[data-state="unloaded"]');
|
||||
var visible = images.filter(function () {
|
||||
return utils.isElementInViewport(this);
|
||||
});
|
||||
var posts = $.unique(visible.map(function () {
|
||||
return $(this).parents('[component="post"]').get(0);
|
||||
}));
|
||||
var scrollTop = $(window).scrollTop();
|
||||
var adjusting = false;
|
||||
var adjustQueue = [];
|
||||
var oldHeight;
|
||||
var newHeight;
|
||||
|
||||
function adjustPosition() {
|
||||
adjusting = true;
|
||||
oldHeight = document.body.clientHeight;
|
||||
|
||||
// Display the image
|
||||
$(this).attr('data-state', 'loaded');
|
||||
newHeight = document.body.clientHeight;
|
||||
|
||||
var imageRect = this.getBoundingClientRect();
|
||||
if (imageRect.top < threshold) {
|
||||
scrollTop += newHeight - oldHeight;
|
||||
$(window).scrollTop(scrollTop);
|
||||
}
|
||||
|
||||
if (adjustQueue.length) {
|
||||
adjustQueue.pop()();
|
||||
} else {
|
||||
adjusting = false;
|
||||
|
||||
Images.wrapImagesInLinks(posts);
|
||||
posts.length = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// For each image, reset the source and adjust scrollTop when loaded
|
||||
visible.attr('data-state', 'loading');
|
||||
visible.each(function (index, image) {
|
||||
image = $(image);
|
||||
|
||||
image.on('load', function () {
|
||||
if (!adjusting) {
|
||||
adjustPosition.call(this);
|
||||
} else {
|
||||
adjustQueue.push(adjustPosition.bind(this));
|
||||
}
|
||||
});
|
||||
|
||||
image.attr('src', image.attr('data-src'));
|
||||
image.removeAttr('data-src');
|
||||
});
|
||||
}, 250);
|
||||
};
|
||||
|
||||
Images.wrapImagesInLinks = function (posts) {
|
||||
posts.find('[component="post/content"] img:not(.emoji)').each(function () {
|
||||
var $this = $(this);
|
||||
var src = $this.attr('src');
|
||||
var suffixRegex = /-resized(\.[\w]+)?$/;
|
||||
|
||||
if (src === 'about:blank') {
|
||||
return;
|
||||
}
|
||||
|
||||
if (utils.isRelativeUrl(src) && suffixRegex.test(src)) {
|
||||
src = src.replace(suffixRegex, '$1');
|
||||
}
|
||||
|
||||
if (!$this.parent().is('a')) {
|
||||
$this.wrap('<a href="' + src + '" target="_blank">');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
return Images;
|
||||
});
|
Loading…
Reference in New Issue