0

我正在使用 Web SQL API 在页面上存储一些信息;当用户关闭页面或导航离开时,我想保存页面的状态,因此,我开始:

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

但是,这是异步的,因此在页面消失之前它不会完成。

alert("Saved!");我通过在 my 的末尾添加一个(不诚实,因为它还没有发生)来解决这个不令人满意的问题window.onunload,这会延迟卸载直到数据库有机会做它的事情,但我宁愿没有那个警报如果我可以避免。

有任何想法吗?我需要onunload暂时阻止调用该函数的线程,这就是警报的作用。

(顺便说一句,为了阻止我使用同步版本的任何建议openDatabaseSync,该 API 仅针对 Web Worker 指定和实现,而不是针对 Window 对象。)

4

3 回答 3

1

您可以访问 WebSockets 吗?

您能否在套接字上进行监听,然后在卸载时同步连接到该监听套接字。当侦听器接收到连接时,它会启动insert并在查询完成后关闭连接。

这是我唯一能想到的,我不确定这些接口是否支持这种用法。我通过思考如果我有一个服务器我将如何做到这一点来解决这个问题:我将使用与服务器的同步网络连接来写入状态。

此外,我不确定卸载事件是否可以被阻止一段不确定的时间,但一些谷歌搜索“卸载同步 ajax”表明它可能是。

更新 7/19 晚上 10:26 PDT

浏览器 WebSockets 是只发送的,你不能打开一个套接字来监听。

于 2010-07-20T05:11:04.680 回答
0

我只想为后人提一下,我遇到的另一个想法是打开一个带有超时的模态对话框,如下所示:

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

但这也许不是完全跨平台的。并且对话窗口在某些浏览器中是可见的(至少是 Safari)。

于 2010-07-20T18:52:35.943 回答
0

据报道,有一种方法可以使 SQL 调用同步。

同步 Web SQL 是 Web SQL 规范草案的一部分。然而,这部分是尚未在任何浏览器中实现的部分。并且规范草案不会去任何地方,因为只有一个 DB - SQLite。

然而,appcelerator 中的公平人士以某种方式做到了这一点。该死的,如果我知道他们是怎么做到的。如果你能弄清楚,请更新这个线程。

于 2010-08-09T05:22:09.103 回答