Какие обходные пути существуют для свойства `complete` в FireFox?

Я пытаюсь использовать jQuery, чтобы определить, правильно ли загружено изображение.

Следующее работает просто отлично (и возвращает true или false как состояние изображения), но, похоже, работает только в IE, в FireFox он всегда возвращает true - даже если состояние на самом деле неполное:

    var image = $("img#myImage");
    alert(image[0].complete);

Что такое эквивалент Firefox для image.complete в JavaScript или jQuery?

Ответы

Ответ 1

Вы также можете попробовать проверить один из размеров элемента img в дополнение к complete:

function isImageLoaded() {
    var theImage = $('#myImage'); 

    if (!theImage.get(0).complete) {
        return false;
    }
    else if (theImage.height() === 0) {
        return false;
    }

    return true;
}

Разгруженный img или img с недопустимым атрибутом src должен иметь .height() и .width() равный 0 в Firefox. В Chrome и Opera ни один из методов не работает должным образом. В этих браузерах theImage.height() всегда возвращал положительное значение в моем тестировании.

Ответ 2

JQuery делает это очень простым.

Вы можете просто использовать функцию .load() для привязки события к времени, когда изображение полностью загружено.

    $("img").load(function() {
        // Yeay, it was loaded, and works in all browsers!
    });

Ответ 3

Вы можете использовать load(), но будьте осторожны с Internet Explorer: он не будет запускать событие, если изображение кэшируется

if($img[0].readyState === 4){ // image is cached in IE
    alert("Image loaded!");
}else{
    $img.load(function(){ // for other browsers and IE, if not cached
        alert("Image loaded!");
    });
}

Ответ 4

Да, я просто работал на странице AJAX с динамически загружаемыми изображениями. Я также хотел определить, были ли загружены изображения, чтобы я мог их переместить с эффектом jQuery.

img = $('myImageID')
img[0].src = 'http://new.url.for.image/';
alert(img[0].complete);                    // seems to always return true
                                           // in Firefox, perhaps because
                                           // the original src had been loaded

Поэтому вместо этого я должен был сделать это...

img = $('myImageID')
newImg = $('<img>')                // create a completely new IMG element
          .attr('src', 'http://new.url.for.image/')
          .attr('id', img[0].id);
img.replaceWith(newImg);
img = newImg;
alert(img[0].complete);

(Примечание: я не тестировал этот точный код, это упрощенная версия того, что я пытался сделать, но, надеюсь, общается с этой идеей.)

Саймон.

Ответ 5

myimage=new Image();
myimage.src="whatever";
if(myimage.height>0 && myimage.complete){alert("my image has loaded");}

// might be overly simple but works for me in all browsers i think.

Ответ 6

Я не знаю, имеет ли firefox другой prop, метод, который делает это, но вы можете использовать это обходное решение:

$(документ).ready(функция() {

$("img").each(
//for each image declared in html
function(index)
{
    document.images[index].complete= false;
    document.images[index].onload = function(){ this.complete= true};
});

});

Ответ 7

В моем случае я использую метод

document.images['XXX'].addEventListener('load', dealJob(), false);

и в функции dealJob я использую document.images ['XXX']. complete для проверки изображения, но он всегда возвращает true.

Когда я перехожу к использованию метода

document.images['XXX'].onload = function() {dealJob();}

а в функции dealJob результат document.images ['XXX'] завершен правильно.

Может быть, это может вам помочь.