这里是一个相当简单的问题。我想创建一个 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 存储(localStorage
、sessionStorage
对象)。
关于JavaScript 对象和通过对话框持久化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2225029/