gpt4 book ai didi

javascript - 如何跨窗口安全地传递对对象的引用?

转载 作者:行者123 更新时间:2023-11-29 16:28:39 25 4
gpt4 key购买 nike

我正在调试一个网络应用程序。 Javasript 在一个窗口中创建一个对象并将其用作参数来调用另一个窗口中的全局方法。伪代码如下。

var obj = new Foo();
anotherWin.bar(obj);

anotherWin中,参数存储在全局变量中。

var g_obj;

function bar(obj)
{
g_obj = obj;
...
}

当其他函数尝试引用g_obj.Id时,会抛出异常“无法计算表达式”。 Windows 7 上的 IE8.0.7600.16385 中会发生这种情况。

在 Visual Studio 调试器中,当发生此异常时,g_obj 显示为

 {...}

看起来它的所有属性都丢失了。

也许根本原因是该对象是在一个窗口中创建的,但仅在另一个窗口中引用。该对象可能随时被垃圾收集。

有什么办法可以解决这个问题吗?

最佳答案

DOM 对象不会跨窗口持久化。但是,如果您可以忍受 JSON representation ,然后我将将您的对象转换为 JSON,发送它,然后解析 JSON。

有多种方法可以在 javascript 中对 JSON 进行编码和解码(提示:使用 eval() 是一场安全灾难)。

  • 一些现代浏览器(Firefox >= 3.5、Internet Explorer >= 8.0)提供安全、快速的 native 实现。
  • 某些 JavaScript 框架(例如 YUInot jquery )具有相同的功能。
  • reliable way 为此,使用 Douglas Crockford 的 json2.js library 它符合标准、安全、向后兼容,并且将使用浏览器的 native 解析器(如果存在)。

使用 Crockford 的库,您的示例将变为:

<script type="text/javascript" src="json2.js"></script>

[...]

var obj = new Foo();
anotherWin.json_bar(JSON.stringify(obj));

另一个Win中:

<script type="text/javascript" src="json2.js"></script>

[...]

var g_obj;

function bar(obj)
{
g_obj = obj;
[...]
}


function json_bar(json_obj)
{
bar(JSON.parse(json_obj));
}

别忘了minify json2.js - 通过保守的缩小,页面加载大小仅为 3.5KB。

关于javascript - 如何跨窗口安全地传递对对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2988040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com