Javascript-форум (https://javascript.ru/forum/)
-   Opera, Safari и др. (https://javascript.ru/forum/css-html-browser/)
-   -   Как заставить chrome выполнять javascript на скрытой вкладке? (https://javascript.ru/forum/css-html-browser/32835-kak-zastavit-chrome-vypolnyat-javascript-na-skrytojj-vkladke.html)

Пыщ-Пыщ 31.10.2012 19:36

Как заставить 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);
}


Порекомендовали обратиться на ваш форум :)

Skipp 01.11.2012 09:59

Ну например так, на вскидку:
<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>

Пыщ-Пыщ 01.11.2012 17:46

Спасибо, интересный подход :)

Конечно немного не то, но ведь тоже мона использовать

Маэстро 13.11.2012 01:18

Товарищи, я усомнился в том, что Гугл мог сделать такую гадость. В первую очередь потому, что тогда погибли бы все 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 - это обманка, т.к. при скрытой закладке полезная функция не работает (не пересчитывает регулярно координату), а пересчитывает конечную координату только в момент активизации закладки.

Skipp 13.11.2012 09:42

Цитата:

Сообщение от Маэстро
пример от Skipp - это обманка

Ну почему же сразу обманка, скрипт работает как надо для своих потребностей, имеется ввиду анимация, ведь она по сути не нужна при не активной вкладке.

Маэстро 13.11.2012 12:21

Цитата:

Сообщение от Skipp (Сообщение 215725)
Ну почему же сразу обманка, скрипт работает как надо для своих потребностей, имеется ввиду анимация, ведь она по сути не нужна при не активной вкладке.

Вы обиделись на слово? ;)
Хорошо, скажу по-другому. Известный фокусник Коперфильд не летает в реальной жизни. Но на сцене он создает иллюзию полета. Но очень правдоподобно. Но иллюзию, понимаете?

Skipp 13.11.2012 13:36

Да нет, я к тому что для анимации больше и не надо.

tadjik1 13.11.2012 14:36

а что нужно-то сделать? argument.callee — давным давно deprecated.

Маэстро 13.11.2012 14:56

Цитата:

Сообщение от tadjik1
argument.callee — давным давно deprecated

ага.. вроде как наиболее правильным (наиболее читабельно) считается передавать параметры в исполняемую функцию сразу после задания интервала (через запятую)
setTimeout(MyFunction, 100, param1, param2, param3, ...);
// function MyFunction(param1, param2, param3, ...)
Однако надо помнить, что при использовании SetInterval() и передаче туда параметров значение этих параметров будет передано только один раз, т.е. если эти парметры и изменяются в процессе работы, но SetInterval() это как бы игнорирует.


Часовой пояс GMT +3, время: 18:58.