Получение реального размера картинки при помощи jQuery

Казалось бы, обычная задача – взять height и width картинки, а нет – то один браузер конючит, то другой… решение следующие:

// берем все необходимые нам картинки
var $img = $('img');
            
// ждем загрузки картинки браузером
$img.load(function(){
    // удаляем атрибуты width и height
    $(this).removeAttr("width")
           .removeAttr("height")
           .css({ width: "", height: "" });

    // получаем заветные цифры
    var width  = $(this).width();
    var height = $(this).height();
});

// для тех браузеров, которые подгрузку с кеша не считают загрузкой, пишем следующий код
$img.each(function() {
    var src = $(this).attr('src');
    $(this).attr('src', '');
    $(this).attr('src', src);
});

32 thoughts on “Получение реального размера картинки при помощи jQuery”

  1. для тех браузеров, которые подгрузку с кеша не считают загрузкой, пишем следующий код

    Все они нормально считают, просто событие load у картинок из кэша наступает быстрее, чем DOMContentLoaded, и ничего в этом нелогичного нет. Состояние готовности изображения можно проверить, получив его свойство complete.

  2. imageObject = new Image();
    imageObject.onload = function() {
      w = imageObject.width;
      h = imageObject.height;
    }

    чем плохо это решение?

    1. Тем, что картинки которые уже находятся в кэше загрузятся раньше чем скрипты. Т.е. onLoad у них произойдет несколько раньше, чем ты сумеешь привязать его к ДОМ-объекту. И в итоге ты не успеешь забрать размер картинки.

  3. как я понял данное решение является кроссобраузерным? не будет траблов например с ie6?

  4. Вы меня извините, но последний пасс – это настоящая пляска с бубном… Нельзя ли как-нить поизящнее? Например, нициировать эвент «load»? )) .load()

  5. Это все замечательно, но не кажется ли вам что после:

        $(this).removeAttr("width")
               .removeAttr("height")
               .css({ width: "", height: "" });

    Уже загруженное масштабированное изображение станет своих реальных размеров и расползется по всему окну браузера, если оно достаточно большое?

    1. После получения размеров их можно вернуть обратно…
      А если уж очень страшно, можно загнать изображение на 10000 пикселей вправо на время удаления атрибутов, так чтоб браузер не рендерил его лишний раз.

  6. Потестил кодик в: ie6, ie7, ie8, FF4, Chrome 12, Safary 4 и 5, Opera 9.50 и 11.10. Прекрасно работает без этого странноватого кусочка с 16 по 19 строки. Картинки грузил с реального сервера, тестировал в каждом браузере три раза:
    1. С чистым кэшем.
    2. С закэшированными изображениями.
    3. С очищенным вручную кэшем.
    Думал что будут проблемы в операх, с их странным отношением к кэшу, но и в них, во всех случаях, размеры каждого изображения прекрасно определялись. Можете пояснить какие именно браузеры имели ввиду в комментарии в строке 16?

  7. Рекомендую для обхода ‘!important’, прописанного в таблицах стилей воспользоваться

    $(this).css('cssText', 'width: auto !important; height: auto !important;');
  8. //Ну и, соответственно, желательно бы предварительно сохранить через:
    $(this).attr('style');
    //А то мало ли что там было
    
  9. ОООгромнейшее спасибо!!!Я уже было разочаровался с этими размерами при первой загрузке .Попробую и я так сделать

  10. ОГРОМНЕЙШЕЕ СПАСИБО,добрый человек!!! Подставил Ваше решение в мой казалось безнадежный скрипт и …ОПА! Все заработала как надо!!!
    у меня центрировалось изображение в диве скриптом.Так вот _при первой загрузке не ловились размеры изображения в Мозилле. В опере же -все ОК было.
    Мозилла достает размеры при попадании картинки в кеш.а иначе-никак. Теперь -все ОК!

  11. Помогло блин… забыл я вообще про событие load )))
    уже реализовал AJAX-ом и php-функцией GetImageSize
    но там была 1 картинка, а потом когда на список наткнулся – решил что Ajax – не катит))))

    Автору респект!

  12. // для тех браузеров, которые подгрузку с кеша не считают загрузкой, пишем следующий код
    var src = $img.attr(‘src’);
    $img.attr(‘src’, ”);
    $img.attr(‘src’, src);

    Я бы лучше сделал это так, а то в фаерфоксе все картинки, что в теге img стали одинаковыми:

    // для тех браузеров, которые подгрузку с кеша не считают загрузкой, пишем следующий код
    $img.each(function() {
    var src = $(this).attr(‘src’);
    $(this).attr(‘src’, ”);
    $(this).attr(‘src’, src);
    });

  13. Подскажите, что делать, если картинка наследует аттрибуты width и height от родительских стилей CSS?

    Я так понимаю, этот блок удаляет только собственные аттрибуты:

    // удаляем атрибуты width и height
    $(this).removeAttr(“width”)
    .removeAttr(“height”)
    .css({ width: “”, height: “” });

  14. Товарищи, вы извращенцы :)) попробуйте

    $img[0].naturalHeight;
    $img[0].naturalWidth;
    1. Просто супер!!!
      Самый короткий и самый логичный вариант!

  15. А если надо так же повесить load на несколько картинок, а после загрузки всех выполнить какое то действие, что посоветуете?

  16. Не лучше ли таким способом? И меньше кода

    <img src="какая то картинка" class="img">
    
    $('.img').hide()
    .show(function() {}, 
    function(){
    $res = $(this).width();
    });
    
  17. Спасибо большое! Никак не мог узнать реальную высоту!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.