使用jQuery预加载图片:总是调用错误处理程序

okxuctiv  于 2023-04-05  发布在  jQuery
关注(0)|答案(3)|浏览(128)

我正在建立一个画廊滑块脚本,并尝试预先加载的图像之前,他们追加到画廊。
我的设计应该做到以下几点:
1.加载图像并将它们附加到DOM中的不可见的preloadContainer中。
1.如果加载成功,则加载回调函数,该回调函数检查是否已预加载所有图像(“noOfPreloadedImages++;if(noOfPreloadedImages == noOfImagesToLoad)...”)。
1.如果由于图像资源不可用而导致加载失败,则调用错误回调函数。
下面是我的代码的一个复杂的“完整”版本:

$('<img />')
                .attr({'src': galleries[i].slides[j].imageUrl, 'id': 'galleryImg'+j})
                .on('load', checkPreloadComplete(i))
                .on('error', checkPreloadError(i, j))
                .attr({'src': galleries[i].slides[j].imageUrl, 'id': 'galleryImg'+j})
                .appendTo(preloadContainers[i])
                .wrap('<div id="slide'+j+'" class="slide" />');

现在,问题是,错误回调总是被调用。我试着玩函数链,没有成功。
所以,这里有一个小的测试代码,它也总是抛出错误,无论图像资源是否可用:

$(function() {

$(document).ready(function() {
    $("<img />")
    .attr({'src': 'http://www.google.de/images/srpr/logo11w.png'})
    .on('error', errorHandler())
    .appendTo('body');
});

function errorHandler() {
    console.log("Error loading image.");
};

});

下面是一个jsFiddle:http://jsfiddle.net/SvenS/FhYQ8/
我做错了什么?我的想法错在哪里?
[编辑]
好吧,这很奇怪。一些观察:
这总是会触发错误/成功:

$(function() {

$(document).ready(function() {      
    var test = $("<img />").appendTo('body');
    test.on('error', errorHandler());
    test.on('load', successHandler());
    test.attr({'src': 'http://www.google.de/images/srpr/logo11w.png'});
});

function errorHandler() {
    console.log("Error loading image!");
};

function successHandler() {
    console.log("Image loaded successfully!");
}

});

但奇怪的是,这是有效的:

$(function() {

    $(document).ready(function() {          
        var test = $("<img />").appendTo('body');
        test.on('error', function(e) { errorHandler(); });
        test.on('load', function(e) { successHandler(); });
        test.attr({'src': 'http://www.google.de/images/srpr/logo11w.png'});
    });

    function errorHandler() {
        console.log("Error loading image!");
    };

    function successHandler() {
        console.log("Image loaded successfully!");
    }

});

我真的不明白为什么,也许有更深层次的理解可以帮助我...?

b5buobof

b5buobof1#

这并不意味着不能这样做,但实际上我从未见过将错误处理程序附加到DOM对象。
在页面的onload事件中做一个$.ajax()怎么样?然后你可以把正确的回调附加到相应的事件中。

jhdbpxl9

jhdbpxl92#

设置事件处理时,您的代码总是在调用成功/错误处理程序时触发它们:

test.on('error', errorHandler());
test.on('load', successHandler());

您实际上是将函数调用的结果附加到处理程序,而不是函数本身。
你想要的是这个:

test.on('error', errorHandler);
test.on('load', successHandler);
3zwjbxry

3zwjbxry3#

我写了一个图像预加载器模块,它工作得很好。它使用普通的JavaScript,这意味着你可以在jQuery加载之前开始预加载你的图像。它还触发回调函数,如果你想的话,它会等待jQuery加载,然后再触发回调函数。看看它,如果你最终使用它,请告诉我:http://test.neilgirardi.com/
上面的URL包含了一个demo,它预加载了3.1MB的图片,并触发了一个jQuery.cycle()slideshow作为回调。

相关问题