2011-06-18 170 views
2

我写了一个简单的JS脚本来创建一个只允许一个实例初始化的对象。如果该对象已经inizialized它返回不再重新创建它。如何在两个页面之间共享对象?

这是我的:myobj.js

var Singleton = { 

    initialized : null, 

    init: function(){ 

    console.log("new obj..."); 

    this.initialized = { 
     'status' : 'initialized' 
    } 

    }, 

    getInstance : function(){ 

    if (!this.initialized) this.init(); 

    return this.initialized; 

    } 

} 

然后,我有创建的test.html页面来测试这个脚本:

<script src="myobj.js"></script> 

<script> 
var uno = Singleton.getInstance(); 
var due = Singleton.getInstance(); 

(uno===due) ? console.log("equals") : console.log("not equals"); 
</script> 

所有的作品好,只创建一个对象。

我的问题是:我可以在更多的HTML页面之间共享这个对象“Singleton”吗?

没有重新创建它在不同的页面?

如果我有(例如)在浏览器上打开100个选项卡,我想使用同一个对象而不具有相同的100个对象。

谢谢!

+0

我不这么认为,因为浏览器中的每个页面都有自己的“沙盒”,并且无法访问客户端的任何信息以显示其自己的信息。 唯一的可能性是通过序列化您的singelton并将其放入cookie中并在每个页面上加载反序列化它或:在服务器端管理您的单例并通过ajax或某事与服务器通信。其他。 – thomas

+0

@ thomas,我必须把一些函数,当服务器有一些数据(彗星通信)时会被调用...所以这个对象将有功能和连接。我不想从每一个页面连接到服务器......是否有可能将序列化的对象存储在服务器上,然后用ajax调用它,然后反序列化? – dail

+0

序列化/反序列化意味着与显式创建单独副本完全相同 - 当您反序列化一个对象的序列化形式时,您将获得对象的**副本**。因此,这不会导致您在多个页面之间共享一个对象。 – Pointy

回答

-1

不,这是不可能的。您无法在页面重新加载之间保留对象,也无法在不同的浏览器选项卡之间共享对象。使用Cookie,您可以通过这种方式存储一些简单的数据,但仅此而已。

2

现在可能没有办法做到这一点,但不要完全放弃希望;可能有办法很快做到这一点。想要在页面之间共享JS对象有几个很好的理由,但其中一个我想过的是在许多Web工作者之间共享大型的页面。

下面是从伯克利大学这个题目的两篇论文,从2010年,所以你可以看到你不是谁想要它的唯一一个...

伯克利/谷歌:Object Views: Fine-Grained Sharing in Browsers

伯克利/微软:Secure Cooperative Sharing of JavaScript, Browser, and Physical Resources

+0

此外,您可以使用'window.name' [在客户端多个页面之间共享变量](http ://stackoverflow.com/a/1981681/975097)。这被称为“JavaScript会话”。 (但是,我认为还没有可能在已经打开的多个标签之间共享对象。) –

2

恐怕没有用户安装任何东西,在编写本文的时候,在所有浏览器中都是不可能的。两级部分的解决方案:

1)使用浏览器扩展存储状态

浏览器扩展可以通过主机浏览器的API页面沟通和保持共享状态。但是,用户必须安装它们。

2)使用localStorage的

这是在同一个域的页面,但只存储字符串之间共享。您可以使用JSON.stringify将对象转换为字符串并将其放置在localStorage上。 http://diveintohtml5.info/storage.html

相关问题