событие 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.