我正在实现一个小书签,它通过 JSON-RPC 协议(protocol)与 iframe 进行通信。
然而,尽管浏览器已经具有 native JSON 对象,但某些网站(例如 cnn.com)将 JSON2 加载到 window.JSON
中。
问题是,在我的 iframe 中,我不想遵循同样的不良做法,而且 JSON2 似乎与 Mozilla Firefox 和 Chrome 上的 native JSON 不兼容:
因此,当我在 native JSON 和 JSON2 上运行 stringify 时,我得到以下结果:
JSON.stringify({key: "value"})
JSON2
{key:"value"}
原生 JSON
{"key":"value"}
( key 包含在 "
中)
问题在于,当 JSON2 生成的字符串中缺少 "
时,原生 JSON 会不喜欢它并引发错误:
Mozilla Firefox:SyntaxError:JSON.parse:预期的属性名称或“}”
Google Chrome:SyntaxError:意外的标记 k
为了彻底解决这个问题,我需要确保使用与解码字符串相同的 JSON 库来编码字符串。
一种方法是确保双方都使用 JSON2 或 JSON3,但我想尽可能使用 native json 库。
现在像 cnn.com 这样的网站已经覆盖了原生 JSON 库,我怎样才能恢复它?
我也许可以创建一个指向同一域的 iframe,并从其 contentWindow
获取 JSON 对象,但这效率非常低。
有没有更好的办法?
最佳答案
不确定我是否正确理解您的问题
如果你像这样放置一个空的 iframe
<iframe id="testFrame" name="testFrame" src="about:blank" style="display:none;"></iframe>
那么也可以从js调用
testFrame.JSON.stringify(obj);
唯一的问题是,如果你在 https:
中使用它,如果你需要支持 IE6,src 可能是 javascript:false
编辑:我仍然认为我不值得接受答案,所以我提出了代码的修改版本
(function($) {
var frm;
$.getNative = function(objectName, callback) {
if (!frm) {
frm= $("<iframe>", {
src: "javascript:false",
style: "display:none;"
}).appendTo("body").load(function(){
callback(this.contentWindow[objectName]);
// $(this).remove(); <-- this is commented to cache the iframe
});
}
callback(frm[0].contentWindow[objectName]);
}
})(jQuery)
这将使您能够在文档中多次使用 $.getNative()
而无需每次都重新创建框架。
关于javascript - 当 JSON2 重载时访问 native JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12866225/