Сохранить состояние с помощью HTML5 Web SQL при выгрузке окна - PullRequest
0 голосов
/ 20 июля 2010

Я использую Web SQL API для хранения некоторой информации на странице; Я хотел бы сохранить состояние страницы, когда пользователь закрывает страницу или уходит, поэтому я начинаю с:

window.onunload = function () {
  db.transaction(function (tx) {
    executeSql("INSERT INTO State (foo) VALUES (?)", [foo]);
  });
};

Однако это асинхронный процесс, поэтому он не завершается до того, как страница исчезнет.

Я решаю это неудовлетворительно, добавляя (неискреннее, поскольку это еще не произошло) alert("Saved!"); в конце моего window.onunload, что задерживает выгрузку до тех пор, пока у БД не появится шанс сделать свое дело, но я Я бы предпочел не иметь этого предупреждения, если бы я мог избежать этого.

Есть идеи? Мне нужно на время заблокировать поток, вызывающий функцию onunload, что и делает оповещение.

(Кстати, чтобы исключить любые предположения о том, что я использую синхронную версию openDatabaseSync, этот API предназначен и реализован только для веб-работников, а не для объекта Window.)

Ответы [ 3 ]

1 голос
/ 20 июля 2010

У вас есть доступ к WebSockets?

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

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

Кроме того, я не уверен, что событие unload может быть заблокировано на неопределенный промежуток времени, но некоторые поиски в Google для «unload синхронного ajax» предполагают, что это может быть.

Обновление 7/19 22:26 PDT

Браузерные веб-сокеты только для отправки, вы не можете открыть сокет для прослушивания.

0 голосов
/ 09 августа 2010

Сообщается, что существует способ сделать синхронные вызовы SQL.

Синхронный веб-SQL является частью проекта спецификации веб-SQL.Однако эта часть еще не реализована ни в одном браузере.И черновик спецификации никуда не денется, потому что есть только одна БД - SQLite.

Однако честные люди в appcelerator как-то сделали свое дело .Блин, если я знаю, как они это сделали, хотя.Если вы можете понять это, пожалуйста, обновите эту тему.

0 голосов
/ 20 июля 2010

Я просто упомяну для потомков, что еще одна идея, с которой я столкнулся, - это открыть модальное диалоговое окно с таймаутом, как это:

window.showModalDialog('javascript:document.writeln ("<script>window.setTimeout(function () { window.close(); }, 100);</script>")');

Но, возможно, это не совсем кроссплатформенность. И диалоговое окно видно в некоторых браузерах (по крайней мере, Safari).

...