2015-09-09 3 views
2

Я делаю анимацию, что каждый элемент списка будет плавно перемещаться внутри его обертки. Я пытаюсь собрать образец прототипального наследования, но он этого не делает. Есть несколько мест, которые, по моему мнению, могут быть причиной этой проблемы, но мне нужно посоветоваться.jQuery - случайная движущаяся анимация с использованием прототипального шаблона наследования

function Menu($item) { 
    this.item = $item; 
}; 

Menu.prototype.makeNewPosition = function ($container) { 
    var h = $container.height() - 50; 
    var w = $container.width() - 50; 

    var nh = Math.floor(Math.random() * h); 
    var nw = Math.floor(Math.random() * w); 

    return [nh, nw]; 
}; 


Menu.prototype.move = function() { 
    $.each(this.item, function(index, value) { 
     var newq = this.makeNewPosition(value.parent()); 
     value.animate({ 
      top: newq[0], 
      left: newq[1] 
     }, 400, function() { 
      this.move(); 
     }); 
    }); 
}; 

var $menu = new Menu($('.nav li')); 
$menu.move(); 

В move функции есть animate и в этом я звоню move снова запустить анимацию на неопределенное время. Если он вызывает себя в прототипной структуре, можно ли его называть this?

Непонятно также об использовании $.each в пределах move функция.

Вот JSfiddle

+0

любые ошибки консоли, чтобы сообщить? –

+0

'Uncaught TypeError: значение.parent не является функцией' находится в консоли. –

+0

Я вижу это сейчас. Думаю, мне нужно обернуть 'значение' как объект jQuery для доступа к parent()'? –

ответ

5

Вот уборщицей версии

  • использует себя вместо того, что - я использую that, большинство людей используют self - Я отличаюсь: р
  • набор $value = $(value) ... DRY

.

function Menu($item) { 
    this.item = $item; 
}; 

Menu.prototype.makeNewPosition = function ($container) { 
    var h = $container.height() - 50; 
    var w = $container.width() - 50; 

    var nh = Math.floor(Math.random() * h); 
    var nw = Math.floor(Math.random() * w); 

    return [nh, nw]; 
}; 


Menu.prototype.move = function() { 
    var self = this; 
    $.each(this.item, function(index, value) { 
     var $value = $(value); 
     var newq = self.makeNewPosition($value.parent()); 
     $value.animate({ 
      top: newq[0], 
      left: newq[1] 
     }, 400, function() { 
      self.move(); 
     }); 
    }); 
}; 

var $menu = new Menu($('.nav li')); 
$menu.move(); 

original answer below - which contains explanation of changes

Вот все ошибки фиксированной, а не только первый

function Menu($item) { 
    this.item = $item; 
}; 

Menu.prototype.makeNewPosition = function ($container) { 
    var h = $container.height() - 50; 
    var w = $container.width() - 50; 

    var nh = Math.floor(Math.random() * h); 
    var nw = Math.floor(Math.random() * w); 

    return [nh, nw]; 
}; 


Menu.prototype.move = function() { 
    var that = this; // added that because the this isn't the this you want in the $.each function 
    $.each(this.item, function(index, value) { 
     var newq = that.makeNewPosition($(value).parent()); 
     //   ^^^^     ^^ ^
     //   that instead of this 
     //        $(value) instead of value 
     $(value).animate({ 
     // ^^ ^
     // $(value) instead of value 
      top: newq[0], 
      left: newq[1] 
     }, 400, function() { 
      that.move(); 
      //^^^^ another this to that change 
     }); 
    }); 
}; 

var $menu = new Menu($('.nav li')); 
$menu.move(); 

Там же способы очистки кода еще больше, но эти изменения должны заставить вас работать по крайней мере

Рабочие изменения на вашей скрипке http://jsfiddle.net/wzmh63xb/16/

+0

Спасибо, теперь это анимация, но она работает только один раз. это 'this.move()' правильный способ самозапускать функцию перемещения? –

+0

проклятье, измените 'this.move' на' that.move' - ответ и скрипку обновили –

+0

А теперь это получилось. Выберете свой ответ за 3 минуты. Благодаря! –

0

Ошибки. Попробуй это. это работает.

Menu.prototype.move = function() { 
    var self = this; 
    $.each(this.item, function(index, value) { 
     var newq = self.makeNewPosition($(value).parent()); 

     $(value).animate({ 
     top: newq[0], 
     left: newq[1] 
    }, 400, function() { 
     self.move(); 
    }); 
    }); 
}; 

DEMO

Смежные вопросы