событие image.onload и кеш браузера


113

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

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

var img = new Image();
img.src = "img.jpg";
img.onload = function () {
   alert("image is loaded");
}

Ответы:


153

Поскольку вы создаете изображение динамически, установите onloadсвойство перед src.

var img = new Image();
img.onload = function () {
   alert("image is loaded");
}
img.src = "img.jpg";

Fiddle - протестирован на последних выпусках Firefox и Chrome.

Вы также можете использовать ответ в этом посте , который я адаптировал для одного динамически сгенерированного изображения:

var img = new Image();
// 'load' event
$(img).on('load', function() {
  alert("image is loaded");
});
img.src = "img.jpg";

Скрипка


Подождите. Почему ваш второй пример кода делает неправильные вещи и устанавливает .srcперед установкой .onload? У вас все было правильно в первом примере кода, а во втором - нет. Второй не будет работать должным образом в некоторых версиях IE.
jfriend00

1
@ jfriend00 Нет, ничего страшного. Резервный код (второй) как раз на случай, если первый каким-то образом перестанет работать. =]Он использует .completeпроверку на случай, если изображение уже было кэшировано, следовательно, код демонстрирует это. Конечно, для лучшей практики вы всегда можете установить srcпривязку после всех обработчиков.
Fabrício Matté

4
В этом случае просто нет причин полагаться .complete. Просто настройте обработчик нагрузки перед настройкой, .srcи это НИКОГДА не понадобится. Я написал слайд-шоу, которое используют тысячи сайтов во всех мыслимых браузерах, и первый метод работает каждый раз. Нет необходимости когда-либо проверять .completeсоздание нового изображения с нуля, как это.
jfriend00

Хорошо, спасибо за внимание, обновил ответ, чтобы отразить ваши рассуждения =]. Также @ jfriend00 не могли бы вы проверить, загружается ли изображение в IE? Интересно, проблема ли это в моей сети или в IE и образе.
Fabrício Matté

9
Также сегодня я обнаружил, что webkit необходимо img.src = ''перед назначением нового src, если он использовался раньше.
quux

10

Если src уже установлен, событие запускается в кешированном случае еще до того, как вы получите привязку обработчика события. Итак, вы также должны запускать событие на основе .complete.

пример кода:

$("img").one("load", function() {
   //do stuff
}).each(function() {
   if(this.complete || /*for IE 10-*/ $(this).height() > 0)
     $(this).load();
});

6

В таких ситуациях есть два возможных решения:

  1. Используйте решение, предложенное в этом посте
  2. Добавьте уникальный суффикс к изображению, srcчтобы браузер снова загрузил его, например:

    var img = new Image();
    img.src = "img.jpg?_="+(new Date().getTime());
    img.onload = function () {
        alert("image is loaded");
    }
    

В этом коде каждый раз, добавляя текущую временную метку в конец URL-адреса изображения, вы делаете его уникальным, и браузер снова загружает изображение.


44
Все это приводит к отказу от кеширования. Это НЕПРАВИЛЬНЫЙ способ решить эту проблему. Правильный путь - в ответе Фабрицио. Просто установите .onloadобработчик перед установкой .srcзначения, и вы не пропустите событие onload в некоторых версиях IE.
jfriend00

1
да вы правы, но кешировать не всегда желательно, иногда изображения кешировать не надо. конечно, в данной конкретной ситуации это зависит от потребностей
haynar

1
В моем приложении angular я пробовал все, что говорят другие ответы, но не помогло. Но принуждение не кешировать, как этот ответ, для меня сработало. Так что плюс один от меня.
Thanu

Единственное решение, которое сработало для меня в последней версии Chrome.
Молодой Боб

3

Сегодня я столкнулся с той же проблемой. Попробовав различные методы, я понимаю, что просто поместите код изменения размера внутрь $(window).load(function() {})вместо того, document.readyчтобы решить часть проблемы (если вы не используете jaxing страницу).


Это также хороший ответ для ситуации, когда в браузере есть кешированные изображения, нормально работает с загрузкой окон
Шокер,

именно та проблема, с которой я столкнулся. изменение, $(document).readyчтобы $(window).loadрешить мою проблему.
Тарикул Ислам,

0

Я обнаружил, что вы можете просто сделать это в Chrome:

  $('.onload-fadein').each(function (k, v) {
    v.onload = function () {
        $(this).animate({opacity: 1}, 2000);
    };
    v.src = v.src;
});

Установка самого .src вызовет событие onload.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.