Вы думаете, setTimeout останавливает работу Javascript? Нет, таймеры в Javascript работают по-другому: они откладывают на определённое время только одну задачу.

учебник HTML скачать
(вся книга в одном файле 3.92М)

Веб-технологии

  • Учебник HTML в одной главе (вместо пролога)
    Что мешает вам создать веб-сайт и поместить его в Интернет? Несколько страниц текста, 15-20 минут работы - и о вашем существовании сможет узнать весь мир.
  • Гл. 1. Больше одной страницы
    Сайт из пяти страниц. Минимум HTML-тэгов. Основы навигации (гиперссылки).
  • Гл. 2. Прайс-лист. Таблицы и архивы
    Перенос списка товаров из бухгалтерской программы в Excel. Надстройка Excel для сохранения в формате HTML. Упаковка в архив zip.
  • Гл. 3. Продвижение
    Поиск информации в Интернете. Заголовок страницы (title). Краткое описание (meta description). Правильная кодировка страницы. Веб-сайт как рекламоноситель.
  • Гл. 4. Обратная связь
    ...ни с кем не встречайтесь, никому не звоните, не трогайте почтовые конверты, не распечатывайте счета, вообще не прикасайтесь к бумаге, раз уж существует электронная почта!
  • Гл. 5. Испытания в полевых условиях
    Баловство с IIS на Windows. Практической цели не имеет.
  • Гл. 6. Работа с графикой
    Фотография, полиграфия и веб. Экранное разрешение. Режим «Индексированный 256», уменьшение количества цветов в палитре. Вставка изображений в HTML-страницу. Атрибут ALT.
  • Гл. 7. Оформление с помощью CSS
    Блочные HTML-элементы. Управление цветом и размером многих элементов с помощью правил. Особенности в интерпретации HTML разными браузерами. Поля. Оформление ссылок (изменение цвета при наведении мыши - hover).
  • Гл. 8. Изменение структуры. Обновление
    Каталог продукции: картинки с описаниями. Отличие элементов PRE и P. Добавление прозрачности изображениям. Выравнивание по вертикали. Обработка текстов с помощью поиска и замены символов. Немного об HTML-таблицах.
  • Гл. 9. Javascript: баловство или необходимость?
    Получение информации о браузере (интернет-обозревателе, клиенте, агенте). Оформление с помощью JS: невидимая на экране команда JavaScript вставляет в текст страницы невидимую глазом инструкцию - и вид страницы изменяется. Оптимизация кода.
  • Гл. 10. Примечания (сноски) в книге
    В HTML-странице не обязательно собирать все примечания в конце. Их можно отображать и скрывать по желанию пользователя прямо там, где стоит ссылка на сноску.
  • Гл. 11. DHTML для нашего сайта
    События onclick, oncontextmenu. Знакомство с DOM (объектной моделью HTML-документа). DHTML-шутка: сайт в одной странице.
  • Гл. 12. Электронные документы
    Скрыть или показать часть стуктуры. Создание оглавления.
  • Учебные материалы
    Файлы примеров для учебника HTML, спецификации W3C, несколько полезных программ.

Статьи

  • Таймеры в Javascript (setInterval, setTimeout)
    В программировании на скриптовых языках периодически возникает необходимость создать паузу – приостановить выполнение программы на некоторое время, а потом продолжить работу. Например, в сценариях ... 26.08.10
  • Javascript фильтрация данных
    Сортировать HTML-таблицу мы уже научились. Вторая после сортировки задача базы данных – выборка строк из таблицы по определённому критерию. Например, чтобы поле город заканчивалось на -тск. Эту ... 24.08.10 Комментарии (2)
  • Javascript: вопросы и ответы
    Все примеры javascript для данной страницы находятся в файле o3.js. Для правильной работы скриптов необходима также библиотека ir2.js. Как запомнить options, выбранный в элементе select? ... 18.07.10
  • Javascript: часто задаваемые вопросы
    Как удалить пробелы в Javascript с учётом  ? Речь, понятно, идёт не о всех пробелах подряд, а о лишних пробелах справа и слева, т.е. об аналоге функции trim (удаляющей справа и слева строки ... 27.02.10 Комментарии (3)
  • Редактирование таблицы MySQL: Javascript интерфейс
    В предыдущей статье мы рассмотрели предельно простой способ доступа к базе данных MySQL (редактирование таблицы без перезагрузки HTML страницы). Отправка данных на сервер производилась через ... 21.02.10 Комментарии (4)
  • Редактирование таблицы MySQL в браузере
    Заголовок, конечно, пугающий, но там (здесь), в общем, ничего необычного: редактирование таблицы MySQL происходит всё-таки с помощью серверного скрипта PHP. К тому же пользователи вообще очень часто ... 24.01.10 Комментарии (3)
  • 10 лучших функций Javascript
    Функция удаления со страницы ссылок «на себя» stripSelfHref() DOM-инспектор dom-javascript.js Функция scriptRequest() (фоновые http-запросы) Функция записи куки setCookie() Функция чтения куки ... 16.01.10 Комментарии (1)
  • Сортировка таблицы средствами JavaScript - DOM
    Вопрос когда-то с неизбежностью возникает перед любым добросовестным веб-мастером: зачем перегружать HTML страницу при сортировке таблицы? Нельзя ли перегруппировать HTML элементы таблицы прямо в ... 09.01.10 Комментарии (37)
  • DHTML: условная разметка для HTML кода
    Стили набора и форматирования Как авторы обычно оформляют текст при наборе? Например, когда надо какое-то слово сделать курсивным? Результат можно получить разными способами: Нажать мышкой в ... 05.01.10
  • DHTML: защита форума
    Как защитить фор(ум|му) от спама? Форма – это дыра, через которую сообщения пользователя отправляются на сервер. Точнее, несколько дыр: текст сообщения, автор, e-mail... Форма 1. Автор: ... 02.01.10
  • DHTML: хранение настроек пользователя
    Для чего нужен Dynamic HTML Убрать Развернуть и запомнить Улучшить восприятие страницы и сделать работу с ней более удобной. Скрыть-отобразить часть текста. Выпадающее ... 30.12.09
  • DHTML: проверка формы
    В предыдущей статье http://ir2.ru/dhtml.aspx мы сформулировали ряд причин, по которым бывает необходимо изменять HTML страницу после её открытия в браузере. Повторяем здесь список этих причин: ... 26.12.09 Комментарии (1)
  • DHTML
    Нечасто задаваемые вопросы Изменение текста (и оформления) страницы после её открытия в браузере иногда называют DHTML – Dynamic HTML. Справочник по DHTML найти в сети почти невозможно. ... 24.12.09 Комментарии (2)
  • JavaScript
    О популярности JavaScript в Википедии слагают легенды. Специалисты объясняют эту популярность в основном простотой языка и широкой поддержкой в прикладных программах. Такой взгляд кажется нам немного ... 13.12.09 Комментарии (1)
  • HTML таблицы
    Таблица (элемент table) является, пожалуй, самой загадочной и сложной конструкцией языка HTML. Хотя собственно HTML тут ни при чём, таблица сложна по самой своей сути, по противоречивой логике ... 07.12.09
  • Самый быстрый браузер
    В последние годы интернет-обозреватели не радуют нас разнообразием рекламы: «С новой версией NN ваш веб-сёрфинг станет ещё безопаснее!» – наиболее типичный призыв производителей. А ... 26.10.09 Комментарии (3)

Добавить статью:

*Заголовок:
Имя файла (только латинские буквы):
Автор:
*Текст:

Правила оформления:

  • HTML-тэги не работают (выводятся на экран в виде кода)
  • Абзац - два раза Enter (абзацы отделяются пустыми строками)
  • #Подзаголовок - абзац, первый знак у которого решётка
  • __курсив для группы__, **жирный для группы** (2 знака подчёркивания или 2 звёздочки перед первым словом группы и после последнего);
  • _@Выделение цветом@_ с помощью зеркальных _@ в начале выделения и @_ в конце;
  • @:=r в начале абзаца - выравнивание вправо;
  • @:=l в начале абзаца - выравнивание влево;
  • @:=c в начале абзаца - выравнивание по центру
  • | (вертикальная черта) перед концом строки (Enter) - разрыв строки в пределах абзаца
  • Двойные повторяющиеся кавычки превращаются: ""группа слов"" => «группа слов»
  • Одинарные повторяющиеся кавычки превращаются: ''группа слов'' => “группа слов”

~~~~~~~~~~~~~~~~~~~~

Получение информации о сайтах


ir2.ru

ООО РИА «Лимон и К»
2006-2010

Иркутск-81, Депутатская, 79-27. Тел.: +7 3952 230413

Предприятия Иркутска

~~~~~~~~~~~~~~~~~~~~

Таймеры в Javascript (setInterval, setTimeout)

В программировании на скриптовых языках периодически возникает необходимость создать паузу – приостановить выполнение программы на некоторое время, а потом продолжить работу. Например, в сценариях VBS и PHP возможны такие методы:

VBS: wscript.sleep 1500 (остановка на 1.5 секунды)

PHP: sleep(10); (остановка на 10 секунд)

Во время подобных пауз исполняющая система (PHP или VBS) ничего не делает. Разработчик, попытавшись интуитивно использовать нечто подобное в Javascript, будет неприятно удивлён. Типичная ошибка при попытке создать паузу в Javascript выглядит так:

Вы думаете, что, когда при прохождении цикла очередь дойдёт до рисования очередной цифры, ваш setTimeout честно остановит работу Javascript, подождёт 0.9 сек., добавит в конец поля ввода нужную цифру и потом продолжит работу. Но на самом деле это не так: setInterval и setTimeout в Javascript откладывают выполнение только того действия (или функции), которое указано в скобках. В нашем примере произойдёт следующее:

  1. i = 1;
  2. откладываем добавление цифры "1" к полю ввода на 0.9 секунды;
  3. немедленно за постановкой этой задачи цикл идёт дальше: i=2;
  4. откладываем добавление цифры "2" к полю ввода на 0.9 секунды;
  5. ...

Немедленно означает, например, 1 мс (то есть несоизмеримо мало, по сравнению с 900 мс): цикл прозведёт свою работу практически мгновенно, создав несколько отложенных задач от одной и той же точки времени. Это значит, все отложенные задачи по "рисованию" будут выполнены практически в одно и то же время, без пауз между добавлением новых цифр. Цикл запускается; всё замирает на 0.9 с; и ширрр – все цифры выстреливаются в ряд одна за другой.

А как в подобном случае правильно применить setTimeout? Это сложно. Придётся вызывать функцию рекурсивно (изнутри функции ту же самую функцию), а чтобы этот процесс не был бесконечным, задать условие остановки (например, величину печатаемого числа):

И ещё переменную i придётся инициализировать вне функции – например, так:

Вот теперь всё работает, как надо (мы уменьшили время задержки с 0.9 с до 0.4 с). Но для подобных задач логичнее всё-таки применять не setTimeout а setInterval (хотя при этом понадобится две функции):

Особенность метода Javascirpt setInterval в том, что он не проходит «сам собой», его надо останавливать специальным методом clearInterval. А чтобы было понятно, что именно останавливать, задаче по отложенному действию присваивается специальнй идентификатор – таймер: window.timer1 = window.setInterval(...).

Идентификаторы можно присваивать так же и задачам, создаваемым методом setTimeout. Все идентификаторы таймеров должны отличаться друг от друга (быть уникальными в пределах текущего окна браузера). Тогда можно создать в окне несколько разных задач, использующих отложенные действия, и эти задачи будут выполняться параллельно (вроде как одновременно, если у компьютера хватает ресурсов), что в принципе невозможно в PHP или VBS.

Вот пример страницы с несколькими Javascript-таймерами, работающими одновременно: setinterval.htm (Javascript-функции в файле setinterval.js). Работу всех таймеров страницы (кроме меню) можно остановить клавишей Esc. Все таймеры примеров опираются на «естественный» (а не абстрактное i++) отсчёт – времени или расстояния. Все «часы» специально рассинхронизированы (для наглядности). Таймеры, зависящие от расстояния, используются в «индикаторе» и в выпадающем («выезжающем») меню.

Выпадающее меню

Наше выезжающее меню – реально выезжающее (из-под «шапки»): между элементами специально оставлены зазоры, чтобы видеть, как оно выезжает. Неожиданно оказалось, что мы не можем сделать одинаково плавный выезд для списков разной длины – вероятно, из-за низкой производительности компьютера (AMD Athlon 999 МГц).

Достаточно очевидно, что для красоты и гармонии нужно, чтобы списки разных пунктов меню выпадали за одно и то же время. То есть более длинные списки должны выпадать с более высокой скоростью, более короткие – с меньшей скоростью. Казалось бы, это можно реализовать так:

  1. Устанавливаем общее время «выезжания», например, в 200 мс.
  2. Если выпадающий список имеет высоту 20 px, очевидно, что мы можем двигать его вниз по одному пикселу за интервал 10 мс – и тогда за 200 мс список вылезет весь.
  3. Если выпадающий список имеет высоту 40 px, чтобы уложиться в то же время, мы должны двигать его вниз по одному пикселу за 5 мс.

По этой логике, если выпадающий список имеет высоту 200 px, мы должны двигать его вниз по одному пикселу за 1 мс. Но такая скорость на нашем компьютере не прокатывает – браузер просто не успевает отрисовывать новое положение списка за одну миллисекунду. Да. Javascript считать успевает (что там считать-то?), а браузер (Firefox) отображать не успевает. Типичная ситуация для веб.

Поэтому более-менее уровнять время выезжания меню можно только с помощью костылей, и ещё неясно, как это будет работать на более быстром компьютере. Но мы ведь должны рассчитывать на самый медленный? Алгоритм (без учёта быстродействия компьютера) получается примерно такой:

  1. Устанавливаем общее время выезжания списка: time = 224 (ms).
  2. Устанавливаем минимальное время для одного интервала в цикле: delay = 3 (ms).
  3. Устанавливаем минимальный шаг для движения списка: offset = 1 (px).
  4. Меняем всё это в зависимости от высоты списка: 1) увеличиваем время задержки (интервала) обратно пропорционально высоте и прямо пропорционально общему времени time (при высоте 224 коэффициент равен 1); 2) если высота больше 40 px, увеличиваем минимальный шаг пропорционально высоте. Константа "40" получена опытным путём для наиболее медленного компьютера. Тесты на компьютере Pentium 4 CPU 2.53GHz выявили точно такое же число – 40. Иначе таймеры идут вразнос, списки выезжают не в ногу.

Вот теперь списки более-менее выезжают. За более-менее похожее время. На странице setinterval.htm.

А вот и Брю-ус:

Сама функция, выдвигающая вложенные списки из меню, как видим, очень проста. Осталось только запустить её примерно такой строкой:

Ну, а перед запуском только вычислить все эти maxtop и offset, а также поместить список в положение mintop. Чем и занимается «предварительная» функция slide() размером в 40 строк. А всё вместе - в файле setinterval.js. Да, и эта хрень ни хрена не будет работать без подключенного файла стилей menuroll.css.

D.M., admin

Читать все комментарии (0)

Добавить комментарий:

*Автор:
E-Mail:
*Текст: