Javascript jQuery每个循环返回两次数据

Javascript jQuery每个循环返回两次数据,javascript,jquery,jquery-animate,each,Javascript,Jquery,Jquery Animate,Each,请在下面拉小提琴。一只虫子应该怎么走就怎么走——转动它的“头”,朝正确的方向爬行。但有几个bug(从两个以上开始)将其全部摧毁Jquery“each”返回坐标两次,因此生成四组坐标,而不是两个bug的两组坐标 $(document).ready(function () { function bug() { $('.bug').each(function () { //var bugs = $('.bug').length;

请在下面拉小提琴。一只虫子应该怎么走就怎么走——转动它的“头”,朝正确的方向爬行。但有几个bug(从两个以上开始)将其全部摧毁Jquery“each”返回坐标两次,因此生成四组坐标,而不是两个bug的两组坐标

$(document).ready(function () {


    function bug() {
        $('.bug').each(function () {
            //var bugs = $('.bug').length;

            var h = $(window).height() / 2;
            var w = $(window).width() / 2;
            var nh = Math.floor(Math.random() * h);
            var nw = Math.floor(Math.random() * w);



            //$this = $(this);
            //var newCoordinates = makeNewPosition();
            var p = $(this).offset();
            var OldY = p.top;
            var NewY = nh;

            var OldX = p.left;
            var NewX = nw;

            var y = OldY - NewY;
            var x = OldX - NewX;
            angle = Math.atan2(y, x);
            angle *= 180 / Math.PI
            angle = Math.ceil(angle);

            console.log(p);

            $(this).delay(1000).rotate({
                animateTo: angle
            });



            $(this).animate({
                top: nh,
                left: nw
            }, 5000, "linear", function () {
                bug();
            });

        });
    };

    bug();
});


问题是.each()调用了一个包含.each()的函数…因此每个bug都有bug()回调。只需将
bug()
调用移到.each(){}之外即可。请参阅fiddle:

问题在于,您有.each()调用一个函数,其中包含.each(),因此每个bug都有bug()回调。只需将
bug()
调用移到.each(){}之外即可。参见fiddle:

正如@Noah B所提到的,问题是每个“bug”都在为所有“bug”设置循环

我会为每个元素设置
bug()
函数,这样每个“bug”都可以单独设置

编辑(@Roko C.Buljan评论)

正如@Noah B所提到的,问题是每个“bug”都在为所有“bug”设置循环

我会为每个元素设置
bug()
函数,这样每个“bug”都可以单独设置

编辑(@Roko C.Buljan评论)


该死的…像往常一样-非常简单的解决方案。当然谢谢,陛下!该死的…像往常一样-非常简单的解决方案。当然谢谢,陛下!为什么不
$(“.bug”)。每个(bug)。你可以像平常一样在
bug
函数中引用
$(这个)
。@RokoC.Buljan,明白你的意思了。学习永远不会晚:)编辑得好+1,也很好你把范围引用回了
。调用
。虽然我会创建一种更面向对象的方法,使用
function Bug(){/**}
newbug()
Bug.create
Bug.move
方法,但这是另一个问题:)而不是
$(.Bug”)。每个(Bug)。你可以像平常一样在
bug
函数中引用
$(这个)
。@RokoC.Buljan,明白你的意思了。学习永远不会晚:)编辑得好+1,也很好你把范围引用回了
。调用
。虽然我会创建一种更面向对象的方法,使用
function Bug(){/**}
newbug()
以及
Bug.create
Bug.move
方法,但这是另一个问题:)
function bug() {
    // ... your code ...

    // calculate animation time, so that each of bugs runs same fast in long and short distance:
    var top_diff = Math.abs(OldY - nh),
        left_diff = Math.abs(OldX - nw),
        speed = Math.floor(Math.sqrt((top_diff * top_diff) + (left_diff * left_diff))) * 15;

    $(this).animate({
        top: nh,
        left: nw
    }, speed, "linear", function () {
        // rerun bug() function only for that single element:
        bug.call(this);
    });
};

$('.bug').each(bug);