繁体   English   中英

为什么这个setTimeout代码会建立而不是终止?

[英]Why does this setTimeout code build up and not terminate?

如果您单击html的正文一次,然后等到球不在屏幕上就好了。 但是如果你点击2次以上,你会注意到球的移动速度更快。 当您再次单击身体以使球返回时,它仍然比应该的要快。 为什么? http://jsfiddle.net/44nwt/10/

在页面上的firefox中编辑(我还没有在jsfiddle上尝试过),我注意到即使在球离开屏幕并被移走后,移动函数也被重复调用。 为什么不存在?

if (left > parseInt($('.ballwrapper').css('width'))) {
    //alert('removed');
    $('.ball').remove();
    return;
}

如果left未定义(即,球已经被移除)则条件为假并且将重复进行调度

这有效(http://jsfiddle.net/44nwt/11/)

有两个问题:

#1每次单击都会创建另一个ball和ballwrapper实例,并将它们添加到主体中。 如果实例尚不存在,则只需创建实例。 所以这看起来像这样:

 $('body').click(function() {
    var wrapper = $('.ballwrapper');
    if( wrapper.length == 0 ) {
        $('body').append('<div class="ballwrapper"><img class="ball" src="http://michaelreid.typepad.com/.a/6a00e54edabd838833011168a00f09970c-800wi"/></div>');
    }
    MoveCode();
});

#2你需要在MoveCode函数的开头有一个门,以防止在移除球/球包装器后继续进行“额外”循环(每次额外点击开始的循环)。

function MoveCode() {
    var wrapper = $('.ballwrapper');
    if( wrapper.length == 0 ) return;

    var l = $('.ball').css("left");
    var left = parseInt(l);
    if (left > parseInt(wrapper.css('width'))) {
        //alert('removed');
        wrapper.remove();
        return;
    }

    $('.ball').css("left", (left + 60) + "px");
    setTimeout(MoveCode, 160);
}

还要注意......我改变了它以移除球形包装,而不是仅仅移除球。 否则,如果一遍又一遍地运行它,则会在背景中堆积旧的,未使用的包装纸。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM