Загрузите все изображения из папки на веб-сайте перед ее открытием [дублировать]

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

664
задан 5 May 2014 в 19:04
поделиться

21 ответ

Quick и easy:

function preload(arrayOfImages) {
    $(arrayOfImages).each(function(){
        $('<img/>')[0].src = this;
        // Alternatively you could use:
        // (new Image()).src = this;
    });
}

// Usage:

preload([
    'img/imageName.jpg',
    'img/anotherOne.jpg',
    'img/blahblahblah.jpg'
]);

Или, если вам нужен плагин jQuery:

$.fn.preload = function() {
    this.each(function(){
        $('<img/>')[0].src = this;
    });
}

// Usage:

$(['img1.jpg','img2.jpg','img3.jpg']).preload();
947
ответ дан James 18 August 2018 в 04:44
поделиться
  • 1
    Не нужно ли вставлять элемент изображения в DOM, чтобы обеспечить его кэширование браузером? – JoshNaro 17 August 2010 в 16:33
  • 2
    Я считаю, что $('<img />') просто создает элемент изображения в памяти (см. link ). Похоже, что '$('<img src="' + this + '" />') фактически создаст элемент внутри скрытого DIV, потому что он более «сложный». Однако я не думаю, что это необходимо для большинства браузеров. – JoshNaro 11 February 2011 в 16:30
  • 3
    Это странный способ написания плагина jQuery. Почему бы не $.preload(['img1.jpg', 'img2.jpg'])? – alex 17 January 2012 в 04:56
  • 4
    Убедитесь, что вы вызываете это внутри $(window).load(function(){/*preload here*/});, потому что таким образом сначала загружаются все изображения в документе, скорее всего, они нужны в первую очередь. – Jasper Kennis 5 May 2012 в 16:35
  • 5
    @RegionalC - Может быть немного безопаснее установить событие load перед установкой src на случай, если изображение закончит загрузку до того, как будет установлено событие загрузки? $('<img/>').load(function() { /* it's loaded! */ }).attr('src', this); – sparebytes 5 February 2013 в 00:01
    jQuery.preloadImage=function(src,onSuccess,onError)
    {
        var img = new Image()
        img.src=src;
        var error=false;
        img.onerror=function(){
            error=true;
            if(onError)onError.call(img);
        }
        if(error==false)    
        setTimeout(function(){
            if(img.height>0&&img.width>0){ 
                if(onSuccess)onSuccess.call(img);
                return img;
            }   else {
                setTimeout(arguments.callee,5);
            }   
        },0);
        return img; 
    }

    jQuery.preloadImages=function(arrayOfImages){
        jQuery.each(arrayOfImages,function(){
            jQuery.preloadImage(this);
        })
    }
 // example   
    jQuery.preloadImage(
        'img/someimage.jpg',
        function(){
            /*complete
            this.width!=0 == true
            */
        },
        function(){
            /*error*/
        }
    )
19
ответ дан alex 18 August 2018 в 04:44
поделиться
  • 1
    Создает ли этот плагин изображения, которые еще не появились на загружаемой странице, или только прикреплять события к изображениям, которые уже будут загружены? – Dave Cameron 29 May 2012 в 20:11
  • 2
    @DaveCameron Это не значит, что изображения видны или нет. Вы можете легко разветвить его и внести изменения - просто добавьте :visible в пользовательский селектор. – alex 30 May 2012 в 00:44
  • 3
    Добро пожаловать в переполнение стека! Вместо того, чтобы публиковать блок кода, пожалуйста, объясните , почему этот код решает поставленную проблему. Без объяснений это не ответ. – Martijn Pieters♦ 19 November 2012 в 16:41
  • 4
    Этот плагин выглядит очень интересным. Однако в документации jquery подчеркивается, что событие load, когда оно применяется к изображениям: «не работает последовательно и не надежно, кросс-браузер». Как плагин смог обойти это? – EleventyOne 28 October 2013 в 03:11
  • 5
    @EleventyOne Проверьте источник в отношении настраиваемого селектора. – alex 28 October 2013 в 04:18
  • 6
    @alex Как этот плагин загружает изображения, которые установлены в css on: наведение элемента? Это не работает для меня – Philipp Hofmann 27 March 2014 в 11:14

этот плагин jquery imageLoader равен 1,39kb

:

$({}).imageLoader({
    images: [src1,src2,src3...],
    allcomplete:function(e,ui){
        //images are ready here
        //your code - site.fadeIn() or something like that
    }
});

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

13
ответ дан alzclarke 18 August 2018 в 04:44
поделиться
  • 1
    плохое использование $ (document). уже внутри обратного вызова: | – Aamir Afridi 4 February 2013 в 16:55
  • 2
    @AamirAfridi Почему? – Ian 5 March 2013 в 21:31
  • 3
    @Ий, потому что документ уже готов к моменту завершения обратного вызова. $ (document) .ready используется для обеспечения загрузки DOM. Когда дело доходит до обратного вызова, это означает, что загружаются все изображения, что означает, что загружается Yoru DOM, поэтому нет необходимости в документе. Внутри внутри обратного вызова. – Aamir Afridi 6 March 2013 в 17:09
  • 4
    @AamirAfridi Нет гарантии, что документ готов в обратном вызове ... откуда вы это понимаете? На странице плагина ничего не сказано о том, что обратный вызов allcomplete выполняется после готовности DOM. Есть очень хороший шанс, что изображения закончат загрузку после того, как DOM готов, но нет оснований предполагать. Я не знаю, почему вы считаете, что обратные вызовы волшебны и выполняются после того, как DOM готов ... можете ли вы объяснить, откуда вы это взяли? Просто потому, что изображения загружены, не означает, что DOM готов – Ian 6 March 2013 в 17:47
  • 5
    @AamirAfridi Это не имеет смысла для этой ситуации. Плагин является загрузчиком pre . Вы хотите выполнить его как можно скорее. И есть много вещей, которые не зависят от DOM, который вы хотите запустить как можно скорее, и , затем , когда DOM готов, что-то предпримите. – Ian 6 March 2013 в 22:27

Я бы использовал файл манифеста, чтобы рассказывать (современные) веб-браузеры, чтобы также загружать все соответствующие изображения и кэшировать их. Используйте Grunt и grunt-manifest, чтобы сделать это автоматически и больше не беспокоиться о сценариях предварительной загрузки, кеш-недействительных, CDN и т. Д.

https://github.com/gunta/grunt-manifest

1
ответ дан Christian Landgren 18 August 2018 в 04:44
поделиться

Я хотел сделать это с помощью пользовательского наложения API Карт Google. Их примерный код просто использует JS для вставки IMG-элементов, а поле-заполнитель изображения отображается до загрузки изображения. Я нашел здесь ответ, который работал для меня: https://stackoverflow.com/a/10863680/2095698 .

$('<img src="'+ imgPaht +'">').load(function() {
$(this).width(some).height(some).appendTo('#some_target');
});

Это предварительно загружает изображение, как было предложено ранее, и затем использует обработчик для добавления объекта img после загрузки URL-адреса img. Документация jQuery предупреждает, что кешированные изображения не очень хорошо работают с этим кодом eventing / handler, но он работает для меня в FireFox и Chrome, и мне не нужно беспокоиться об IE.

0
ответ дан Community 18 August 2018 в 04:44
поделиться
  • 1
    Это не сработает с кэшированными изображениями, как вы узнали. обходной путь - сначала связать событие загрузки, а затем установить атрибут src. – Kevin B 27 March 2013 в 16:24

Я использую следующий код:

$("#myImage").attr("src","img/spinner.gif");

var img = new Image();
$(img).load(function() {
    $("#myImage").attr("src",img.src);
});
img.src = "http://example.com/imageToPreload.jpg";
3
ответ дан Cristan 18 August 2018 в 04:44
поделиться
  • 1
    Сначала привяжите к событию загрузки, затем установите src. – Kevin B 27 March 2013 в 16:25

JP. После проверки вашего решения у меня все еще возникали проблемы в Firefox, где он не предварительно загружал изображения, прежде чем перемещаться вместе с загрузкой страницы. Я обнаружил это, поставив некоторые sleep(5) в сценарии на стороне сервера. Я реализовал следующее решение, основанное на вашем, которое, кажется, решает это.

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

// Helper function, used below.
// Usage: ['img1.jpg','img2.jpg'].remove('img1.jpg');
Array.prototype.remove = function(element) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == element) { this.splice(i,1); }
  }
};

// Usage: $(['img1.jpg','img2.jpg']).preloadImages(function(){ ... });
// Callback function gets called after all images are preloaded
$.fn.preloadImages = function(callback) {
  checklist = this.toArray();
  this.each(function() {
    $('<img>').attr({ src: this }).load(function() {
      checklist.remove($(this).attr('src'));
      if (checklist.length == 0) { callback(); }
    });
  });
};

Из моего интереса, в моем контексте, я использую это следующим образом:

$.post('/submit_stuff', { id: 123 }, function(response) {
  $([response.imgsrc1, response.imgsrc2]).preloadImages(function(){
    // Update page with response data
  });
});

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

34
ответ дан Dave 18 August 2018 в 04:44
поделиться
  • 1
    Для тех, кто не заинтересован в запуске Array.prototype, вместо этого вы можете сделать: checklist = this.length И в функции onload: checklist-- Затем: if (checklist == 0) callback(); – MiniGod 15 July 2012 в 01:35
  • 2
    Все было бы хорошо, но добавление новых или удаление существующих методов для объекта, который у вас нет, является одной из худших практик в JavaScript. – Rihards 10 September 2012 в 08:17
  • 3
    Приятно и быстро, но этот код никогда не будет запускать обратный вызов, если одно из изображений сломано или не может загрузить. – SammyK 30 October 2012 в 08:38
  • 4
    .attr({ src: this }).load(function() {...}) должен быть .load(function() {...}).attr({ src: this }), иначе у вас будут проблемы с кешированием. – Kevin B 27 March 2013 в 16:31

Вот отредактированная версия первого ответа, который фактически загружает изображения в DOM и скрывает его по умолчанию.

function preload(arrayOfImages) {
    $(arrayOfImages).each(function () {
        $('<img />').attr('src',this).appendTo('body').css('display','none');
    });
}
96
ответ дан Dennis Rongo 18 August 2018 в 04:44
поделиться
  • 1
    hide() является более кратким, чем css('display', 'none'). – alex 22 September 2011 в 03:32
  • 2
    Это отлично работает, когда я пытаюсь использовать Firefox, но не с IE9. – Shadowxvii 29 August 2012 в 15:12
  • 3
    В чем преимущество вставки их в DOM? – alex 7 May 2013 в 22:56
  • 4
    По моему опыту, предварительная загрузка изображения в DOM делает браузер осведомленным о его существовании и для его правильного кэширования. В противном случае изображение существует только в памяти, которая работает только для одностраничных приложений. – Dennis Rongo 4 July 2013 в 19:00
  • 5
    @alex При добавлении к body он будет работать и на мобильных устройствах. – Pono 4 September 2013 в 14:31

Спасибо за это! Я хотел бы добавить немного риффа на ответ JP - я не знаю, поможет ли это кому-либо, но таким образом вам не нужно создавать массив изображений, и вы можете предварительно загружать все ваши большие изображения если вы правильно назовете свои пальцы. Это удобно, потому что у меня есть кто-то, кто пишет все страницы в html, и это обеспечивает меньший шаг для них - устранение необходимости создания массива изображений и еще один шаг, на котором все может быть запутано.

$("img").each(function(){
    var imgsrc = $(this).attr('src');
    if(imgsrc.match('_th.jpg') || imgsrc.match('_home.jpg')){
      imgsrc = thumbToLarge(imgsrc);
      (new Image()).src = imgsrc;   
    }
});

В принципе, для каждого изображения на странице он захватывает src каждого изображения, если он соответствует определенным критериям (это большой палец или изображение домашней страницы), он меняет имя (базовая строка заменяется на изображение src ), затем загружает изображения.

В моем случае страница была заполнена изображениями большого пальца, все названными как image_th.jpg, и все соответствующие большие изображения называются image_lg.jpg. Большой палец на большой просто заменяет _th.jpg на _lg.jpg, а затем предварительно загружает все большие изображения.

Надеюсь, это поможет кому-то.

7
ответ дан dgig 18 August 2018 в 04:44
поделиться

Использовать JavaScript Объект изображения .

Эта функция позволяет вам вызвать обратный вызов при загрузке всех изображений. Однако обратите внимание, что он никогда не вызовет обратный вызов, если хотя бы один ресурс не загружен. Это можно легко устранить, реализовав onerror обратный вызов и увеличивая значение loaded или обрабатывая ошибку.

var preloadPictures = function(pictureUrls, callback) {
    var i,
        j,
        loaded = 0;

    for (i = 0, j = pictureUrls.length; i < j; i++) {
        (function (img, src) {
            img.onload = function () {                               
                if (++loaded == pictureUrls.length && callback) {
                    callback();
                }
            };

            // Use the following callback methods to debug
            // in case of an unexpected behavior.
            img.onerror = function () {};
            img.onabort = function () {};

            img.src = src;
        } (new Image(), pictureUrls[i]));
    }
};

preloadPictures(['http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar'], function(){
    console.log('a');
});

preloadPictures(['http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar', 'http://foo/picture.bar'], function(){
    console.log('b');
});
50
ответ дан Gajus 18 August 2018 в 04:44
поделиться
  • 1
    Правильно, используйте объект JavaScript Image. Вы наблюдали за людьми, делающими wrong в этих ответах? – alex 7 May 2013 в 22:58
  • 2
    Блестящий код. Правильно ли я полагаю, что это сгорит событие onload, даже если изображение будет кэшировано? (Потому что img.onload объявлен первым). Это показали мои тесты. – Startec 23 May 2014 в 11:06
  • 3
    @alex потенциально, да. Если целью является предварительная загрузка (что говорит о порядке выполнения), я бы предпочел увидеть исходный параметр JS вместо зависимых от jQuery опций. – Charlie Schliesser 16 July 2014 в 00:57
  • 4
    Мне понравилось это решение, но я просто обнаружил, что он не работает в моем Firefox. Это только я или другие, имеющие одну и ту же проблему? – Gazillion 20 August 2014 в 20:37
  • 5
    @Gazillion дать более подробную информацию. Как вы определяете «не работает» ?? Что такое версия FF? – Gajus 20 August 2014 в 21:30

5 строк в coffeescript

array = ['/img/movie1.png','/img/movie2.png','/img/movie3.png']

$(document).ready ->
  for index, image of array
    img[index] = new Image()
    img[index].src = image
-1
ответ дан Guy Morita 18 August 2018 в 04:44
поделиться
  • 1
    Можете ли вы рассказать о том, как решение работает для решения вопроса в OP? И, возможно, прокомментируйте свой код, чтобы другие могли его легче понять? – Ro Yo Mi 10 August 2013 в 01:25

Быстрый, без плагинов способ предварительной загрузки изображений в jQuery и получения функции обратного вызова - создать сразу несколько тегов img и посчитать ответы, например

function preload(files, cb) {
    var len = files.length;
    $(files.map(function(f) {
        return '<img src="'+f+'" />';
    }).join('')).load(function () {
        if(--len===0) {
            cb();
        }
    });
}

preload(["one.jpg", "two.png", "three.png"], function() {
    /* Code here is called once all files are loaded. */
});
​    ​

Обратите внимание, что если вы хотите поддерживать IE7, вам нужно будет использовать эту чуть менее симпатичную версию (которая также работает в других браузерах):

function preload(files, cb) {
    var len = files.length;
    $($.map(files, function(f) {
        return '<img src="'+f+'" />';
    }).join('')).load(function () {
        if(--len===0) {
            cb();
        }
    });
}
9
ответ дан izb 18 August 2018 в 04:44
поделиться

Все хипстеры писали там собственную версию, так что вот моя. Он добавляет скрытый div в тело и заполняет его необходимыми изображениями. Я написал это в Coffee Script. Вот кофе, нормальный js и сжатый js.

Кофе:

$.fn.preload = () ->
    domHolder = $( '<div/>' ).hide()
    $( 'body' ).append domHolder
    this.each ( i, e) =>
        domHolder.append( $('<img/>').attr('src', e) )

Обычный:

(function() {

  $.fn.preload = function() {
    var domHolder,
      _this = this;
    domHolder = $('<div></div>').css('display', 'none');
    $('body').append(domHolder);
    return this.each(function(i, e) {
      return domHolder.append($('<img/>').attr('src', e));
    });
  };

}).call(this);

Сжатый:

function(){$.fn.preload=function(){var a,b=this;return a=$("<div></div>").css("display","none"),$("body").append(a),this.each(function(b,c){return a.append($("<img/>").attr("src",c))})}}.call(this);
-7
ответ дан Jasper Kennis 18 August 2018 в 04:44
поделиться
  • 1
    используйте '<div/>' и .hide() вместо .css('display', 'none') – jedmao 4 July 2013 в 00:40
  • 2
    Так много кода для такой простой задачи – Heihachi 30 January 2014 в 14:47
function preload(imgs) {
$(imgs).each(function(index, value){
        $('<img />').attr('src',value).appendTo('body').css('display','none');
    });
}

.attr('src',value)

not

.attr('src',this)

просто указать:)

-1
ответ дан Oybek 18 August 2018 в 04:44
поделиться
  • 1
    Масштаб this внутри обратного вызова, который передается на $.each, присваивается значению, которое выполняется итерацией. – Oybek 28 July 2013 в 09:13
  • 2
    ? $ (['img1.jpg', 'img2.jpg', 'img3.jpg']) каждый (функция (индекс, значение) {console.log (значение); // img1.jpg console.log (this) ; // String {0 = "i", 1 = "m", 2 = "g", more ...} $ ('& lt; img />').attr('src', это ) .appendTo ('body'). css ('display', 'none');}); – Whisher 29 July 2013 в 13:32
  • 3
    Гектометр Наверное, ты здесь. Например, $("div").each(function(i, el){ console.log(el == this);}); генерирует все true s; Кажется, что итерация по массиву ведет себя по-другому. – Oybek 30 July 2013 в 19:59

Для тех, кто знает немного ActionScript, вы можете проверить флеш-плеер с минимальными усилиями и сделать предварительный загрузчик флэш-памяти, который вы также можете экспортировать в html5 / Javascript / Jquery. Чтобы использовать, если флеш-плеер не обнаружен, проверьте примеры того, как это сделать с ролью youtube обратно в html5-плеер :) И создайте свой собственный. У меня нет деталей, потому что я еще не начал, если я не забуду, я позже его опубликую, и попробую запустить какой-нибудь стандартный код JQuery.

-3
ответ дан Peter Gruppelaar 18 August 2018 в 04:44
поделиться
  • 1
    Это не решение. Браузер по умолчанию не поддерживает Flash-плеер. Этого легко достичь с помощью JavaScript, который является родным языком браузера. – Usman Ahmed 5 May 2017 в 17:56
  • 2
    Кто говорит о Flash? .. где у вас были парни ... – Peter Gruppelaar 6 May 2017 в 19:06
  • 3
    Я помню флеш-ненавистников с 2012 года ... это было не нормально ... везде, куда я пошел, меня атаковали, когда я даже использовал слово Flash. – Peter Gruppelaar 6 May 2017 в 19:08

Этот однострочный код jQuery создает (и загружает) элемент DOM img, не показывая его:

$('<img src="img/1.jpg"/>');
24
ответ дан rkcell 18 August 2018 в 04:44
поделиться
  • 1
    @huzzah. Возможно, вам лучше использовать спрайты. Меньше запросов HTTP. :) – Alex Kinnee 16 November 2012 в 18:28

вы можете загружать изображения в свой html где-нибудь с помощью правила css display:none;, а затем показывать их, когда хотите с js или jquery

, не использовать js или jquery-функции для предварительной загрузки - это просто правило css Vs много строк js для выполнения

пример: Html

<img src="someimg.png" class="hide" alt=""/>

Css:

.hide{
display:none;
}

jQuery:

//if want to show img 
$('.hide').show();
//if want to hide
$('.hide').hide();

Предварительная загрузка изображений с помощью jquery / javascript не является хорошим образом для изображений, на которые требуется загрузить миллисекунды на странице +, у вас есть миллисекунды для того, чтобы скрипт был разобран и выполнен, особенно тогда, если они являются большими изображениями, поэтому прятать их в hml лучше и для производительность, потому что изображение действительно предварительно загружено без видимой видимости, пока вы не покажете это!

13
ответ дан sbaaaang 18 August 2018 в 04:44
поделиться
  • 1
    Более подробную информацию об этом подходе можно найти здесь: perishablepress.com/… – gdelfino 30 April 2012 в 01:00
  • 2
    Но вам нужно знать, что этот метод имеет большой недостаток: ваша страница не будет полностью загружена до загрузки всех изображений. В зависимости от количества изображений для предварительной загрузки и их размера это может занять некоторое время. Хуже того, если & lt; img & gt; тег не определяет высоту и ширину, которые некоторые браузеры могут подождать, пока изображение не будет извлечено до отображения остальной части страницы. – user 1 February 2013 в 11:18
  • 3
    @Alex вам все равно нужно загрузить img, вы можете выбрать, загружать ли их html и избегать любых мигающих и полунагруженных изображений, или если вы хотите получить больше скорости для нестабильного решения – sbaaaang 1 February 2013 в 11:46
  • 4
    также я действительно думаю, что создание html-тегов с javascript не читается вообще всего за 2 цента – sbaaaang 1 February 2013 в 11:47
  • 5
    Мне нужно очень быстрое решение для очень сложного проекта, и все. – Germstorm 27 May 2013 в 09:14
$.fn.preload = function (callback) {
  var length = this.length;
  var iterator = 0;

  return this.each(function () {
    var self = this;
    var tmp = new Image();

    if (callback) tmp.onload = function () {
      callback.call(self, 100 * ++iterator / length, iterator === length);
    };

    tmp.src = this.src;
  });
};

Использование довольно просто:

$('img').preload(function(perc, done) {
  console.log(this, perc, done);
});

http://jsfiddle.net/yckart/ACbTK/

21
ответ дан yckart 18 August 2018 в 04:44
поделиться
  • 1
    @Manticore исправил это ... – yckart 10 October 2013 в 00:09
  • 2
    Это действительно хороший ответ, это действительно должен быть главный проголосовавший ответ imho. – sleepycal 24 January 2014 в 18:08
  • 3
    Некоторые объясняющие слова были бы хороши. – robsch 2 January 2017 в 09:12

Это работает для меня даже в IE9:

$('<img src="' + imgURL + '"/>').on('load', function(){ doOnLoadStuff(); });
0
ответ дан Zymotik 18 August 2018 в 04:44
поделиться
  • 1
    В результате из-за кэширования это приведет к сбою, всегда привязывает событие загрузки до установки атрибута src. – Kevin B 27 March 2013 в 16:27
19
ответ дан alex 6 September 2018 в 19:06
поделиться
19
ответ дан alex 30 October 2018 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: