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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Пауза на JavaScript. (Mozilla only), дайте совет 
:(
    Опции темы
Sattu
Дата 2.5.2004, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 7.8.2002
Где: Західна Україна

Репутация: нет
Всего: 4



Здраствуйте.

Уважаемые господа, как корректно и красиво реализовать субж только для Mozilla? Я пробовал так:

1)
Код
function pause(numberMillis) {
   var now = new Date();
   var exitTime = now.getTime() + numberMillis;
   while (true) {
       now = new Date();
       if (now.getTime() > exitTime)
           return;
   }
}

Но даный метод очень сильно нагружает баузер.

2)
Код
document.write("first<br>");
setTimeout("document.write('second<br>');", 2000);
document.write("third<br>");

Все равно делает не то... выводит:
first
third
(пауза)
second (вытирая две предыдущие строки)

Как сделать правильно?

--------------------
тссссс.... «ЖЖ»
PM WWW ICQ AOL   Вверх
Sardar
Дата 2.5.2004, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата
только для Mozilla
что не есть гуд... будем писать под все браузеры.
Так, разберемся что ты хочешь сделать! smile.gif
Мне так кажется что ты хочешь что бы некий текст добавлялся в конец страницы через паузу(usleep...) и возможно дальше идет остальная часть страницы...

window.setTimeout не останавливает процесс выполнения - это правильно smile.gif Тогда можно сделать очередь дейстие/время + небольшой код который будет доставать из очереди следующее действие.
Код

utimer.timer=null; //ссылка на таймер, нужна что бы оборвать его
utimer.inprocess=false; //очередь запущенна
utimer.qtime=[]; //время
utimer.qfunc=[]; //действие

/**
* Поставить действие в очередь.
* void utimer(int mstime, function func, object owner=null[,arg...]);
* mstime - пауза в милисекундах
* func - указатель на вызывемую функцию обработчик
* owner - обьект, если задан, то вызыватся его метод(специфируется контекстом)
* args... - любое количество аргументов дальше.
*/
function utimer(mstime,func,owner) {
utimer.qtime.push(mstime);
//идиотиз, но arguments не имеет метода slice... =/
for(var i=1, arg=[]; i<arguments.length; i++) arg.push(arguments[i]);
utimer.qfunc.push(arg);
if(!utimer.inprocess) utimer.nextPaused();
}
/**
* Выполнить следующее действие. Вызываешь если надо сбросить текущий таймер и
* немедленно выполнить действие.
*/
utimer.nextPaused=function() {
if(utimer.inprocess) { // делаем полезную работу
 var trgt=utimer.qfunc.shift();
 var arg=trgt.length>2? trgt.slice(2): null;
 if(typeof(trgt[1])=="object") trgt[0].apply(trgt[1],arg);
 else trgt[0](arg);
}
if(utimer.timer) window.clearTimeout(utimer.timer);
if(utimer.qtime.length>0) { //есть еще действия?
 utimer.timer=window.setTimeout(utimer.nextPaused, utimer.qtime.shift());
 utimer.inprocess=true;
} else { //нет тогда останавливаем очередь
 utimer.timer=null;
 utimer.inprocess=false;
}
}

Теперь мы можем поставить любое действие на очередь по времени, т.е. действие выполнится по прерыванию таймера.
Код

//допишем в слой
function writeText(text) {
document.getElementById("container").innerHTML+="<br><b>"+text+"</b>";
}
utimer(2000,writeText,null,"Напишем за 2с");
utimer(1000,writeText,null,"А это за 1с");
utimer(3000,writeText,null,"Этот текст за 3с");
utimer(4000,writeText,null,"И самый долгий за 4 секунды");
//действия поставленны на очередь, и скрипт продолжает выполнение
alert("я вызовусь раньше чем в слой будет что либо написанно");
...
<span>Текст до.</span>
<div id="container">Сейчас появится текст:<div>
<span>И текст после</span>



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Sattu
Дата 3.5.2004, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 7.8.2002
Где: Західна Україна

Репутация: нет
Всего: 4



Большое тебе, Sardar, человеческое спасибо за очень толковый ответ.

Но, к сожалению, я не обьяснил зачем мне это нужно - и ты пошел по ложному пути. Сорри..

Мне это нужно не для HTML, а для XUL (eXtensible User interface Language). На этом "диалекте" XML "пишут" интерфейсы плагинов для Mozill'ы и не только.

Я пишу клиент для сервера чатов. Он общается с сервером через сокет с помощью XML-based протокола. Так вот, между посылкой некоторых пакетов нужно делать паузы в несколько секунд. И тут я застрял, никак не могу более-менее реализовать эту паузу sad.gif

Очень нужно чтобы функции выполнялись в строгом порядке до и после паузы. Тоесть чтобы, например, в твоем последнем коде alert() выполнялся после последнего utimer(). Возможно ли вообще такое реализовать на JavaScript?

Еще раз спасибо за предыдущий ответ.



--------------------
тссссс.... «ЖЖ»
PM WWW ICQ AOL   Вверх
Sardar
Дата 3.5.2004, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



>Так вот, между посылкой некоторых пакетов нужно делать паузы в несколько секунд.
Зачем это для чат-клиента...?

Возможно обьект через который ты общаешся с сервером имеет встроенные функции для задержки времени. У xulplanet.com траблы с хостингом, я до справочника не добрался.

По любому уснуть как в С, так что бы кнопки перестали реагировать не получится, и это правильно ИМXО.

Я думаю что с очередью все получится, ставим отправку пакетов в очередь с задержкой, а последним действием возобновляем выполнение программы. Таймер работает паралельным процессом, т.е. код повешанный на события продолжает исполняться, так что по кнопке "прервать" можно легко очистить очередь.'

Подробней опиши задачу, когда и зачем отправляем пакеты, через какие обьекты, как принимается ответ сервера(событие, опрашиваем обьект...) и т.п. Как-нибудь разберемся smile.gif


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Sattu
Дата 5.5.2004, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 7.8.2002
Где: Західна Україна

Репутация: нет
Всего: 4



Цитата
По любому уснуть как в С, так что бы кнопки перестали реагировать не получится, и это правильно ИМXО.

Да мне и не надо чтобы кнопки не реагировали, просто чтобы скрипт (а не браузер) "засыпал".

Цитата
Я думаю что с очередью все получится, ставим отправку пакетов в очередь с задержкой, а последним действием возобновляем выполнение программы. Таймер работает паралельным процессом, т.е. код повешанный на события продолжает исполняться, так что по кнопке "прервать" можно легко очистить очередь.'

Ты прав, по видимому придется использовать очереди.

Цитата
Подробней опиши задачу, когда и зачем отправляем пакеты, через какие обьекты, как принимается ответ сервера(событие, опрашиваем обьект...) и т.п. Как-нибудь разберемся

Я использую библиотеку JSLib, вернее только один ее скрипт socket.js. Он разрешает делать базовые операции с сокетом (open, read, write, close).

Перестрою принцып работы клиента - и думаю, что всеже удастся обойти паузу. Я просто не очень опытен в JavaScript'е, и иногда пытаюсь решить задачу "в лоб". Но JavaScript требует особого подхода и мышления, к котому, я надеюсь, довольно скоро привыкну smile.gif.

--------------------
тссссс.... «ЖЖ»
PM WWW ICQ AOL   Вверх
Sardar
Дата 5.5.2004, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата
Я использую библиотеку JSLib, вернее только один ее скрипт socket.js

По сути socket.sj оболочка это оболочка для SocketService. Класс юзает только входящий и исходящий поток(метод open), если покопатся в nsISocketTransportService, может там есть функции time-out'а.
Но все же логику работы лучше продумать smile.gif


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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