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

<b>                          false);</b>

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

<b>  sync();</b>

<b>};</b>

<b>// Сохраняет заметку на сервере перед уходом со страницы </b>

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

<b>  if (localStorage.lastModified &gt; localStorage.lastSaved) save();</b>

<b>};</b>

<b>// Сообщить пользователю перед переходом в автономный режим</b>

<b>window.onoffline = function() { status(&quot;Автономный режим&quot;); }</b>

<b>// При подключении к сети выполнить синхронизацию,</b>

<b>window.ononline = function() { sync(); };</b>

<b>// Сообщить пользователю, если доступна новая версия приложения.</b>

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

<b>// метод location.reload()</b>

<b>window.applicationCache.onupdateready = function() {</b>

<b>  status(&quot;Доступна новая версия приложения. &quot; +</b>

<b>         &quot;Чтобы использовать ее, необходимо перезагрузить приложение ”);</b>

<b>};</b>

<b>// Также сообщить пользователю, если он использует последнюю версию приложения, </b>

<b>window.applicationCache.onnoupdate = function() {</b>

<b>  status(&quot;Bы используете последнюю версию приложения.&quot;);</b>

<b>};</b>

<b>// Функция отображения сообщения в строке состояния</b>

<b>function status(msg) { statusline.innerHTML = msg; }</b>

<b>// Выгружает текст заметки на сервер (если сеть подключена).</b>

<b>// Автоматически вызывается через 5 секунд простоя после изменения текста заметки,</b>

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

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

<b>  idletimer = null;</b>

<b>  if (navigator.onLine) {</b>

<b>    var xhr = new XMLHttpRequest();</b>

<b>    xhr.open(&quot;PUT&quot;, &quot;/note&quot;);</b>

<b>    xhr.send(editor.value);</b>

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

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

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

<b>    };</b>

<b>  }</b>

<b>}</b>

<b>// Проверяет наличие новой версии заметки на сервере. Если она отсутствует,</b>

<b>// сохраняет текущую версию на сервере.</b>

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

<b>  if (navigator.onLine) {</b>

<b>    var xhr = new XMLHttpRequest();</b>

<b>    xhr.open(&quot;GET&quot;, &quot;/note&quot;);</b>

<b>    xhr.send();</b>

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

<b>      var remoteModTime = 0;</b>

<b>      if (xhr.status == 200) {</b>

<b>        var remoteModTime = xhr.getResponseHeader(&quot;Last-Modified&quot;);</b>

<b>        remoteModTime = new Date(remoteModTime).getTime();</b>

<b>      }</b>

<b>      if (remoteModTime &gt; localStorage.lastModified) {</b>

<b>        status(&quot;Ha сервере найдена более новая заметка.&quot;);</b>

<b>        var useit =</b>

<b>          confirm(&quot;Ha сервере имеется более новая версия\n” + </b>

<b>                  &quot;заметки. Щелкните на кнопке Ok, чтобы\n&quot; + </b>

<b>                  &quot;использовать эту версию, или на кнопке\n&quot;+</b>

<b>                  &quot;Отмена, чтобы продолжить редактировать\n&quot;+</b>

<b>                  &quot;текущую версию и затереть версию на сервере &quot;);</b>

<b>        var now = Date.now();</b>

<b>        if (useit) {</b>

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

<b>          localStorage.lastSaved = now;</b>

<b>          status(&quot;Загружена более новая версия.&quot;);</b>

<b>        }</b>

<b>        else</b>

<b>          status(&quot;Игнорируется более новая версия заметки.&quot;);</b>

<b>        localStorage.lastModified = now;</b>