我正在尝试制作基本的网络应用程序。当您找到某些链接或网址时,它基本上是一个随着时间推移出现的谜题。
这个谜题有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
答案 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键中所有值的对象。