Внимание! Этот вопрос не о лучшем способе шимма requestAnimFrame
. Если вы ищете это, перейдите к любому другому ответу на этой странице.
Вы были обмануты автоматической вставкой точек с запятой. Попробуйте это:
window.requestAnimFrame = function(){
return (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback){
window.setTimeout(callback, 1000 / 60);
}
);
}();
javascript автоматически ставит точку с запятой после вашего оператора return
. Это происходит потому, что за ним следует новая строка, а следующая строка является допустимым выражением. На самом деле это переводится на:
return;
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function */ callback){
window.setTimeout(callback, 1000 / 60);
};
Этот код возвращает undefined
и никогда не выполняет код за оператором возврата. Так что window.requestAnimFrame
это undefined
. Когда вы вызываете его в animloop
, JavaScript выдает ошибку и останавливает выполнение. Вы можете решить эту проблему, заключив выражение в скобки.
Могу ли я порекомендовать инструменты разработчика Chrome или firebug для проверки выполнения JavaScript. С этими инструментами вы бы увидели ошибку. Вы должны отладить его следующим образом (я предполагаю, что Chrome):
- Выполнить код (он дает неожиданные результаты)
- Откройте инструменты разработчика (щелкните правой кнопкой мыши -> Проверить элемент)
Вы увидите красный х в строке состояния справа (это означает, что при выполнении произошла ошибка)
- Открыть вкладку консоли
- Вы увидите
Uncaught TypeError: Свойство 'requestAnimFrame' объекта [объект DOMWindow] не является функцией
- Введите в консоли:
window.requestAnimFrame
и нажмите Enter, вы увидите, что это undefined
. Теперь вы знаете, что проблема на самом деле не связана с requestAnimationFrame
и что вам следует сосредоточиться на первой части кода.
- Теперь нужно сузить код до точки, где он что-то возвращает. Это сложная часть, и если вы до сих пор не нашли ее, возможно, вы захотите обратиться к Интернету за дополнительной помощью.
Кроме того, посмотрите это видео за некоторыми хорошими практиками в написании javascript, он также упоминает злую автоматическую вставку точек с запятой.