我创建了一个调用图片网址数组的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);
});
}
我知道除了评论警报之外还有更多内容,但我很难看到我出错的地方。 如果有人能够发现代码中的错误,或者甚至是更好地处理函数的任何方面,我会非常感激。
答案 0 :(得分: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);
}
我使用了递归函数。
希望它对你有所帮助。
答案 1 :(得分: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的值。
答案 2 :(得分: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);
}
}