Вы должны установить обратный вызов, как это
$('.box').animate({'left' : "-=100px"}, 3000, 'linear', checkEdge());
checkEdge()
не checkEdge
Проверьте здесь для рабочего решения http://jsbin.com/uceqi (просто скопируйте вставленный код)
Здесь на самом деле имеет значение, если вы оставите скобки в стороне. Версия с фигурными скобками выполняется checkEdge()
один раз за анимацию (если честно, в действительности она выполняет checkEdge
ДО запуска анимации . Функция checkEdge()
вызывается, когда оператор $...animte(..)
достигнут еще до animate()
сам выполняется. checkEdge
приведет к тому, что функция будет передана в качестве параметра, обычно это правильный путь).
Версия без фигурных скобок выполняется checkEdge
один раз для количества элементов, соответствующих селектору. В этом случае 6 раз.
С технической точки зрения, ваш подход будет правильным, так как он будет вызывать обратный вызов один раз для каждого анимированного элемента и ПОСЛЕ анимации.
Но выполнение checkEdge
, как только это, очевидно, не то, что задумал автор (проверьте loop над div в checkEdge
). А также вызывает серьезное отставание, когда вы повторяете несколько раз по всем div
6divs анимация ->
6x обратный вызов срабатывает ->
цикл обратного вызова по всем div ==>
36x выполнение анонимной функции в checkEdge()
!!
Таким образом, настоящая проблема заключается в том, что обратный вызов запускается 6 раз и все одновременно. Таким образом, у нас есть состояние гонки, и анимация испортилась. Поскольку несколько checkEdge()
вызовов одновременно работают над изменением положения div.
Но вы заметите это только потому, что animation-speed
и интервал в setInterval
(shiftLeft) идентичны. Будут ли они отличаться ((интервал + ~ 1000 мс)> скорость анимации), то это будет работать правильно. Но, конечно, анимация не будет плавной. Как shitfLeft()
будет срабатывать 1 с после остановки анимации.
Вы можете проверить этот пример http://jsbin.com/iwapi3, который иллюстрирует, что происходит при использовании версии без фигурных скобок. Подождите некоторое время, и счетчик checkEdge()
вызовов увеличивается на 7 каждые 3 с. Вы также заметите, что в некоторых случаях анимация частично работает, а некоторые элементы div иногда возвращаются в конец списка.
Через некоторое время нажмите кнопку и посмотрите, как версия с фигурными скобками разбирает беспорядок после нескольких запусков (но теперь, конечно, неправильный порядок цвета, конечно, испорчен). И только вызывает checkEdge()
один раз за анимацию. (Вскоре после нажатия кнопки вы получите еще один +7, так как некоторые обратные вызовы все еще находятся в канале)