JavaScript 对象和通过对话框持久化

标签 javascript json dom

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

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

在模态对话框中:

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

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

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

很明显,我没有完全理解 DOM 的概念。你介意启发我可怜的大脑吗?

最佳答案

正如 Jon 正确指出的那样,更多的细节和代码将有助于理解您的情况。

根据你的症状,虽然我猜你有一个 dialog.html 页面,其中的脚本试图“makeItem”,并且每次你“打开对话框”。

一点理论

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

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

当您打开同一个页面两次(同时——在并排的两个选项卡中——或者在打开第二个副本之前关闭第一个页面),每个副本都有自己的全局对象,完全独立的代码和对象。

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

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

引用另一个窗口

问题的正确解决方案取决于您要实现的目标。

如果您需要从打开页面到打开的对话框并返回,您可以保存来自 window.open() 调用的引用:

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

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

因此,您可以通过将以下内容放入对话框的 <script> 来在开启器的上下文中创建 item:

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

...并且它会与起始页一样长。

真正的坚持

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

关于JavaScript 对象和通过对话框持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2225029/

相关文章:

javascript - 将元素添加到带有动画的转发器

php - 访问数组中的类实例

php - 从外部 url 获取 div 内容 - 最佳方法 - PHP? DOM?查询?

javascript - 如何找出哪个父级包含属性?

javascript - AngularJS - 这是编写指令的正确方法吗?

javascript - jquery-nice-select 与 vue.js 不是一个函数

javascript - 切换/取消切换字体大小 document.execCommand

javascript - Angular material2动态生成列

javascript - 谷歌云存储 Javascript 使用

dom - Durandal:手动从 DOM 中删除 View