【问题标题】:Store an Object in client-side and use in new tabs将对象存储在客户端并在新选项卡中使用
【发布时间】:2018-06-07 07:40:57
【问题描述】:

我目前正在处理一个页面,我将在客户端存储一个对象

并在其他选项卡中使用它。(键/值本地存储无法处理)

比如Local Storage、Session Storage等都是key/value存储

并且不支持对象。

我的对象由许多对象、函数...

对象是:

【问题讨论】:

  • 1> 在新窗口中通过postMessage 传递它 2> 直接将父窗口中的对象设置为新窗口引用(需要父子关系,在用户打开的全新选项卡中不起作用)
  • @Koushik Chatterjee。目前,我正在使用 AcrossTabs 模块,它使用 postMessage 广播消息。父子关系可能没有设置,但是我需要公共存储之类的东西。
  • 然后,也尝试对函数进行字符串化,然后将其存储
  • @Koushik Chatterjee。问题是 proto 有很多子对象,我无法对它们进行字符串化。
  • stackoverflow.com/questions/3685703/… 这可能会有所帮助

标签: javascript browser local-storage client-side indexeddb


【解决方案1】:

函数对象不可序列化或结构化克隆。为了从一个选项卡传递到另一个选项卡,对象必须是可序列化和可反序列化的。从本质上讲,这意味着对象的属性必须能够转换为可传输的格式并返回到对象中。

有一些简单的方法可以解决您的问题。这是一个。在可序列化对象中捕获不可序列化对象的所有重要属性。然后传递可序列化的对象。然后反序列化。

// file.js (include this on both tabs)
function MyObject() {
  this.foo;
  this.bar;
}
MyObject.prototype.asdf = function(){};

假设上面是您想要从一个选项卡转移到另一个选项卡的对象,但不能,因为它是一个函数对象。首先,创建一些辅助函数。

 // Create and return a serialized state
 MyObject.prototype.serialize = function() {
   // Create a simple object of only important state properties
   var simpleObject = {};
   simpleObject.foo = this.foo;
   simpleObject.bar = this.bar;
   return simpleObject;
 };

 // Assign property values to this object from simple object
 MyObject.prototype.deserialize = function(simpleObject) {
   this.foo = simpleObject.foo;
   this.bar = simpleObject.bar;
 };

现在,在发送消息时使用这些助手。我将在这里使用一些伪代码。

 // Send the object from one tab to others
 function sendMessageHelper() {
   // We don't actually send the object, we send its serial form
   var myObject = new MyObject();
   var transferable = myObject.serialize();
   window.postMessage(transferable);
 }

 // Get the object from the message
 function onMessageHandler(message) {
   var data = message.data;

   // Recreate the state of the object by deserializing
   var myObject = new MyObject();
   myObject.deserialize(data);
 }

最后,确保在两个页面(两个选项卡)中都包含定义对象的 js 文件。

【讨论】:

  • 这个答案很有帮助,但正如我在问题 cmets 中提到的,父窗口和子窗口之间的关系并不确定。如果关系确定,那么我们可以使用 postMessage 发送对象,而无需序列化。对不起,这个评论太晚了。
【解决方案2】:

您可以将函数存储在 JSON 对象中。 请遵循这个。

在页面上设置 cookie

function setCookie(cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
var expires = "expires="+d.toUTCString();
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i = 0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0) == ' ') {
        c = c.substring(1);
    }
    if (c.indexOf(name) == 0) {
        return c.substring(name.length, c.length);
    }
}
return "";
}
 var JSONOBJ={};
 var yourfunction=function(){ console.log("hi i am function") }
 JSONOBJ["customFunction"]="var customFunction="+yourfunction;
 setCookie("CookieWithfunction",JSON.stringify(JSONOBJ),5);

在另一个页面上获取 cookie

var MyJSONOBJ=JSON.parse(getCookie("Myobj"))
eval(MyJSONOBJ.customFunction);

 //Call that function 
customFunction();

希望对你有帮助

【讨论】:

  • 我可以在某个地方存储一个对象并在另一个选项卡中使用吗?(没有序列化?)。对不起,这个评论太晚了。
  • 我当天给出了答案,怎么这么晚了?
  • 关于我的评论,而不是你的回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多