JavaScript. Подробное руководство, 6-е издание, стр. 344
<b> <button onclick="sync()">Синхронизировать</button></b><b> <button onclick="applicationCache.update()">0бновить пpилoжeниe</button></b><b> </div></b><b> <textarea id="editor"></textarea></b><b> <div id="statusline"></div></b><b> </body></b><b></html></b>Наконец, в примере 20.7 приводится сценарий на языке JavaScript, который обеспечивает работу веб-приложения PermaNote. Он определяет функцию
<b>status()</b><b>save()</b><b>sync()</b><b>save()</b><b>sync()</b><b>save()</b>Помимо этих трех основных функций в примере 20.7 определяются также обработчики событий. Чтобы обеспечить синхронизацию локальной и серверной копий заметки, приложению требуется довольно много обработчиков событий:
<b>onload</b>Пытается загрузить заметку с сервера, если там хранится более новая ее версия, и по завершении синхронизации разрешает доступ к окну редактора. Функции
<b>save()</b><b>sync()</b><b>XMLHttpRequest</b><b>onbeforeunload</b>Сохраняет текущую версию заметки на сервере, если она еще не была выгружена.
<b>oninput</b>Всякий раз, когда текст в элементе
<b><textarea></b><b>localStorage</b><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 = "";</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("editor");</b><b> statusline = document.getElementById("statusline");</b><b> savebutton = document.getElementById("savebutton");</b><b> editor.value = localStorage.note; // Восстановить сохраненную заметку</b><b> editor.disabled = true; // Но запретить редактирование до синхр.</b><b> // При вводе нового текста в элемент textarea</b><b> editor.addEventListener("input",</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>