Ожидание загрузки изображения в Javascript

Я делаю вызов Ajax, который возвращает мне некоторую информацию, включая путь к изображению. Я готовлю все эти данные в своем HTML, который будет отображаться как своего рода всплывающее окно. Я просто переключаю видимость по всплывающему div от скрытого до видимого.

Чтобы установить позицию моего всплывающего div, я должен рассчитать в зависимости от высоты изображения. Таким образом, я должен дождаться загрузки изображения, чтобы узнать его размер, прежде чем устанавливать положение и переключать видимость на видимый.

Я пробовал трюки с рекурсией, setTimeout, полным свойством img, while loop... без успеха.

Итак, как я могу это сделать. Возможно, мне нужно вернуть измерения в мой вызов Ajax.

Ответ 1

var img = new Image();
img.onload = function() { alert("Height: " + this.height); }
img.src = "http://path/to/image.jpg";

Обратите внимание, что это важно сделать в следующем порядке: Первый привязать обработчик, , затем установить src. Если вы делаете это наоборот, и изображение находится в кеше, вы можете пропустить это событие. JavaScript работает в одном потоке в браузерах (если вы не используете веб-работников), но браузеры не однопоточные. Совершенно верно для браузера, чтобы увидеть src, определить ресурс, загрузить его, запустить событие, посмотреть на элемент, чтобы увидеть, есть ли у него какие-либо обработчики, которые должны быть поставлены в очередь для обратного вызова, а не видеть, и завершите обработку событий, все между строкой src и строкой, содержащей обработчик. (Обратные вызовы не будут происходить между строками, если они были зарегистрированы, они будут ждать в очереди, но если их нет, событие не требуется ждать.)

Ответ 2

Если вы используете jQuery, вы можете использовать его load событие.

Посмотрите пример:

$('img.userIcon').load(function(){
    if($(this).height() > 100) {
        $(this).addClass('bigImg');
    }
});

Ответ 3

У меня была медленная загрузка изображения captcha (1st_image) на моей странице, и я хотел отобразить другое изображение (2nd_image) только ПОСЛЕ ПОКУПКИ изображения captcha (1st_image). Поэтому мне пришлось дождаться загрузки изображения captcha (1st_image).

Вот решение, которое отлично работает, чтобы дождаться загрузки изображения сначала, а затем загрузить другое изображение: (Не забудьте отобразить изображение "please wait!", пока они ждут загрузки другого изображения)

<script>
function checkImageLoad() {
    if (document.getElementById("1st_image").complete == true){console.log("1st_image Loaded!");}
    document.getElementById("2nd_image").src = "http://domain.com/2nd_image.png";
}
</script>
<body onload="checkImageLoad();">
<img id="1st_image" src="http://domain.com/1st_image.png">
<img id="2nd_image" src="http://domain.com/loading_please_wait.gif">

Либо интернет-скорость медленная, либо быстро, браузер будет ждать, пока вся страница загрузится со всеми изображениями (даже если они связаны снаружи), а затем выполните функцию, поэтому второе изображение отображается только после загрузки 1-го изображения хорошо.

Расширенное примечание. Вы можете использовать URL-адрес веб-страницы в "src" изображения, чтобы сначала загрузить веб-страницу, а затем отобразить изображение. Целью является загрузка файла cookie с внешней веб-страницы, которая может повлиять на отображение второго изображения (например, captcha)