JavaScript对象和通过对话框的持久性

时间:2010-02-08 21:35:42

标签: javascript json dom javascript-events

这里的问题相当简单。我想创建一个具有属性的JS对象,比如name。我想创建该对象,并能够在整个页面中使用它。例如,我现在所做的不起作用:

var item = new Object();
function makeItem(title) { 
   item.name = title;
}

在模态对话框中:

makeItem("test");
alert(item.name); // returns "test"

然而,关闭对话框后,与item相关的所有信息都消失了。例如,我无法继续查看item.name下次尝试创建相同对话框时是否包含任何内容。

document.ready()中目前没有任何内容。

显然,我并没有完全理解DOM的想法。 S | O,你介意启发我可怜的大脑吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

正如乔恩所说,更多细节和代码有助于了解你的情况。

从你的症状虽然我猜你有一个dialog.html页面,脚本试图“makeItem”,每当你打开一个框架甚至单独的浏览器窗口/标签时,这个dialog.html被加载对话”。

一个小理论

在浏览器中,所有JavaScript对象和代码都“属于”其中一个打开的“页面”。页面可以作为浏览器选项卡或单独窗口中的顶级页面打开,也可以在框架中打开(在这种情况下,它似乎是其父页面的一部分,但其JS仍然与父页面分离)。 / p>

每个打开的页面都有自己的“全局对象”,通常称为window。您在< script>中在顶层定义的全局函数和变量作为此全局对象的属性附加。

当你打开同一页两次(同时 - 在两个标签中并排打开 - 或在打开第二个副本之前关闭第一个)时,每个副本都有自己的全局对象,完全独立的代码和对象。

通常,当页面关闭时,该页面的全局对象及其所有属性(包括任何对象和函数)都将被销毁。

这就是为什么当您关闭并重新打开对话框时,示例中的item会丢失其属性(假设我的初始猜测是正确的)。

引用另一个窗口

正确解决问题取决于你想要达到的目标。

如果您需要从开启者页面与打开的对话框进行通信并返回,您可以保存window.open()电话的参考:

var w = window.open(...dialog URL...);

加载对话框后,w将指向对话框的全局对象,您将能够戳它。同样,在对话框中,您可以通过window.opener访问打开对话框的页面的全局对象。

因此,您可以在开启者的上下文中创建item,方法是在对话框的< script>中添加以下内容:

opener.item = {title: "test"};

...它会和开启者页面一样长。

真正的持久性

如果您需要真正的持久性(例如,跨浏览器重启),您最近的唯一选择是cookie或服务器端存储。在现代浏览器中,您可以使用Web存储(localStoragesessionStorage对象)。