javascript - 当 JSON2 重载时访问 native JSON 对象

标签 javascript json dom cross-domain bookmarklet

我正在实现一个小书签,它通过 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/

相关文章:

javascript - 无法让 Javascript UI 看门狗功能正常工作

javascript - Flask 在不同项目运行时加载相同的 index.js 文件

javascript - 在 JSON 中查找多次出现的特定值

php - Javascript位置重新加载而不获取周界

java - 从groovy中的JSON数组中提取特定数据

javascript - Jquery 获取 .each 循环内 slider 的值

python - 将 pandas 数据框导出到 json 并返回到具有相同顺序列的数据框

javascript - 使用 JQuery.MSDropDown 更新 selectedIndex 选项菜单