Javascript 使用对象数组预加载图像

Javascript 使用对象数组预加载图像,javascript,jquery,Javascript,Jquery,我想要写预加载图像,我被困在检查已经存在的lodead图像上: var imgContainer = []; $(this).find('img').each(function() { imgContainer.push({ image: $(this) // other properties }) }); setInterval(function() { console.log(imgContainer[0].image.comple

我想要写预加载图像,我被困在检查已经存在的lodead图像上:

var imgContainer = [];

$(this).find('img').each(function() {
    imgContainer.push({
        image: $(this)
        // other properties
    })
});

setInterval(function() {
    console.log(imgContainer[0].image.complete);  // undefined
}, 2000);
但此解决方案有效(阵列中没有对象):


为什么它不起作用?

在代码中,您试图访问jQuery对象上的“complete”属性,但它没有这个属性。请尝试访问DOM元素本身的完整属性

我认为这一准则应该更有效:

var imgContainer = [];

$(this).find('img').each(function() {
    imgContainer.push({
        image: $(this)
        // other properties
    })
});

setInterval(function() {
    /* imgContainer = array with objects, [0] = get first element */
    /* image = jQuery collection, [0] = get dom element of the first item in the collection */
    console.log(imgContainer[0].image[0].complete);  
}, 2000);

在您的代码中,您试图访问jQuery对象上的“complete”属性,但它没有这个属性。请尝试访问DOM元素本身的完整属性

我认为这一准则应该更有效:

var imgContainer = [];

$(this).find('img').each(function() {
    imgContainer.push({
        image: $(this)
        // other properties
    })
});

setInterval(function() {
    /* imgContainer = array with objects, [0] = get first element */
    /* image = jQuery collection, [0] = get dom element of the first item in the collection */
    console.log(imgContainer[0].image[0].complete);  
}, 2000);

不要使用
setInterval
,检查是否加载了所有图像,只需将上述代码替换为以下代码:

(function(that){
    var remains = 0;        
    var loadHandler = function(){
       if(--remains == 0){
          console.log('All images are loaded !!!');
       }   
    };

    $(that).find('img').each(function() {
         if( !this.complete ){
             remains++;
             $(this).load(loadHandler);
         }
    });        
})(this);

不要使用
setInterval
,检查是否加载了所有图像,只需将上述代码替换为以下代码:

(function(that){
    var remains = 0;        
    var loadHandler = function(){
       if(--remains == 0){
          console.log('All images are loaded !!!');
       }   
    };

    $(that).find('img').each(function() {
         if( !this.complete ){
             remains++;
             $(this).load(loadHandler);
         }
    });        
})(this);

event
对于该参数名称来说,听起来是一个非常糟糕的选择。你知道你可以使用
这个
并减少函数参数吗?好吧,这两行是不相同的,是否有
图像
的完整属性?@ThiefMaster你是对的。我更改了它,但这仍然不能解决问题。虽然
事件
在语义上不正确,但它被正确地用作传递给函数的itterative函数中的第二个参数,jQuery集合上的每个参数都是相关迭代的相关元素。作为旁注,检查是否加载了setInterval可能不是一个好办法,但现在您知道自己做错了什么,请改为实现@Engineer的解决方案;)<代码>事件对于该参数名称来说,听起来是一个非常糟糕的选择。你知道你可以使用
这个
并减少函数参数吗?好吧,这两行是不相同的,是否有
图像
的完整属性?@ThiefMaster你是对的。我更改了它,但这仍然不能解决问题。虽然
事件
在语义上不正确,但它被正确地用作传递给函数的itterative函数中的第二个参数,jQuery集合上的每个参数都是相关迭代的相关元素。作为旁注,检查是否加载了setInterval可能不是一个好办法,但现在您知道自己做错了什么,请改为实现@Engineer的解决方案;)