Opera和Safari不会激活image.onload

时间:2012-01-23 21:17:54

标签: javascript image javascript-events safari opera

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;
}

此脚本由onchangeonsubmit属性调用,在FF和Chrome中正常工作,但在Opera和Safari中则无效。事件onload未触发。为什么呢?

更新我正在使用Windows进行测试。

更新2 问题是_URLundefined。我试过

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 个答案:

答案 0 :(得分:1)

根据this MDN page,在Opera或某些版本的Safari中看起来不支持createObjectURL。仅这一点可能是你的主要问题。您是否查看了错误控制台,看看它是否抱怨缺少createObjectURL方法。如果该方法不存在,则永远不会获得.src的赋值,因此永远不会有成功的加载事件。

此外,我不能肯定地说,但这对我来说也是一个潜在的问题。您可能需要将新创建的Image对象存储在某处,以便它保持不变。上面编写代码的方式,垃圾收集器可以自由处理img对象,因为不再有任何对它的引用。

也许你没有向我们展示你的所有代码,但是当你编写代码时,加载一个你永远不会使用的图像是什么意思?

所以,我建议你改变代码的工作方式,不要使用你不会使用的图像。或者,实际将新创建的img标记存储在某处,以便它持续存在并且不会收集垃圾。

我也问你怎么知道图片加载成功了?如果您没有使用该图像,您如何知道它已成功加载。