views:

508

answers:

5

I want to resize an image parent to the same size of the image, when the images are loaded.

At this time i'm using this code:

$(window).load(function(){
    $('.image-principale').each(function(){
        $(this).parent().css('height', $(this).height());
    });
});

It work, except than it runs only when every image has loaded. I tried to add an load handler to every image directly but they doesn't trigger.

What's wrong?

Thank you!

+1  A: 

Works for me: http://jsbin.com/ululo/edit

$(function(){
  $("img").load(function(){
    $(this).parent().height( $(this).height() ); 
  }); 
});
Jonathan Sampson
That's because JSBin emits the script after the HTML; he put the script before the HTML. See my answer.
SLaks
Thats what I need, but it doesnt work with more than one image
Hubert Perron
@HubertPerron: Yes it does: http://jsbin.com/ululo/5/edit
Jonathan Sampson
@Jonathan: it doesn't work here.. rev 5 on jsbin. I'm using FF 3.6
Hubert Perron
@Hubert: I just tried it in FF 3.5.7 and it worked just fine. Progressively loaded each image, and then resized their wrapper to be their height.
Jonathan Sampson
@Jonathan: Oh I got it working by clearing my cache. Actually it work but only the first time. When the image are cached the load event won't trigger. Any ideas?
Hubert Perron
A: 

$(window).load() fires only as soon as all data is fetched.

Felix Kling
I know and thats the problem, I want to bind a load event directly to the images.
Hubert Perron
+2  A: 

Try the following:

...Your HTML...

<script type="text/javascript">
    $('.image-principale').load(function(){
        $(this).parent().css('height', $(this).height());
    });
</script>

Note that the script must be placed after the HTML, or it will run before the <img> elements exist and will not actually do anything.

You could also try using live, like this:

$('.image-principale').live('load', function(){
    $(this).parent().css('height', $(this).height());
});

However, I don't know whether it will actually work.

SLaks
Why was this downvoted?
SLaks
You're quite right: putting the handler in ready() doesn't make sense in this case so you should put the JS after the HTML so +1 from me. Also, click on the votes thing, you currently have 1 up, 0 down. There was no downvote.
cletus
There was, but it was removed.
SLaks
Sorry, it doesn't work. I want to bind an load event to every matched element AFTER document ready but BEFORE window load.
Hubert Perron
Why do you need it to be after document ready? Putting it after the HTML should be good enough.
SLaks
It's just cleaner to have the js at the same place. Correct me if i'm wrong but using the $(document).ready or putting the js at the end of the page produce the sames result.
Hubert Perron
No, `$(document).ready` waits for **all** of the resources to be ready. Putting at the end will just wait until everything has been created in the DOM (including the `img` tags).
Brian McKenna
From the jQuery doc. Event ready: Specify a function to execute when the DOM is fully loaded.
Hubert Perron
+1  A: 

On document ready is easy:

$(function() {
  $('.image-principale').load(function(){
    $(this).parent().css('height', $(this).height());
  });
});

or even:

$(function() {
  $('.image-principale').live('load', function(){
    $(this).parent().css('height', $(this).height());
  });
});

outside or inside ready().

cletus
A: 

$('img').load seems to fire each time the image resizes. In my case it makes my site slow. (I'm tried it on FF)

Bernward