Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.10.2012, 19:36
Новичок на форуме
Отправить личное сообщение для Пыщ-Пыщ Посмотреть профиль Найти все сообщения от Пыщ-Пыщ
 
Регистрация: 31.10.2012
Сообщений: 2

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


Порекомендовали обратиться на ваш форум
Ответить с цитированием
  #2 (permalink)  
Старый 01.11.2012, 09:59
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

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

Последний раз редактировалось Skipp, 01.11.2012 в 10:01.
Ответить с цитированием
  #3 (permalink)  
Старый 01.11.2012, 17:46
Новичок на форуме
Отправить личное сообщение для Пыщ-Пыщ Посмотреть профиль Найти все сообщения от Пыщ-Пыщ
 
Регистрация: 31.10.2012
Сообщений: 2

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

Конечно немного не то, но ведь тоже мона использовать
Ответить с цитированием
  #4 (permalink)  
Старый 13.11.2012, 01:18
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Товарищи, я усомнился в том, что Гугл мог сделать такую гадость. В первую очередь потому, что тогда погибли бы все 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 - это обманка, т.к. при скрытой закладке полезная функция не работает (не пересчитывает регулярно координату), а пересчитывает конечную координату только в момент активизации закладки.
Ответить с цитированием
  #5 (permalink)  
Старый 13.11.2012, 09:42
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Сообщение от Маэстро
пример от Skipp - это обманка
Ну почему же сразу обманка, скрипт работает как надо для своих потребностей, имеется ввиду анимация, ведь она по сути не нужна при не активной вкладке.
__________________
.
Ответить с цитированием
  #6 (permalink)  
Старый 13.11.2012, 12:21
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от Skipp Посмотреть сообщение
Ну почему же сразу обманка, скрипт работает как надо для своих потребностей, имеется ввиду анимация, ведь она по сути не нужна при не активной вкладке.
Вы обиделись на слово?
Хорошо, скажу по-другому. Известный фокусник Коперфильд не летает в реальной жизни. Но на сцене он создает иллюзию полета. Но очень правдоподобно. Но иллюзию, понимаете?
Ответить с цитированием
  #7 (permalink)  
Старый 13.11.2012, 13:36
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Да нет, я к тому что для анимации больше и не надо.
__________________
.
Ответить с цитированием
  #8 (permalink)  
Старый 13.11.2012, 14:36
Профессор
Отправить личное сообщение для tadjik1 Посмотреть профиль Найти все сообщения от tadjik1
 
Регистрация: 07.06.2011
Сообщений: 315

а что нужно-то сделать? argument.callee — давным давно deprecated.
Ответить с цитированием
  #9 (permalink)  
Старый 13.11.2012, 14:56
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как выводить часть элементов страницы через javascript Victim Events/DOM/Window 9 28.12.2011 22:51
Как правильно удалить из шаблона, javascript код? QroxZ Общие вопросы Javascript 0 04.11.2011 17:59
Как узнать подключен ли JavaScript у пользователя? frost18 Элементы интерфейса 1 26.10.2011 17:16
После перехода на IE 9 javascript перестал работать как требуется javascript_pupil Общие вопросы Javascript 2 04.10.2011 11:19
как сделать гиперсылку на объект javascript??? kos_walker Общие вопросы Javascript 3 30.09.2008 06:58