Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Остановить все потоки setTimeout 
V
    Опции темы
ProgramerForever
  Дата 8.1.2012, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 1
Всего: 5



Добрый день, уважаемые участники форума.

Задача такая:
Есть стандартный вызов функции через setTimeout:
Код

   setTimeout('time()',1000);

Необходимо остановить все потоки, вызванные этой функцией.
Вообще для этого есть функция clearTimeout(id), где id - идентификатор потока, который получается так:
Код

id=setTimeout('time()',1000);

Но доступа к странице у меня, естественно, нет, поэтому и id мне недоступен напрямую.

Вопрос:
Как остановить потоки, или как добраться до id потоков?
PM MAIL WWW ICQ   Вверх
Amphiluke
Дата 8.1.2012, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 39
Всего: 112



Если идентификатор таймера не сохранялся в глобальную переменную, то получить его из кода глобального уровня не получится никак… кроме тупого перебора. smile 
То есть, ИМХО, остается только воспользоваться тем фактом, что метод setTimeout всегда возвращает значение типа Number, которое в «обычных» условиях вряд ли будет больше, скажем, пары тысяч. smile  Ну может, пары десятков тысяч, в зависимости от того, насколько активно страница использует таймеры и сколько раз она обновлялась…

Это сообщение отредактировал(а) Amphiluke - 8.1.2012, 21:37
PM   Вверх
ProgramerForever
Дата 9.1.2012, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 1
Всего: 5



Обнадёживает, ага. Всё равно спасибо, попробую брутфорсом.
PM MAIL WWW ICQ   Вверх
Amphiluke
Дата 9.1.2012, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 39
Всего: 112



Возможно, более подходящим способом будет (временно) переписать callback функцию, которая вызывается таймером?
Код

var orig_time = time;
time = function() {};
/* time = orig_time; // восстановить, когда все таймеры истекут или просто когда потребуется */


Это сообщение отредактировал(а) Amphiluke - 9.1.2012, 11:48
PM   Вверх
ksnk
Дата 9.1.2012, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 48
Всего: 386



ProgramerForever
А о чем вообще вопрос? Некто, в недоступном участке страницы с маниакальным упорством понапихал вызовов setTimeout(time,1000);
К рассматриваемому моменту, к примеру, setTmeout вызвался 10 раз и прямо сейчас вызывается time первый раз.
Автор функции time не желает, чтобы функция вызывалась оставшиеся 9 раз из этого цикла?

Почему бы не завести глобальную переменную, в которой проставить время последнего вызова и проверять это время при вызове функции?

Код

function time(){
   var date=new Date();
   if(time.lastDate && time.lastDate>date) return ;

   date.setTime(date.getTime()+1000);
   time.lastDate=date;

   ...

}


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


Это сообщение отредактировал(а) ksnk - 9.1.2012, 12:55


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
ProgramerForever
  Дата 9.1.2012, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 15.11.2006
Где: Новосибирск

Репутация: 1
Всего: 5



Amphiluke, сработал вот такой код:
Код

for (var i=0;i<100;i++) {clearTimeout(i);}

Всем спасибо.
PM MAIL WWW ICQ   Вверх
Amphiluke
Дата 9.1.2012, 14:02 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


Профиль
Группа: Завсегдатай
Сообщений: 1253
Регистрация: 26.8.2009

Репутация: 39
Всего: 112



ProgramerForever, советую вам пообновлять страничку раз семь-десять. Во многих браузерах id-шники таймеров после обновления страницы не начинают нумерацию с начала, как при первом открытии страницы, а продолжают нумерацию, начатую еще при первом открытии страницы. Так что id-шники запросто могут «ускакать» далеко за сотню.

Вот пример для тестирования:
Код

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Noname</title>
<script type="text/javascript">
console.log("id=" + setTimeout(function() { console.log("a"); }, 1000));
console.log("id=" + setTimeout(function() { console.log("s"); }, 2000));
console.log("id=" + setTimeout(function() { console.log("d"); }, 3000));
console.log("id=" + setTimeout(function() { console.log("f"); }, 4000));
</script>
</head>
<body>

</body>
</html>

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1013 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.