【问题标题】:jquery image load check errorjquery图像加载检查错误
【发布时间】:2026-01-04 20:05:02
【问题描述】:

我正在尝试使用以下代码检查是否所有图像都加载到容器中

$(document).ready(function () {
    $(".slide img").each(function (index) {
        var fakeSrc = $(this).attr('src');
        $("<img/>").attr("src", fakeSrc).css('display', 'none').load(function () {
            alert('loaded');
        }).
        error(function () {
            load_img_Single(fakeSrc);
        });
    });
    function load_img_Single(img) {
        alert(img);
        var ruth;
        $("<img/>").attr("src", img).css('display', 'none').load(function () {
            ruth = 'yeap';
        }).error(function () {
            ruth = 'nope';
        });
        alert(ruth);
    }
});

现在你可以看到我使用假容器加载图像并检查它是否已加载。

我在第一次检查图像时使用 .error 来查看它是否正确加载,如果没有,它会执行我的函数 load_img_Single(image) 再次加载它。

现在再次在该函数中检查它是否已加载。但问题是变量“ruth”没有被设置为该函数中的任何内容。它已在外部声明,但仍以“未定义”的形式出现。

任何见解都将不胜感激。

【问题讨论】:

  • 加载图片是异步的,它不会阻塞浏览器,所以代码会继续执行,一旦加载图片就会调用回调,当你检查你的变量时,回调还没有执行.

标签: javascript jquery image


【解决方案1】:

原因是加载图像是异步的。当你打电话时:

$("<img/>").attr("src", img).css('display', 'none').load(function() {
        ruth = 'yeap';
    }).error(function() { ruth = 'nope'; });

loaderror 尚未触发。这就是为什么 ruth 在之后调用 alert(ruth); 时未定义的原因

【讨论】:

  • @user1690718:因为浏览器是单线程的。不建议在浏览器中进行同步操作,因为它会阻塞。你应该把你的代码放在回调中
  • @user1690718 .load(callback),实际上 .on('load',callback) 是一个事件,事件不能是 'sync',这是没有意义的,因为事件被触发以响应发生的事情.在这里一旦图像被加载。您可以手动触发事件(处理程序),但这不是您要在这里寻找的
  • @user1690718:变通办法总是不好,不推荐。异步是浏览器的本质,我们不应该违背它。如果您仍然需要解决方法,可以查看一些讨论,例如预加载图像*.com/questions/9421202/…*.com/questions/1149829/…