Opera и Safari не запускают image.onload - PullRequest
0 голосов
/ 24 января 2012
function controllaFoto(target, username) {
    var _URL = window.URL || window.webkitURL;
    var img = new Image();
    img.onload = function () {
        if(this.width > 240 || this.height > 240) {
            document.getElementById("photoLabel").innerHTML = "Text";
            document.getElementById("preview").setAttribute("src", "profile?to=showImage&username="+username);
            target.value = "";
        } else {
            document.getElementById("photoLabel").innerHTML = "";
            document.getElementById("preview").setAttribute("src", this.src);
        }
    };
    img.src = _URL.createObjectURL(target.files[0]);
    return true;
}

Этот скрипт вызывается атрибутами onchange и onsubmit и отлично работает в FF и Chrome, но не в Opera и Safari.Событие onload не вызывается.Почему?

ОБНОВЛЕНИЕ Я тестирую его с Windows.

ОБНОВЛЕНИЕ 2 Проблема в том, что _URL равен undefined.Я пробовал с

var _URL = window.URL || window.webkitURL || window.mozURL || window.msURL || window.oURL;

, но все еще не работает.
Для Chrome его значение равно object DOMURL, для Firefox - object MozURLProperty, но для Safari и Opera - undefined.Итак, консоль говорит Uncaught exception: TypeError: Cannot convert '_URL' to object.

1 Ответ

1 голос
/ 24 января 2012

Согласно этой MDN-странице , похоже, что createObjectURL не поддерживается в Opera или в некоторых версиях Safari. Это само по себе может быть вашей главной проблемой. Вы смотрели в консоли ошибок, чтобы увидеть, если он жалуется на отсутствие метода createObjectURL. Если этот метод не существует, вы никогда не получите назначение для .src, поэтому никогда не будет успешного события загрузки.

Кроме того, я не могу сказать наверняка, но это также выглядит как потенциальная проблема для меня. Вам может понадобиться сохранить созданный объект Image где-нибудь, чтобы он сохранялся. Как ваш код написан выше, сборщик мусора может свободно избавиться от объекта img, потому что на него больше нет ссылок.

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

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

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

...