gpt4 book ai didi

javascript - 跨窗口Javascript : is there a right way?

转载 作者:数据小太阳 更新时间:2023-10-29 04:18:41 26 4
gpt4 key购买 nike

问题

我正在尝试制作一种方法,将对象传递给弹出窗口中的类似方法。我无法控制目标方法中的代码或传入的对象。目标方法当前序列化对象,尽可能使用 JSON.stringifyinstanceof Array.

第一个问题是 IE8 中的错误(见下文)。第二个,也是更基本的,是原语在不同的窗口中是不一样的:

w = open("http://google.com")
w.Array == Array // returns false

在弹出窗口上覆盖任何可能传入的类,然后在调用有效后恢复它们,但这确实很脆弱并且维护起来很头疼。

将对象序列化为 JSON,然后在窗口的上下文中解析它会遇到下面的 Firefox 错误。

我也有点厌恶使用 new w.Object 等方式对对象进行深拷贝或解析 JSON,因为它不应该那么复杂。

任何人都可以建议一个明智的方法来处理这个问题,还是我应该接受对象不能在窗口之间逐字传递?


IE 漏洞

JSON.stringify 在 IE8 中不能跨窗口工作。如果我将一个对象传递给尝试序列化它的弹出窗口,则 stringify 返回 undefined。要查看此问题,请在 IE8 中打开脚本控制台并尝试:

w = open("http://google.com")
JSON.stringify(Object()) // returns "{}"
w.JSON.stringify(w.Object()) // returns "{}"

w.JSON.stringify(Object()) // returns "undefined" on IE8
JSON.stringify(w.Object()) // returns "undefined" on IE8
JSON.stringify([1, w.Object()]) // returns "[1,null]" on IE8

我尝试通过设置 w.JSON = JSON 来解决这个问题,但正如上次测试所示,当您同时拥有来自两个窗口的对象时,这会中断。

Firefox 漏洞

在Firefox中调用w.Object()创建对象似乎调用了window.Object()。调用 w.JSON.parsew.eval 时会遇到同样的错误。要查看此内容,请打开 Firebug 的控制台并尝试:

w = open("http://google.com")
new w.Object instanceof w.Object // returns true

w.Object() instanceof w.Object // returns false on Firefox 3.5
w.Object() instanceof Object // returns true on Firefox 3.5
w.Object.call(w) instanceof Object // returns true on Firefox 3.5
w.JSON.parse("{}") instanceof w.Object // returns false on Firefox 3.5
w.JSON.parse("{}") instanceof Object // returns true on Firefox 3.5
w.eval("[]") instanceof w.Array // returns false on Firefox 3.5
w.eval("[]") instanceof Array // returns true on Firefox 3.5
w.eval.call(w, "[]") instanceof Array // returns true on Firefox 3.5

我能看到的唯一解决方法是自己解析 JSON 字符串。

最佳答案

为了它的值(value),这就是我现在正在做的:

  • 确保在弹出窗口中加载了 jquery-json
  • 字符串化对象
  • 调用w.$.evalJSON(str),正确绑定(bind)原语
  • 将该结果传递给弹出窗口中的方法

或者(如果 jquery-json 不可用),您可以将以下脚本注入(inject)目标:

<script type="text/javascript">
function parseJSON(j) {
return JSON.parse(j)
}
</script>

因为这将捕获弹出窗口的 JSON,而不是调用者的。

如果有更好的解决方案,我们将不胜感激。

关于javascript - 跨窗口Javascript : is there a right way?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2105714/

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