javascript - 动态加载图像,错误时中断循环

标签 javascript jquery

我之前问过这个问题,但没有得到适用于我的项目的答案。我正在尝试将图像动态加载到表中,而无需使用服务器端代码。它有效,但我希望能够有一个无限循环,当图片加载失败时中断,而不是硬编码我需要的行数。这样我就永远不必更新代码,如果我想扩展表格,我只需将图片添加到文件夹即可。

现在“onerror”属性隐藏了失败的图像,但我也想跳出外层循环(loop1)。

function headCatalogLoader() {
var table = document.getElementById("catalog");
var meshNum = 0;
var uniqueID = 0;

loop1:
for (var i = 0; i <= 50; i++) {  // i made it 50 instead of infinite for now
    var row = table.insertRow(i);

    loop2:
    for (var k = 0; k <= 2; k++) {      // 2 is because 3 columns
        var skinTone = "none";
        var cell = row.insertCell(k);

        if (k == 0) {
            skinTone = "lgt";
        }
        else if (k == 1) {
            skinTone = "med";
        }
        else if (k == 2) {
            skinTone = "drk";
        }

        cell.innerHTML = "<img src=\"headimgs/head" + skinTone + meshNum + ".png\" id=\"head" + uniqueID + skinTone + "\" onclick=\"previewIt(this)\" onerror=\"$(this).hide();\" />";

        uniqueID++;
    }
    meshNum++;
}
var tbody = $("table tbody");
tbody.html($("tr",tbody).get().reverse());
}

从属性内部中断超出了循环的范围并且不起作用。也用

$('img').on("error", function () {
    break loop1;
});

loop2 内部不做任何事情。有人建议我使用递归方法并重写我的函数,但这对我不起作用,因为我正在动态创建一个表并使用与循环对应的图像名称。任何帮助或建议都会很棒!

最佳答案

我想您可以使用 XMLHttpRequest 来检查该 URL 的响应,然后再尝试将它放到页面上。如果状态不是 404,则插入图像 else break loop1。这样的事情可能会起作用:

function headCatalogLoader() {
    var table = document.getElementById("catalog");
    var meshNum = 0;
    var uniqueID = 0;

    loop1:
        for (var i = 0; i <= 50; i++) { // i made it 50 instead of infinite for now
            var row = table.insertRow(i);

            loop2:
                for (var k = 0; k <= 2; k++) { // 2 is because 3 columns
                    var skinTone = "none";
                    var cell = row.insertCell(k);

                    if (k == 0) {
                        skinTone = "lgt";
                    } else if (k == 1) {
                        skinTone = "med";
                    } else if (k == 2) {
                        skinTone = "drk";
                    }

                    // note: you'll need to use an absolute path for imageUrl
                    var imageUrl = "http://example.co.uk/example/headimgs/head" + skinTone + meshNum + ".png";
                    var xhttp = new XMLHttpRequest();
                    xhttp.open('HEAD', imageUrl, false);
                    xhttp.send();

                    if (xhttp.status !== 404) {
                        cell.innerHTML = "<img src=" + imageUrl + " id=\"head" + uniqueID + skinTone + "\" onclick=\"previewIt(this)\" onerror=\"$(this).hide();\" />";
                        uniqueID++;
                    } else {
                        break loop1;
                    }
                }
            meshNum++;
        }
    var tbody = $("table tbody");
    tbody.html($("tr", tbody).get().reverse());
}

注意:您需要为 XMLHttpRequest 使用绝对路径。我刚刚使用了 example.co.uk/example 因为我不知道你的 URL。

我猜你只是希望它在找不到图像时出错,因为这表明你已经到达文件夹中的最后一张图像,这就是我检查 !== 404 的原因,如果你想在任何错误的情况下中断(例如500 internal server error),最好更改if (xhttp.status !== 404 )if (xhttp.status === 200)

关于javascript - 动态加载图像,错误时中断循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52338257/

相关文章:

javascript - d3js 强制定向,鼠标悬停在线链接无法正常工作

javascript - 文本的悬停颜色更改

javascript - 当您克隆 Backbone.Collection 时,模型引用是否完好无损?

javascript - Firefox addon sdk 浏览器控制台便利性问题

javascript - jQuery jEditables - 使用 optgroup 选择

javascript - JQuery 替换不适用于 JW Player

javascript - 为什么我不能使用 browserify 在循环中 require(...)?

jQuery - 这里有什么错误?

javascript - 改变点击

javascript - 找出打印何时完成 Jquery