Opera和Safari不会触发image.onload

问题描述 投票:0回答:1
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属性调用,在Firefox和Chrome浏览器中工作正常,但在Opera和Safari中无法正常工作。未触发事件onload。为什么?

UPDATE我正在Windows上对其进行测试。

UPDATE 2问题在于_URLundefined。我尝试过

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

但仍然无法正常工作。

对于Chrome,其值为object DOMURL,对于Firefox,其值为object MozURLProperty,但对于Safari和Opera,其值为undefined。所以控制台说:

未捕获的异常:TypeError:无法将'_URL'转换为对象

javascript image safari dom-events opera
1个回答
1
投票

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

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

也许您没有向我们展示所有代码,但正如您编写的那样,加载您永远不会使用的图像有什么意义?

因此,我建议您更改代码的工作方式,以不使用将不使用的图像。或者,将新创建的img标签实际存储在某个位置,以便它持久存在并且不会收集垃圾。

我还要问您如何知道图像加载成功?如果您不使用图像,怎么知道它已成功加载。

© www.soinside.com 2019 - 2024. All rights reserved.