I am trying to make sure images larger then their viewing width will be opened in my image viewer. However on a 720p resolution, and Google Chrome, I get 0 for the width for both the original, and viewport widths...
Here is an example page where a image should be opened in BFX View (try in Chrome on lower resolution): Live Example
Log (first image scanned is the image in question)
Starting BFX View Version 0.3 Build 61 alpha
bfxcore.js:92 BFX View -> Looking for images in: .postpreview...
bfxcore.js:92 BFX View -> Looking for images in: .content...
bfxcore.js:109 Image: http://media-cache-ec0.pinimg.com/originals/ed/e1/c7/ede1c78fe16fba4afd1606772a5fc1ac.jpg Original Width: 0 Against: 0
bfxcore.js:109 Image: images/smilies/wink.png Original Width: 0 Against: 0
bfxcore.js:109 Image: images/smilies/smile.png Original Width: 0 Against: 0
bfxcore.js:109 Image: images/primus/blue/misc/quote_icon.png Original Width: 0 Against: 0
bfxcore.js:109 Image: images/primus/blue/buttons/viewpost-right.png Original Width: 0 Against: 0
bfxcore.js:109 Image: images/smilies/wink.png Original Width: 0 Against: 0
bfxcore.js:109 Image: images/smilies/smile.png Original Width: 0 Against: 0
bfxcore.js:109 Image: images/primus/blue/misc/quote_icon.png Original Width: 0 Against: 0
bfxcore.js:109 Image: images/primus/blue/buttons/viewpost-right.png Original Width: 0 Against: 0
JavaScript
$(function(){
/****************************************************
/ BFX View version 0.3 build 56
/ by WASasquatch for BeeskneesFX.com
/***************************************************/
// Global vars
var appname = 'BFX View',
appflag = 'alpha',
appversion = 0.3,
appbuild = 61,
// Selectors
findImagesIn = new Array(
'.postpreview',
'.content',
'.restore',
'.postbody'
), // Master container class/id - all image tags in children elements get selected
// Theater selectors
theater = $('#theater-box'),
theaterimg = theater.find('#theater-img'),
theaterclose = theater.find('#theater-header span');
console.log('Starting '+appname+' Version '+appversion+' Build '+appbuild+' '+appflag);
if ( notMobile === false ) {
console.log(appname+' detected a mobile device. Disabling BFX View for performance. Visit us on a desktop!');
} else {
// Start a BFX View selector
for (i=0; i<findImagesIn.length; i++) {
console.log(appname+' -> Looking for images in: '+findImagesIn[i]+'...');
$(findImagesIn[i]).each(function(){
bfxView('.'+$(this).attr('class'));
});
}
}
function bfxView(id) {
var imgCount = 0;
$(id).each(function(){
$(this).find('img').each(function () {
var img = $(this),
width, height, origWidth = $(this).width();
hiddenImg = img.clone().attr('class','').attr('id','').css('visibility', 'hidden').removeAttr('height').removeAttr('width').appendTo('#loading-images');
height = hiddenImg.height();
width = hiddenImg.width();
hiddenImg.remove();
console.log('Image: '+$(this).attr('src')+' Original Width: '+origWidth+' Against: '+width);
if ( width > origWidth ) {
imgCount++;
$(this).css('cursor', 'pointer');
var parent = $(this).parent();
if ( parent.attr('href') == $(this).attr('src') ) {
parent.attr('target','_self');
parent.removeAttr('href');
}
$(this).click(function () {
var startingPoint = $(document).scrollTop(),
theaterActive = true,
bodyo = $('body').css('overflow');
$('body').css('overflow', 'hidden');
theaterimg.html('<img src="' + $(this).attr('src') + '" alt="Medium View" />');
setTimeout(function(){
theaterimg.find('img').each(function(){
var renderWidth = $(this).width();
if ( renderWidth < width ) {
$(this).css('cursor', 'pointer');
theater.find('#viewfull').attr('href', '/viewer.html?src='+Base64.encode($(this).attr('src'))+'&t='+Base64.encode(window.location.href));
theater.on('click', '#theater-img img', function(){
window.location.href = '/viewer.html?src='+Base64.encode($(this).attr('src'))+'&t='+Base64.encode(window.location.href);
});
} else {
theater.find('#viewfull').remove();
$(this).attr('alt','Full Resolution View');
}
});
},0);
theater.fadeIn(1000, function () {
theaterclose.click(function () {
theater.fadeOut(1000, function() {
theaterActive = false;
});
$('body').css('overflow', bodyo);
});
});
});
}
});
});
console.log(appname+' -> '+imgCount+' images found in '+id);
}
});
I changed the code for searches intending to make sure all possible classes were checked. The old code for starting a search was
for (i=0; i<findImagesIn.length; i++) {
console.log(appname+' -> Looking for images in: '+findImagesIn[i]+'...');
bfxView(findImagesIn[i]);
}
Updated Code Still no go on Chrome and broken on Firefox with this edit. This will tell me "Width" and "height" is not defined, like no image is loaded.
$(this).find('img').each(function () {
$(this).load(function(){
var img = $(this),
width, height, origWidth = $(this).outerWidth();
hiddenImg = img.clone().attr('class','').attr('id','').css('visibility', 'hidden').removeAttr('height').removeAttr('width').appendTo('#loading-images');
height = hiddenImg.height();
width = hiddenImg.width();
hiddenImg.remove();
});
Your example does not work:
BFX View -> 0 images found in ...
Anyway, you are trying to read the width before the image is loaded. Have a look at the answer for this question which actually covers the same topic:
Get the real width and height of an image with JavaScript? (in Safari/Chrome)
For huge images i'd recommend to use a server side script that reads the image dimensions, so the client does not have to wait for the loading of all images to fire your script.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With