在另一个窗口中使用localstorage检查

时间:2014-08-18 17:52:37

标签: javascript html backbone.js hash local-storage

我正在尝试制作基本的网络应用程序。当您找到某些链接或网址时,它基本上是一个随着时间推移出现的谜题。

这个谜题有8个,当你访问某个哈希时它们会出现。哈希是使用backbone.js设置的,它们每个都会触发一个显示与之对应的部分的函数。

哈希是这样的 - " index.html#hide / one"," index.html#hide / two",最多" index.html#hide / 8"

每次触发哈希时,它都会使用JavaScript函数显示一个片段,该函数只是向该元素添加一个类。很容易,对吧?

问题是,哈希在不同的窗口中打开。主窗口只是" index.html#hide"。所以我需要为每个部分创建一个localstorage值,不断在主页面上检查它,如果它被设置为" yes",则执行一个函数。

这可能吗?如果是这样,我怎么能去做呢?

提前致谢,

-Mitchyl

编辑 - 这是源代码,如果有人感兴趣的话。我不太确定什么是相关的,什么不相关,所以这里的代码完整无缺。 http://pastebin.com/Q4hpJtQ8

1 个答案:

答案 0 :(得分:0)

不是从主窗口轮询LocalStorage,而是在窗口之间使用某种直接通信可能更好。

如果所有窗口都是相同的源(相同的协议,域和端口),并且一个窗口打开其他窗口,那么只要保存窗口句柄,就可以直接从一个窗口调用JS函数。对于主窗口打开的窗口,主窗口将位于window.opener中,因此您可以在主窗口中调用全局定义的函数,如:

window.opener.updatePuzzle(data);

您还可以使用window.postMessage()在窗口之间交换数据,这些数据似乎(在表面上)更清洁,并且不限于同一来源(因为它需要两个合作窗口),但是IE11之前IE中的postMessage()限制仍然难以依赖(感谢IE)。


如果您的主窗口没有以任何方式打开其他窗口(例如,用户只是键入了其他URL),那么您的窗口无法在浏览器中直接相互通信。在这种情况下,他们要么必须通过服务器交换数据,要么通过LocalStorage轮询数据。

这是一个关于LocalStorage的非常好的教程:http://www.sitepoint.com/an-overview-of-the-web-storage-api/

从一个窗口:

 localStorage.setItem("hash4", true);

从另一个窗口:

 setInterval(function() {
     var maxHash = 5;
     for (var i = 0; i < maxHash; i++) {
         var val = localStorage.getItem("hash" + i)
         if (val) {
             // hash value i was found to be true
         }
     }
 }, 1000);

听起来你在移动设备上做这件事,你应该知道,由于一系列原因,在移动设备上持续进行轮询并不理想。首先,当它被允许运行时,它是一个电池耗尽。第二,移动设备可能不会让它连续运行(因为它试图节省电池)。


您可能对存储方式更加复杂,而不是使用N个单独的键,您可以将JSON存储在一个键中,该键表示包含一个LocalStorage键中所有值的对象。