1
function loadAll() {
    var zip64;
    var zipURL = 'settings/Images.zip';
    var xhr = new XMLHttpRequest();
    xhr.open('GET', zipURL, true);
    xhr.responseType = 'arraybuffer';
    xhr.onload = function() {
        if (this.status == 200) {
            var responseArray = new Uint8Array(this.response);
            var d = responseArray.length;
            var binaryString = new Array(d);

            while (d--) {
                binaryString[d] = String.fromCharCode(responseArray[d]);
            }

            var data = binaryString.join("");
            zip64 = window.btoa(data);

            zip.createReader(new zip.Data64URIReader(zip64), function(reader) {
                reader.getEntries(function(entries) {
                    z = 0;
                    zloopid = setInterval(function() {
                        if (z >= entries.length || !entries[z]) {
                            clearInterval(zloopid);
                            reader.close();
                            start();
                            return;
                        }

                        if (entries[z].filename.split("/")[0] == "__MACOSX") {
                            z++;
                            return;
                        }

                        $("#loadimg").html("Loading " + entries[z].filename + ".... (" + (z + 1) + " of " + entries.length + ")");

                        var isMask = (entries[z].filename.replace(/^.*[\\\/]/, '') == "mask.jpg");

                        entries[z].getData(new zip.Data64URIWriter(), function(uri) {
                            if (isMask) {
                                imgtemp = new Image();
                                imgtemp.src = uri;
                            }
                            else {
                                var lol = new Image();
                                lol.src = uri;
                                imageLibrary.push(lol);
                            }
                        });

                        z++;
                    }, 0);
                });
            }, function(error) {
                window.location = "error.html?err=Error by unzipper: " + error + " (Problem in Images.zip)";
            });
        }
        else {
            window.location = "error.html?err=Error while retrieving zip file (" + zipURL + ") : " + this.status;
        }
    };
    xhr.send();
}

function start() {
    var image = imgtemp;
    width = image.width;
    height = image.height;

所以我有这段代码。我有一个名为的全局变量imgtemp,但每次我在块中设置它时,它都会在被调用if (inMask)时恢复为未定义。start()为什么是这样?

首先调用 loadAll(),然后调用 start()。我可以确认,当 loadAll() 中调用 start() 的代码执行时,imgtemp 已经变回未定义。

提前致谢!

4

1 回答 1

0

这是因为 loadAll 变为异步并在加载任何内容之前返回,因此当您调用 start 时,图像尚未设置。您需要“链接”它们而不是单独调用它们。

只调用 loadAll() 然后在 loadAll 中添加一个事件处理程序来加载图像,加载时调用 start() 函数。

/* snip */
entries[z].getData(new zip.Data64URIWriter(), function(uri) {
    if (isMask) {
        imgtemp = new Image();
        imgtemp.onload = function(event) {
            start(); /* <--- HERE  */
        }
        imgtemp.src = uri;
    }
    else {
/* snip */
于 2013-09-27T06:09:25.887 回答