navigator.onLine - PullRequest
       15

navigator.onLine

9 голосов
/ 24 февраля 2010

Я играю с неполным примером, найденным на http://www.w3.org/TR/offline-webapps/

Но я огорчен, увидев в нем комментарии вроде:

"renders the note somewhere", and
"report error", and
"// …"

Итак, кто-нибудь, пожалуйста, помогите мне написать действительный пример? Вот что у меня так далеко:

<!DOCTYPE HTML>
<html manifest="cache-manifest">
<head>
<script>
var db = openDatabase("notes", "", "The Example Notes App!", 1048576);

function renderNote(row) {
  // renders the note somewhere
}
function reportError(source, message) {
  // report error
}

function renderNotes() {
  db.transaction(function(tx) {
    tx.executeSql('CREATE TABLE IF NOT EXISTS Notes(title TEXT, body TEXT)',
      []);
    tx.executeSql(‘SELECT * FROM Notes’, [], function(tx, rs) {
      for(var i = 0; i < rs.rows.length; i++) {
        renderNote(rs.rows[i]);
      }
    });
  });
}

function insertNote(title, text) {
  db.transaction(function(tx) {
    tx.executeSql('INSERT INTO Notes VALUES(?, ?)', [ title, text ],
      function(tx, rs) {
        // …
      },
      function(tx, error) {
        reportError('sql', error.message);
      });
  });
}


</script>
<style>
label {
    display:block;
}
</style>
</head>
<body>
<form>
<label for="mytitle">Title:</label>
<input name="mytitle">
<label for="mytext">Text:</label>
<textarea name="mytext"></textarea>
<!-- There is no submit button because I want to save the info on every keystroke -->
</form>
</body>
</html>

Я также знаю, что я должен где-то включить это:

if (navigator.onLine) {
   // Send data using XMLHttpRequest
} else {
   // Queue data locally to send later
}

Но я не уверен, что даже я бы связал это тоже.

Ответы [ 2 ]

10 голосов
/ 08 марта 2010

Мне кажется, что вы ищете что-то вроде

function save() {
    if (navigator.onLine) {
       // Send data using XMLHttpRequest
    } else {
       // Queue data locally to send later
    }
}

<textarea name="mytext" onkeyup="save();"></textarea>

Однако используйте тайм-аут, как упомянул Робусто (который, я думаю, является также способом, которым GMail делает вещи).

Если вас беспокоит «примечание к чему-то» и т. Д., Эту часть вам нужно заполнить. Вам нужно будет заполнить ее, выбрав данные из базы данных, а затем заполнив их в элемент на вашей странице.

function renderNote(row) {
    $('notes').innerHtml = $('notes').innerHtml + row.body;
}

Это лучшее, что я могу понять из того, что в настоящее время написано в спецификации - заметьте, однако, что спецификация в настоящее время не завершена, и вы не сможете найти ее окончательную версию на сайте w3.

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

1 голос
/ 25 февраля 2010

если с помощью navigator.online вы можете синхронизировать свой локальный db с онлайн-хранилищем, вам, вероятно, не понадобится «else», поскольку вы уже храните локально. может быть, лучше вместо этого добавить списки событий (на объекте окна) для событий «офлайн» и «онлайн» и запускать (и отменять) синхронизацию с использованием этих событий.

посмотрите пример обработки состояния online / offline на этой странице hacks.mozilla.org и посмотрите эту статью на ajaxian о html5-реализации stickkotes webkit (которая не синхронизируется) хотя в сети)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...