Кроме обработчиков есть еще один довольно распространенный косяк
setInterval(foo, 1000) НЕ будет срабатывать раз в секунду.
Он будет срабатывать не раньше чем через секунду, но позже - запросто. В зависимости от загруженности системы, анимация, и всякого такого. а еще пользователь может переключиться на ждругую вкладку, а на неактивной все замедлится. В результате такой таймер будет отставать.
Лучше на старте запоминать время, и каждом тике вычислять разницу между запомненным и текущим..