1

我创建了一个调用图像 url 数组的 javascript 函数。在此之后,它遍历每个并每三秒更改一次图像标签的 src。整个功能让我有点难过。出于某种原因,它仅在我取消注释警报框时才有效。

   alert( index + ": " + value );

起初我认为这可能表明该功能正在运行,但是没有警报,它对我来说太快了,但我添加了一个 settimeout 并在某些图像不存在的实例上运行它只是为了检查如果它会记录一个 404,它只在未注释警报的情况下才会这样做。这是函数的完整代码,其中包括警报。

function displayGalleryImages(pid){

    var images = imageArray[pid]; //array of urls

    jQuery.each(images, function( index, value ) {
         // alert( index + ": " + value );
        setTimeout(function(){  jQuery("#"+pid).attr("src", value)   },3000);
    });
}

我知道除了评论警报之外还有更多内容,但我很难看出我哪里出错了。如果有人能发现代码中的错误,甚至是更好的方法来处理函数的任何方面,我将不胜感激。

4

3 回答 3

1

发生这种情况是因为您使用的是setTimeout()内部循环。当您编写时alert,浏览器将等待您的操作,因此它可以工作。

尝试这个:

var len = images.length;
iterate_img(0);
function iterate_img(num){
    setTimeout(function(){
        jQuery("#"+pid).attr("src", value);
        if(num < len-1){
            iterate_img(num+1);
        }        
    },3000);
}

我使用了递归函数。

希望它可以帮助你。

于 2013-10-29T11:55:47.383 回答
1

是因为范围value。它在 3 秒内取消引用。

jQuery.proxy是我的解决方案。

你最好使用:

 function callback(){
   jQuery("#"+this.myPid).attr("src", this.myValue);
 }

 ....
 var callbackThis = {myValue:value, myPid:pid};
 setTimeout(jQuery.proxy(callback, callbackThis),3000);

因此 callbackThis 包装了这些值,而回调使用了 callbackThis 的值。

于 2013-10-29T11:56:11.650 回答
0

尝试这个,

function displayGalleryImages(pid){

    var images = imageArray[pid]; //array of urls

    setAttr(pid,images,0);
}

function setAttr(pid,images,index){
    if(images[index]!=null){
       var value=images[index];
       jQuery("#"+pid).attr("src", value);
       index++;
       setTimeout(function(){   setAttr(pid,images,index);  },3000);
    }
}
于 2013-10-29T12:02:12.240 回答