代码之家  ›  专栏  ›  技术社区  ›  Morgan Cheng

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

  •  2
  • Morgan Cheng  · 技术社区  · 15 年前

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

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

    另一场胜利 ,参数存储在全局变量中。

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

    当其他函数试图引用 G_obj.id公司 ,它抛出异常“ 无法计算表达式 “。这在Windows7上的IE8.0.7600.16385中发生。

    在visual studio调试器中,当发生此异常时, GOOBJ 显示为

     {...}
    

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

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

    有办法解决这个问题吗?

    3 回复  |  直到 15 年前
        1
  •  4
  •   fmark    15 年前

    dom对象不会跨窗口持久化。但是,如果你能和 JSON representation ,那么我会 将对象转换为json ,发送它,然后解析json。

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

    • 一些现代浏览器(firefox>=3.5,internet explorer>=8.0)提供安全、快速的本机实现。
    • 一些javascript框架(例如 YUI 但是 not jquery )同样的功能。
    • 这个 reliable way 这样做是 使用道格拉斯·克罗克福德的 json2.js library 它是标准的、安全的、向后兼容的,如果存在浏览器的本机解析器,它将使用它。

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

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

    […]

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

    另一场胜利 :

    <script type=“text/javascript”src=“json2.js”></脚本>
    

    […]

    var g_obj;
    
    function bar(obj)
    {
       g_obj = obj;
       [...]
    }
    
    
    function json_bar(json_obj)
    {
        bar(JSON.parse(json_obj));
    }
    

    别忘了 minify json2.js -在保守的缩小,它只是一个3.5KB击中你的页面加载大小。

        2
  •  1
  •   lincolnk    15 年前

    这是单向操作,还是希望其他窗口中所做的更改反映在源窗口中?

    如果是单向的,我会将它转换成json字符串,发送过来,然后将其解析回一个对象。

    传递引用可能不可行。

        3
  •  1
  •   Abe Voelker    15 年前

    序列化对象,发送它,然后反序列化它。