JavaScript. Подробное руководство, 6-е издание, стр. 377

<b>    input: null,   // Поле, куда пользователь вводит-числа.</b>

<b>    low: null,     // Три ячейки таблицы для визуального представления</b>

<b>    mid: null,     // ...диапазона, в котором находится загаданное число.</b>

<b>    high: null</b>

<b>  };</b>

<b>  // Отыскать каждый из этих элементов по их атрибутам id</b>

<b>  for(var id in ui) ui[id] = document.getElementByld(id):</b>

<b>  // Определить обработчик событий для поля ввода</b>

<b>  ui.input.onchange = handleGuess;</b>

<b>  // Выбрать случайное число и инициализировать состояние игры</b>

<b>  state = {</b>

<b>    n: Math.floor(99 * Math.random()) + 1, // Целое число: 0 &lt; n &lt; 100</b>

<b>    low: 0, // Нижняя граница, где находится угадываемое число</b>

<b>    high: 100, // Верхняя граница, где находится угадываемое число</b>

<b>    guessnum: 0, // Количество выполненных попыток угадать число</b>

<b>    guess: undefined // Последнее число, указанное пользователем</b>

<b>  };</b>

<b>  // Изменить содержимое документа, чтобы отобразить начальное состояние</b>

<b>  display(state):</b>

<b>  // Эта функция вызывается как обработчик события onload, а также как обработчик щелчка</b>

<b>  // на кнопке Play Again (Играть еще раз), которая появляется в конце игры.</b>

<b>  // Во втором случае аргумент playagain будет иметь значение true, и если это так,</b>

<b>  // мы сохраняем новое состояние игры. Но если функция была вызвана в ответ</b>

<b>  // на событие &quot;load&quot;, сохранять состояние не требуется, потому что событие &quot;load&quot;</b>

<b>  // может возникнуть также при переходе назад по истории посещений из какого-то</b>

<b>  // другого документа в существующее состояние игры. Если бы мы сохраняли начальное</b>

<b>  // состояние, в этом случае мы могли бы затереть имеющееся в истории актуальное</b>

<b>  // состояние игры. В броузерах, поддерживающих метод pushState(), за событием &quot;load&quot;</b>

<b>  // всегда следует событие &quot;popstate&quot;. Поэтому, вместо того чтобы сохранять</b>

<b>  // состояние здесь, мы ждем событие &quot;popstate&quot;. Если вместе с ним будет получен</b>

<b>  // объект состояния, мы просто используем его. Иначе, если событие &quot;popstate&quot;</b>

<b>  // содержит в поле state значение null, мы знаем, что была начата новая игра,</b>

<b>  // и поэтому используем replaceState для сохранения нового состояния игры,</b>

<b>  if (playagain === true) save(state);</b>

<b>}</b>

<b>// Сохраняет состояние игры с помощью метода pushStateO, если поддерживается</b>

<b>function save(state) {</b>

<b>  if (!history.pushState) return;// Вернуться, если pushState() не определен</b>

<b>  // С каждым состоянием мы связываем определенную строку URL-адреса.</b>

<b>  // Этот адрес отображает число попыток, но не содержит информации о состоянии игры,</b>

<b>  // поэтому его нельзя использовать для создания закладок.</b>

<b>  // Мы не можем поместить информацию о состоянии в URL-адрес,</b>

<b>  // потому что при этом пришлось бы указать в нем угадываемое число,</b>

<b>  var url = &quot;#guess&quot; + state.guessnum;</b>

<b>  // Сохранить объект с информацией о состоянии и строку URL</b>

<b>  history.pushState(state, // Сохраняемый объект с информацией о состоянии</b>

<b>                  &quot;&quot;, // Заглавие: текущие броузеры игнорируют его</b>

<b>                  url); // URL состояния: бесполезен для закладок</b>

<b>}</b>

<b>// Обработчик события onpopstate, восстанавливающий состояние приложения,</b>

<b>function popState(event) { </b>

<b>  if (event.state) { // Если имеется объект состояния, восстановить его</b>

<b>    // Обратите внимание, что event.state является полной копией</b>

<b>    // сохраненного объекта состояния, поэтому мы можем изменять его, </b>

<b>    // не опасаясь изменить сохраненное значение. </b>

<b>    state = event.state; // Восстановить состояние </b>

<b>    displayCstate); // Отобразить восстановленное состояние </b>

<b>  }</b>

<b>  else { </b>

<b>    // Когда страница загружается впервые, событие &quot;popstate&quot; поступает</b>

<b>    // без объекта состояния. Заменить значение null действительным</b>