Javascript.RU

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

не работает setTimeout в userjs
Здравствуйте! Пишу скрипт для проверки личных сообщений на форуме. почему-то отказывается работать setTimeout. буду благодарен за помощь.
function idf_timer(set_tmr)
{
    var tmr_counter=set_tmr;
    if (tmr_counter>=30) {tmr_counter=0; CheckForMessages();}
    else tmr_counter++;
    setTimeout("idf_timer("+tmr_counter+")",1000);
}
Ответить с цитированием
  #2 (permalink)  
Старый 07.02.2011, 07:54
Аватар для NoResponse
Профессор
Отправить личное сообщение для NoResponse Посмотреть профиль Найти все сообщения от NoResponse
 
Регистрация: 17.06.2010
Сообщений: 152

если не ошибаюсь, надо так:
setTimeout(function(){idf_timer(tmr_counter)},1000 );
...
а вообще я бы все это заменил одной строкой
setInterval("CheckForMessages()",30000);
Ответить с цитированием
  #3 (permalink)  
Старый 07.02.2011, 11:11
Новичок на форуме
Отправить личное сообщение для killer8080 Посмотреть профиль Найти все сообщения от killer8080
 
Регистрация: 01.02.2011
Сообщений: 6

скорее так:
setTimeout((function(tmr_counter){return function(){idf_timer(tmr_counter)}})(tmr_counter), 1000);
но с интервалами решение красивее.
Ответить с цитированием
  #4 (permalink)  
Старый 07.02.2011, 11:22
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Если передать аргументом setTimeout (и setInterval) строку, то код внутри нее будет выполнен в глобальном контексте. А все юзерскрипты, если мне не изменяет память, по-умолчанию выполняются в своем собственном локальном контексте. Отсюда - функции idf_timer и CheckForMessages не существуют в глобальном контексте.
Ответить с цитированием
  #5 (permalink)  
Старый 07.02.2011, 15:10
Новичок на форуме
Отправить личное сообщение для alxcube Посмотреть профиль Найти все сообщения от alxcube
 
Регистрация: 17.01.2011
Сообщений: 4

спасибо. а причину указать не могли бы? потому что в опере этот код прекрасно работает...
Ответить с цитированием
  #6 (permalink)  
Старый 07.02.2011, 15:21
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Видимо, в опере юзерскрипты все-таки выполняются в глобальном контексте. В любом случае засорение глобального пространства имен - плохой тон, и его лучше избегать. Как и строковых аргументов для setTimeout / setInterval, потому что eval - зло (А для преобразования строки в код будет использован именно он).
Ответить с цитированием
  #7 (permalink)  
Старый 08.02.2011, 17:28
Новичок на форуме
Отправить личное сообщение для alxcube Посмотреть профиль Найти все сообщения от alxcube
 
Регистрация: 17.01.2011
Сообщений: 4

Сообщение от B@rmaley.e><e Посмотреть сообщение
Видимо, в опере юзерскрипты все-таки выполняются в глобальном контексте. В любом случае засорение глобального пространства имен - плохой тон, и его лучше избегать. Как и строковых аргументов для setTimeout / setInterval, потому что eval - зло (А для преобразования строки в код будет использован именно он).
когда пробовал не строкой, то опера начинала жутко тормозить
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
setTimeout как он работает??? namo86 Общие вопросы Javascript 16 02.02.2011 09:01
как работает setTimeout??? rhjirftyjn Общие вопросы Javascript 7 24.12.2010 16:39
ява-скрипт выборочно работает-не работает zeta777 Internet Explorer 0 20.01.2010 11:41
Динамическая HTML форма (FireFox - работает, IE - не работает) dm1tr1y Общие вопросы Javascript 10 11.12.2009 15:59
Скрипт меню-гармошки работает выборочно Extern Элементы интерфейса 2 23.02.2009 15:32