Как заставить chrome выполнять javascript на скрытой вкладке?
Вот чего-то не ожидал столкнуться с такой проблемой:
Есть код на джаве, движение обекта - мы кляпнули, коробочка побежала, переключаемся на соседнюю вкладку. Ждем время, за которое объект должен был доехать до конца пути, переключаемся обратно на вкладку и видим: коробочка продолжает движение с того места, когда мы переключились на соседнюю вкладку. ![]() Не порядок, надо как-то заставить его всегда выполнять команды Пример кода для теста: <div style="margin:50px 0 0 50px" id="run">*</div> <script type="text/javascript"> window.onclick=function(){ var runDiv=document.getElementById('run'), marginLeftRun=50, i=0; setTimeout(function(){ i++; marginLeftRun+=2; runDiv.style.marginLeft=marginLeftRun+'px'; if(i<100)setTimeout(arguments.callee,100) },100); } Порекомендовали обратиться на ваш форум :) |
Ну например так, на вскидку:
<div style="margin:50px 0 0 50px" id="run">*</div> <script type="text/javascript"> window.onclick=function(){ var runDiv=document.getElementById('run'), marginLeftRun=50, i=0, t = (new Date()).getTime(); setTimeout(function(){ i++; runDiv.style.marginLeft=marginLeftRun + (Math.floor(((new Date()).getTime() - t)/100) * 2) + 'px'; if(i<100)setTimeout(arguments.callee,100) },100); } </script> |
Спасибо, интересный подход :)
Конечно немного не то, но ведь тоже мона использовать |
Товарищи, я усомнился в том, что Гугл мог сделать такую гадость. В первую очередь потому, что тогда погибли бы все ajax-веб-приложения, которые периодически по setTimeout/setInterval обращаются к серверам. Перестал бы в частности работать мой проект, но главное перестала работать бы сама гугловская почта (gmail).
В интернете одни говорят, что в скрытой закладке Google Chrome останавливает работу setTimeout/setInterval, другие говорят, что такого не может быть! Поэтому я провел детальное исследование этого вопроса. Правы и первые, и вторые. ;) Не могу толком объяснить результаты, но заявляю следующее: 1. Google Chrome не останавливает работу setTimeout/setInterval, а сильно ЗАМЕДЛЯЕТ. 2. Степень замедления как ни странно зависит от самого интервала! В вышеописанном примере если вы подольше подождете, то увидите, что "звездочка" всё же доехала до конца. На практике у меня получилось, что резкое замедление работы setTimeout наступает при интервале 100-150 миллисекунд. При интервале 1 сек. в закрытой закладке всё работает нормально, как ему и положено. Как вы знаете, закладки Google Chrome - это отдельные windows-процессы. Так может виноват вовсе и не Гугл, а windows, которая квантует время процессора для закрытых закладок (уменьшает)? Но почему тогда в Fire Fox тот же эффект? Посмотреть работу Хрома в других ОС не имею возможности. Таким образом, быструю анимацию (100 ms) сделать не удастся. Но фоновые задачи, запускаемые с интервалом от 1000 ms работать будут. P.S. пример от Skipp - это обманка, т.к. при скрытой закладке полезная функция не работает (не пересчитывает регулярно координату), а пересчитывает конечную координату только в момент активизации закладки. |
Цитата:
|
Цитата:
Хорошо, скажу по-другому. Известный фокусник Коперфильд не летает в реальной жизни. Но на сцене он создает иллюзию полета. Но очень правдоподобно. Но иллюзию, понимаете? |
Да нет, я к тому что для анимации больше и не надо.
|
а что нужно-то сделать? argument.callee — давным давно deprecated.
|
Цитата:
setTimeout(MyFunction, 100, param1, param2, param3, ...); // function MyFunction(param1, param2, param3, ...)Однако надо помнить, что при использовании SetInterval() и передаче туда параметров значение этих параметров будет передано только один раз, т.е. если эти парметры и изменяются в процессе работы, но SetInterval() это как бы игнорирует. |
Часовой пояс GMT +3, время: 09:45. |