Javascript 如何在同一时间或下次访问时使用www.为同一域创建本地存储?
我已经创建了一个JS文件,我把它放在一些网页上,而不是我的网页上。 所以我的是domain-1.com,我把它放在domain-2.com和domain-3.com上 这个JS包含jsonp,我成功地将他们页面中的一些数据保存到了我的数据库中。另外,我创建了一些cookie,并将一个值保存到localstorage。问题是,当访问者访问domain-2.com,明天访问www.domain-2.com时,他们会有不同的价值,因为操作系统会访问www.domain-2.com 我希望这个值在整个www上是相同的,或者不是,也许同时,我不知道一个适用的想法。对于我来说,最好同时传递www.的值,而不传递www 如何做到这一点?Javascript 如何在同一时间或下次访问时使用www.为同一域创建本地存储?,javascript,Javascript,我已经创建了一个JS文件,我把它放在一些网页上,而不是我的网页上。 所以我的是domain-1.com,我把它放在domain-2.com和domain-3.com上 这个JS包含jsonp,我成功地将他们页面中的一些数据保存到了我的数据库中。另外,我创建了一些cookie,并将一个值保存到localstorage。问题是,当访问者访问domain-2.com,明天访问www.domain-2.com时,他们会有不同的价值,因为操作系统会访问www.domain-2.com 我希望这个值在整个w
我只为他们提供一个JS外部链接。如果我也放置一个iframe也可以。最好的解决方案是设置一个重定向到任意一个域,这样您就可以完全避免这个问题 以下代码显示了将值发送到非www域仅用于存储的概念。如果您也需要从www域读取这些值,或者希望有一个库为您执行所有操作,您应该使用最后列出的库之一。这些库使用相同的概念,但可以为您处理大多数事情
您只能在一个域中存储值,如果您在www域中,则可以使用跨源通信发送值。创建加载非www域脚本的
iframe
。在此脚本中,您将值保存在该域的本地存储中
以下是iframe的内容,其中包含一些最小的html5标记,在本例中保存为storage.html
,并从example.com
提供服务
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title> </title>
<script>
window.addEventListener("message", storeItem, false);
function storeItem(event) {
if (!(event.origin == "http://example.com" || event.origin == "http://www.example.com")) {
return;
}
localStorage.setItem(event.data.key, event.data.value);
}
</script>
</head></html>
确保将example.com
域替换为实际域。因此其他网站无法向您发送消息
<iframe id="storageScriptFrame"></iframe>
<script>
var target = "http://example.com";
var storageScriptFrame = document.getElementById("storageScriptFrame");
var storageScriptWindow = storageScriptFrame.contentWindow;
function storeItem(key, value) {
var message = {key: key, value: value};
storageScriptWindow.postMessage(message, target);
}
// you can store values after the iframe has loaded
storageScriptFrame.onload = function() {
storeItem("foo", "bar");
};
// replace this with actual page
storageScriptFrame.src = 'http://example.com/storage.html';
</script>
在某些时候,您还需要读取这些存储的值。根据对存储值的处理,您有两个选项
- 如果不需要与主窗口交互,可以将读取值的脚本移动到iframe中
- 如果确实需要在主窗口上获取值,请再次使用
将值发送回李>postMessage
postMessage
是异步的,并且只以一种方式工作。我建议使用现有的库来实现这一点(您不需要上面的代码)
- 看起来很好,使用方便
- 是否有另一个库用于此任务
例如,如果您跨域本地存储,您只需遵循
initCallback
函数,您可以调用xdLocalStorage.getItem
和xdLocalStorage.setItem
从example.com
的本地存储中获取和设置项目,您为什么不创建一个iframe?:)这个有用的库帮助我解决了创建跨站点本地存储数据的问题。感谢您提供的逻辑,但我不知道如何实现这一点,请让我知道我将每个代码块放在哪里,以及将localStorage['abc']='value'
放在哪里请为我提供完整的代码,即使是iframe,也要有+300的价值it@Xalloumokkelos我已经添加了完整的代码。现在,在查找现有的解决方案之后,我发现一些库似乎可以做同样的事情,甚至更多。这两个库似乎都有使用它们的简单说明。您好,我刚刚测试了您的代码。我注意到,当我访问www.domain.com
时,它会为www.domain.com
和domain.com
上显示的domain.com
创建一个本地存储。当我访问domain.com
时,它不会创建任何内容。。。因此,因为我在www上读取了该值。它不显示任何内容,但当我访问domain.com
(不带www)时会显示该值。如何修复此问题?抱歉,我忘记将example.com
添加到源代码检查中,以便允许来自两个域的邮件。这应该可以解决这个问题,尽管我不确定你所说的“它为www.domain.com和domain.com上显示的domain.com创建本地存储”是什么意思。如果“show”的意思是“从localstorage读取值”,那就不可能了。访问任何域应仅保存到domain.com
的本地存储。该存储只能从domain.com
读取(这意味着它可以从iframe读取)。从www.domain.com
读取更复杂的代码或其中一个库是可能的。
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title> </title>
<script>
window.addEventListener("message", storeItem, false);
function storeItem(event) {
if (!(event.origin == "http://example.com" || event.origin == "http://www.example.com")) {
return;
}
localStorage.setItem(event.data.key, event.data.value);
}
</script>
</head></html>