所以我有一段像
这样的代码 var barlen = $('#SSWEprogressbar').width(),
$elems = $('[data-srcurl]'),
k = 0,
n = $elems.length;
LoadImage();
function LoadImage()
{
var $elem = $($elems[k]);
var img = new Image(),
url = $elem.attr('data-srcurl');
$(img).load(function(){
$('#SSWEloaderfront').attr('src',url);
$('#SSWEloadprogress').width((k+1)/n*barlen + "px");
var srctgt = $elem.attr('data-srctgt');
// change url to src attribute or background image of element
if ( srctgt == "srcattr" ){ $elem.attr('src',url); }
else if ( srctgt == "bgimg" ) { $elem.css('background-image',"url("+url+")"); }
// decide whether to exit the
if ( ++k == n ) { AllyticsSSWEPlayerShow(); }
else { LoadImage(); }
});
img.src = url;
}
我之所以这样写的原因是因为需要调用load
回调才能再次执行函数中的东西。如果可能的话,我想将它从递归函数更改为循环,但我不知道如何做到这一点,因为无法使for
或while
循环“等待”在继续下一次迭代之前。或者有吗?
答案 0 :(得分:0)
正如我在评论中提到的,您可以使用setTimeout(LoadImage, 100);
中的else
轻松解决问题,而不是直接调用该函数。第二个参数是以ms为单位的延迟。
如果你理解为什么setTimeout(LoadImage, 0);
不是愚蠢的,而不是直接调用函数那么你理解setTimeout
。它将函数调用放入队列中,这意味着可以在再次调用函数之前处理其他事件,如按下的单击或按键,并且屏幕不会冻结。像这样达到最大递归也是不可能的,深度是1。