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

<b>      &lt;button onclick=&quot;sync()&quot;&gt;Синхронизировать&lt;/button&gt;</b>

<b>      &lt;button onclick=&quot;applicationCache.update()&quot;&gt;0бновить пpилoжeниe&lt;/button&gt;</b>

<b>    &lt;/div&gt;</b>

<b>    &lt;textarea id=&quot;editor&quot;&gt;&lt;/textarea&gt;</b>

<b>    &lt;div id=&quot;statusline&quot;&gt;&lt;/div&gt;</b>

<b>  &lt;/body&gt;</b>

<b>&lt;/html&gt;</b>

Наконец, в примере 20.7 приводится сценарий на языке JavaScript, который обеспечивает работу веб-приложения PermaNote. Он определяет функцию

<b>status()</b>
для отображения сообщений в строке состояния, функцию
<b>save()</b>
- для сохранения текущей версии заметки на сервере и функцию
<b>sync()</b>
- для синхронизации серверной и локальной копии заметки. Функции
<b>save()</b>
и
<b>sync()</b>
используют приемы управления протоколом HTTP, описанные в главе 18. (Интересно отметить, что функция
<b>save()</b>
использует HTTP-метод «PUT» вместо более типичного для таких случаев метода «POST».)

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

<b>onload</b>

Пытается загрузить заметку с сервера, если там хранится более новая ее версия, и по завершении синхронизации разрешает доступ к окну редактора. Функции

<b>save()</b>
и
<b>sync()</b>
выполняют HTTP-запросы и регистрируют обработчик события «onload» в объекте
<b>XMLHttpRequest</b>
, чтобы определить момент, когда выгрузка или загрузка будут завершены.

<b>onbeforeunload</b>

Сохраняет текущую версию заметки на сервере, если она еще не была выгружена.

<b>oninput</b>

Всякий раз, когда текст в элементе

<b>&lt;textarea&gt;</b>
изменяется, он сохраняется в объекте
<b>localStorage</b>
, и запускается таймер. Если пользователь не продолжит редактирование в течение 5 секунд, заметка будет выгружена на сервер.

<b>onoffline</b>

Когда броузер переключается в автономный режим, в строке состояния выводится сообщение.

<b>ononline</b>

Когда броузер подключается к сети, выполняется проверка наличия на сервере более новой версии заметки и выполняется сохранение текущей версии.

<b>onupdateready</b>

Если появилась новая версия приложения, выводится сообщение в строке состояния, сообщающее об этом пользователю.

<b>onnoupdate</b>

Если приложение не изменилось, сообщает пользователю, что он или она работает с текущей версией.

А теперь, после краткого обзора логики работы приложения PermaNote, в примере 20.7 приводится ее реализация.

Пример 20.7'. permanote.js

<b>// Некоторые необходимые переменные</b>

<b>var editor, statusline, savebutton, idletimer;</b>

<b>// При первой загрузке приложения</b>

<b>window.onload = function() {</b>

<b>  // Инициализировать локальное хранилище, если это первый запуск</b>

<b>    if (localStorage.note == null) </b>
<b>localStorage.note = &quot;&quot;;</b>

<b>    if (localStorage.lastModified == null) localStorage.lastModified = 0;</b>

<b>    if (localStorage.lastSaved == null) localStorage.lastSaved = 0;</b>

<b>  // Отыскать элементы, которые составляют пользовательский интерфейс редактора.</b>

<b>  // Инициализировать глобальные переменные,</b>

<b>  editor = document.getElementById(&quot;editor&quot;);</b>

<b>  statusline = document.getElementById(&quot;statusline&quot;);</b>

<b>  savebutton = document.getElementById(&quot;savebutton&quot;);</b>

<b>  editor.value = localStorage.note; // Восстановить сохраненную заметку</b>

<b>  editor.disabled = true; // Но запретить редактирование до синхр.</b>

<b>  // При вводе нового текста в элемент textarea</b>

<b>  editor.addEventListener(&quot;input&quot;,</b>

<b>                          function (e) {</b>

<b>                            // Сохранить новую заметку в localStorage</b>

<b>                            localStorage.note = editor.value;</b>

<b>                            localStorage.lastModified = Date.now();</b>

<b>                            // Переустановить таймер ожидания</b>

<b>                            if (idletimer) clearTimeout(idletimer);</b>

<b>                              idletimer = setTimeout(save, 5000);</b>

<b>                            // Разрешить кнопку сохранения</b>

<b>                            savebutton.disabled = false;</b>

<b>                          },</b>