Я создаю плагин JQuery.
Как получить реальную ширину и высоту изображения с помощью Javascript в Safari?
Следующее работает с Firefox 3, IE7 и Opera 9:
var pic = $("img")
// need to remove these in of case img-element has set width and height
pic.removeAttr("width");
pic.removeAttr("height");
var pic_real_width = pic.width();
var pic_real_height = pic.height();
Но в браузерах Webkit, таких как Safari и Google Chrome, значения равны 0.
javascript
jquery
safari
google-chrome
webkit
Фрэнк Баннистер
источник
источник
Ответы:
Браузеры Webkit устанавливают свойство высоты и ширины после загрузки изображения. Вместо использования тайм-аутов я бы рекомендовал использовать событие загрузки изображения. Вот быстрый пример:
Чтобы избежать какого-либо влияния CSS на размеры изображения, приведенный выше код создает копию изображения в памяти. Это очень умное решение, предложенное FDisk .
Вы также можете использовать атрибуты
naturalHeight
иnaturalWidth
HTML5.источник
width
иheight
вам , вероятно , следует также удалитьmin-width
,min-height
,max-width
иmax-height
как они могут также влиять на размеры изображения.window.onload
, высота / ширина 0 может быть возвращена. В любом случае, я интегрировал идею FDisk в решение выше.load()
она будет выполняться асинхронно, поэтому, если вы хотите получить доступwidth
иheight
- они могут быть еще не установлены. Вместо этого делайте «магию» вload()
себе!Используйте
naturalHeight
иnaturalWidth
атрибуты из HTML5 .Например:
Работает в IE9 +, Chrome, Firefox, Safari и Opera ( статистика ).
источник
Вам не нужно удалять стиль из изображения или атрибутов размеров изображения. Просто создайте элемент с помощью JavaScript и получите ширину созданного объекта.
источник
Image
объект, а затем посмотреть на егоwidth
собственность. Это простой, элегантный подход. FDisk, у тебя есть мой голос. :)window.onload
, может быть возвращена ширина 0.Основная проблема заключается в том, что браузеры WebKit (Safari и Chrome) загружают информацию JavaScript и CSS параллельно. Таким образом, JavaScript может выполняться до того, как будут вычислены эффекты стиля CSS, возвращая неправильный ответ. В jQuery я обнаружил, что решение состоит в том, чтобы ждать, пока document.readyState == 'complete', .eg,
Что касается ширины и высоты ... в зависимости от того, что вы делаете, вы можете захотеть offsetWidth и offsetHeight, которые включают в себя такие вещи, как границы и отступы.
источник
$(window).load(function(){ ... });
помогло в моем случаеВ принятом ответе много говорится о проблеме, при которой
onload
событие не срабатывает, если изображение загружается из кэша WebKit.В моем случае
onload
срабатывает кэширование изображений, но высота и ширина по-прежнему равны 0. ПростойsetTimeout
вопрос решил для меня:Я не могу сказать, почему
onload
событие запускается, даже когда изображение загружается из кэша (улучшение jQuery 1.4 / 1.5?), Но если вы все еще испытываете эту проблему, возможно, сочетание моего ответа иvar src = img.src; img.src = ""; img.src = src;
техники работай.(Обратите внимание, что для моих целей меня не интересуют заранее определенные измерения, как в атрибутах изображения, так и в стилях CSS - но вы можете удалить их, как указано в ответе Хави. Или клонировать изображение.)
источник
это работает для меня (сафари 3.2), стреляя изнутри
window.onload
события:источник
Вы можете программно получить изображение и проверить размеры, используя Javascript без необходимости связываться с DOM.
источник
А как насчет
image.naturalHeight
иimage.naturalWidth
свойства?Кажется, хорошо работает довольно много версий в Chrome, Safari и Firefox, но не совсем в IE8 или даже IE9.
источник
Jquery имеет два свойства, называемых naturalWidth и naturalHeight, которые вы можете использовать таким образом.
Где my-img - это имя класса, используемое для выбора моего изображения.
источник
naturalWidth
(и высота) являются свойствами объекта элемента изображения. developer.mozilla.org/en/docs/Web/API/HTMLImageElementКак мы получаем правильные реальные размеры без мерцания реального изображения:
Работает с <img class = "toreaddimensions" ...
источник
Как было сказано ранее, ответ Xavi не будет работать, если изображения находятся в кеше. Эта проблема связана с тем, что webkit не запускает событие load для кэшированных изображений, поэтому, если атрибуты width / height явно не заданы в теге img, единственный надежный способ получить изображения - дождаться
window.load
событие не будет запущено.window.load
Событие будет срабатывать всегда , так что это безопасно для доступа к ширине / высоте и IMG после этого без какой - либо трюк.Если вам нужно получить размер динамически загружаемых изображений, которые могут кэшироваться (загружаться ранее), вы можете использовать метод Xavi плюс строку запроса для запуска обновления кэша. Недостатком является то, что это вызовет другой запрос к серверу, для img, который уже кешируется и должен быть уже доступен. Глупый Webkit.
PS: если у вас есть QueryString в
img.src
, вам придется проанализировать его и добавить дополнительный параметр для очистки кэша.источник
Как говорит Люк Смит, загрузка изображений - это беспорядок . Это не надежно во всех браузерах. Этот факт причинил мне большую боль. Кэшированное изображение вообще не будет запускать событие в некоторых браузерах, поэтому те, кто сказал «загрузка изображения лучше, чем setTimeout», ошибаются.
Решение Люка Смита здесь.
И есть интересная дискуссия о том, как этот беспорядок может быть обработан в jQuery 1.4.
Я обнаружил, что довольно надежно установить ширину равной 0, а затем подождать, пока свойство «complete» станет истинным, а свойство width станет больше нуля. Вы должны следить за ошибками тоже.
источник
Из комментария Криса: http://api.jquery.com/load-event/
источник
Моя ситуация, вероятно, немного отличается. Я динамически изменяю src изображения через javascript, и мне нужно было убедиться, что новое изображение имеет размеры, пропорциональные размеру фиксированного контейнера (в фотогалерее) Сначала я просто удалил атрибуты ширины и высоты изображения после его загрузки (через событие загрузки изображения) и сбросил их после расчета предпочтительных размеров. Тем не менее, это не работает в Safari и, возможно, IE (я не проверял это в IE полностью, но изображение даже не показывает, так что ...).
В любом случае, Safari сохраняет размеры предыдущего изображения, поэтому размеры всегда на одно изображение позади. Я предполагаю, что это как-то связано с кешем. Поэтому самое простое решение - просто клонировать изображение и добавить его в DOM (важно, чтобы оно было добавлено в DOM для получения и высоты). Дайте изображению значение видимости скрытого (не используйте display none, потому что оно не будет работать). После того, как вы получите размеры, удалите клон.
Вот мой код с использованием jQuery:
Это решение работает в любом случае.
источник
Теперь есть плагин jQuery
event.special.load
для работы со случаями, когда событие загрузки для кэшированного изображения не срабатывает: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.jsисточник
Недавно мне нужно было найти ширину и высоту для установки размера по умолчанию для .dialog, представляющего график. Решение, которое я использую, было:
Для меня это работает в FF3, Opera 10, IE 8,7,6
PS Вы можете найти еще несколько решений, заглянув в некоторые плагины, такие как LightBox или ColorBox.
источник
Чтобы добавить к ответу Хави, gitub от
Paul Irish,gitgub Дэвида Десандро, предлагает функцию imagesLoaded (), которая работает на тех же принципах и решает проблему с кэшированными изображениями некоторых браузеров, не запускающими событие .load () (с умным original_src -> data_uri -> исходное переключение).Он широко используется и регулярно обновляется, что делает его самым надежным решением проблемы, IMO.
источник
imagesLoaded
функции здесь: github.com/desandro/imagesloadedЭто работает как для кэшированных, так и для динамически загружаемых изображений.
Чтобы использовать этот скрипт:
Демо: http://jsfiddle.net/9543z/2/
источник
Я сделал несколько вспомогательных функций, используя плагин imagesLoaded jquery: https://github.com/desandro/imagesloaded
Вы можете использовать это, передавая URL, функцию и ее контекст. Функция выполняется после загрузки изображения и возврата созданного изображения, его ширины и высоты.
источник
Если изображение уже используется, вы должны:
установить исходные размеры изображения
image.css ('width', 'initial'); image.css ('height', 'initial');
получить размеры
var originalWidth = $ (this) .width (); var originalHeight = $ (this) .height ();
источник
Вы можете использовать свойства naturalWidth и naturalHeight элемента изображения HTML. (Вот больше информации ).
Вы бы использовали это так:
Кажется, что это работает во всех браузерах, кроме IE от версии 8 и ниже.
источник
Я проверил ответ Дио, и он прекрасно работает для меня.
$('#image').fadeIn(10,function () {var tmpW = $(this).width(); var tmpH = $(this).height(); });
Убедитесь, что вы вызываете все свои функции так же. этот дескриптор с размером изображения в функции recaller функции fadeIn ().
Спасибо за это.
источник
Я использую другой подход, просто делаю Ajax-вызов на сервер, чтобы получить размер изображения, когда объект изображения используется.
и, конечно, код на стороне сервера:
источник
Это работает кросс-браузер
получить размеры с помощью
Ура!
источник
Еще одно предложение - использовать плагин imagesLoaded .
источник
// Этот код помогает показать изображение с размером 200 * 274
источник
Вот кросс-браузерное решение, которое запускает событие при загрузке выбранных изображений: http://desandro.github.io/imagesloaded/ вы можете посмотреть высоту и ширину в функции imagesLoaded ().
источник
Наткнулся на эту ветку, пытаясь найти ответ на свой вопрос. Я пытался определить ширину / высоту изображения в функции ПОСЛЕ загрузчика и продолжал выдавать 0. Я чувствую, что это может быть то, что вы ищете, хотя, как это работает для меня:
источник
Проверьте этот репозиторий в github!
Отличный пример для проверки ширины и высоты с использованием Javascript
https://github.com/AzizAK/ImageRealSize
--- Отредактировано запрашивается из некоторых комментариев ..
Javascript код:
и HTML-код:
источник
Для функций, в которых вы не хотите изменять исходное расположение или изображение.
источник