javascript-触发并发循环的错误算法

javascript-触发并发循环的错误算法,javascript,prototypejs,delay,mouseout,banner,Javascript,Prototypejs,Delay,Mouseout,Banner,我创建了一个相对较小的动态横幅旋转脚本,底部带有图标,用于聚焦特定的横幅。在横幅上发射鼠标会暂停表演,但有时当我从横幅上滑鼠时,某些横幅的延迟会缩短。我甚至可以理解它是否只发生过一次,但是每次横幅在轮换中返回时,延迟都会被设置为更短的时间,而且缩短通常也发生在横幅列表中的另一个位置。有时,这可以通过一系列尚未确定的行动加以纠正。我开始怀疑我的逻辑是在中间某个地方捕捉循环,所以这个过程分支出来,运行两个循环,这似乎加快了SurnEutrBand函数的调用。不知道如何解决这个问题。我已经进行了测试,

我创建了一个相对较小的动态横幅旋转脚本,底部带有图标,用于聚焦特定的横幅。在横幅上发射鼠标会暂停表演,但有时当我从横幅上滑鼠时,某些横幅的延迟会缩短。我甚至可以理解它是否只发生过一次,但是每次横幅在轮换中返回时,延迟都会被设置为更短的时间,而且缩短通常也发生在横幅列表中的另一个位置。有时,这可以通过一系列尚未确定的行动加以纠正。我开始怀疑我的逻辑是在中间某个地方捕捉循环,所以这个过程分支出来,运行两个循环,这似乎加快了SurnEutrBand函数的调用。不知道如何解决这个问题。我已经进行了测试,看看它是否当前处于播放模式,但没有结果

我在下面列出了我认为与代码相关的部分

        var firstRun = true;
        var play = true;
        var current = 0;

        var banners = $$( '.banner' ); 
        banners.invoke( 'hide' );
        var images = $$( '.image' );
        var icons = $$( '.icon' );
        //dynamically clones an initial icon to match the number of banners
        initIcons();

        banners.invoke( 'observe', 'mouseenter', function( field ) {
            play = false;
        });

        banners.invoke( 'observe', 'mouseleave', function( field ) {
            if( !play ) {
                play = true;
                showNextBanner().delay(3);
            }
        });

        icons.invoke( 'observe', 'click', function( field ) {
                play = false;
                hideBanner( current );
                showBanner( findObj( icons, field.findElement()));
        });


        showNextBanner().delay(3); 


        function hideBanner( which ) {
            icons[ which ].src = blankIconSRC;
            banners[ which ].hide();
        }


        function showBanner( which ) {
            icons[ which ].src = selectedIconSRC;
            banners[ which ].show();
            current = which;
        }


        // loops the hiding and showing of icons 
        // (mouseenter sets play to false)
        function showNextBanner() {
            if( play ) {
                if( !firstRun ) {
                    if( ++current == banners.length ) current = 0;    
                    var previous = 0;
                    ( current == 0 )? previous = banners.length - 1: previous = current - 1;
                    hideBanner( previous );
                } else {
                    icons[0].src = selectedIconSRC;
                    firstRun = false;
                }
                showBanner( current );
                showNextBanner.delay(3);
            }
        }
    }());

在所有这些之后,客户机想要一个jQuery解决方案,这样他就可以得到一个实际上无法通过scriptaculous获得的幻灯片。所以所有的工作都白费了。好消息是,我可以使用jCarousel,并调整样式表。谢谢你的帮助

我怀疑发生的事情是你接到了多个延迟呼叫。因此,您有一个不到3秒的剩余时间,并再次调用showNextBanner,设置另一个延迟计时器


当我阅读文档时,它出现了。延迟是为了在jquery事件管道中设置间隙,而不是实际上延迟函数调用。切换到调用setTimeout而不是delay可能会让您受益匪浅,这样您就可以获得超时的句柄,在设置新超时之前可以取消该句柄,如果play设置为false,则可以取消该句柄,如果play设置为false,则可以取消该句柄,然后在play设置为true时重新设置。这在

中提到,我的猜测是,因为您没有取消延迟函数,他们在周围逗留的时间太长了,但他们开火时什么也不做,因为游戏是假的。但一旦游戏再次成为现实,一切又开始产生影响

您可以将返回的值保存为delay,并使用clearTimeout值取消计时器

但是,我也建议您对所有横幅使用一个容器,并可能将图标也放在其中,并在该容器上设置mouseenter/mouseleave事件,而不是在单个横幅上。然后只有一个元素可以启动/停止横幅旋转。如果您还将所有内容拆分为播放和停止旋转的特定函数,以及显示特定横幅的函数,则可能会得到更清晰的代码结构


我只是为了好玩而把它放在一起,而不是编辑你的代码,所以它完全不同。很抱歉但希望您仍然可以使用它来做一些事情

您的怀疑无疑是正确的,但实际上,使用的是jQuery,而不是jQuery。但这两个库都有一个延迟函数,因此您需要显示NextBanner不返回任何内容,因此showNextBanner.delay3可能会导致错误。浏览器可以容忍这样的事情,所以它可能会继续下去,但是我不希望有多余的延迟。