Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在窗口卸载时使用HTML5 Web SQL保存状态_Javascript_Sql_Html_Onunload - Fatal编程技术网

Javascript 在窗口卸载时使用HTML5 Web SQL保存状态

Javascript 在窗口卸载时使用HTML5 Web SQL保存状态,javascript,sql,html,onunload,Javascript,Sql,Html,Onunload,我正在使用WebSQLAPI在页面上存储一些信息;我希望在用户关闭页面或导航离开时保存页面的状态,因此,我从以下内容开始: window.onunload = function () { db.transaction(function (tx) { executeSql("INSERT INTO State (foo) VALUES (?)", [foo]); }); }; 但是,这是异步的,因此它不会在页面消失之前完成 我不满意地解决了这个问题,添加了一个(虚假的,因为它还没

我正在使用WebSQLAPI在页面上存储一些信息;我希望在用户关闭页面或导航离开时保存页面的状态,因此,我从以下内容开始:

window.onunload = function () {
  db.transaction(function (tx) {
    executeSql("INSERT INTO State (foo) VALUES (?)", [foo]);
  });
};
但是,这是异步的,因此它不会在页面消失之前完成

我不满意地解决了这个问题,添加了一个(虚假的,因为它还没有发生)
alert(“Saved!”)
在我的
窗口的末尾。onunload
,这会延迟卸载,直到DB有机会完成它的工作,但是如果我可以避免的话,我宁愿不要那个警报

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


(顺便说一句,为了避免任何关于我使用synchronous
openDatabaseSync
版本的建议,API只为Web工作人员而不是窗口对象指定和实现。)

您有权访问WebSocket吗

你能在一个套接字上监听吗?然后当卸载的时候,你可以同步地连接到那个监听套接字。当侦听器接收到连接时,它启动
插入
,并在查询完成后关闭连接

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

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

更新时间:太平洋时间7月19日晚上10:26
浏览器WebSocket是仅发送的,您无法打开套接字进行侦听。

我要向子孙后代指出,我遇到的另一个想法是打开带有超时的模式对话框,如下所示:

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

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

据说有一种方法可以使SQL调用同步

同步Web SQL是Web SQL规范草案的一部分。 但是,这一部分还没有在任何浏览器中实现。 规范草案没有任何进展,因为只有一个DB-SQLite


然而,appcelerator中的公平人士不知何故。如果我知道他们是怎么做的,那就该死了。如果您能找到答案,请更新此线程。

我自己的答案似乎是我能做的最好的答案。同步API不打算在浏览器中实现,而只针对web工作人员,因此不会发生这种情况。Tianium中的语法似乎与HTML5规范的语法不匹配,因此我怀疑他们已经完成了自己的SQL实现,而不是使用HTML5。或者这是我能想到的唯一解释。