Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当JSON2重载本机JSON对象时访问它_Javascript_Json_Dom_Cross Domain_Bookmarklet - Fatal编程技术网

Javascript 当JSON2重载本机JSON对象时访问它

Javascript 当JSON2重载本机JSON对象时访问它,javascript,json,dom,cross-domain,bookmarklet,Javascript,Json,Dom,Cross Domain,Bookmarklet,我正在实现一个bookmarklet,它通过JSON-RPC协议与iframe通信 然而,一些网站,如cnn.com,将JSON2加载到window.JSON中,尽管浏览器已经有了一个原生JSON对象 问题是,在iframe中,我不想遵循同样的错误做法,而且JSON2似乎与Mozilla Firefox和Chrome上的本机JSON不兼容: 因此,当我在本机JSON和JSON2上运行stringify时,会得到以下结果: JSON.stringify({key: "value"}) JSON2

我正在实现一个bookmarklet,它通过JSON-RPC协议与iframe通信

然而,一些网站,如cnn.com,将JSON2加载到
window.JSON
中,尽管浏览器已经有了一个原生JSON对象

问题是,在iframe中,我不想遵循同样的错误做法,而且JSON2似乎与Mozilla Firefox和Chrome上的本机JSON不兼容:

因此,当我在本机JSON和JSON2上运行stringify时,会得到以下结果:

JSON.stringify({key: "value"})
JSON2 本机JSON (密钥包装在
”中)


问题在于,当JSON2生成的字符串中缺少
并抛出错误时,本机JSON不喜欢它:

Mozilla Firefox:
SyntaxError:JSON.parse:应为属性名或“}”

Google Chrome:
语法错误:意外的令牌k

为了永远解决这个问题,我需要确保使用与解码字符串相同的JSON库对字符串进行编码

一种方法是确保两边都使用JSON2或JSON3,但我希望尽可能使用本机json库

现在像cnn.com这样的网站已经覆盖了原生JSON库,我如何才能回到它呢

我也许可以创建一个指向同一个域的iframe,并从它的
contentWindow
获取JSON对象,但这将是非常低效的


没有更好的办法吗?

不确定我是否正确理解了你的问题

如果像这样放置一个空的iframe

<iframe id="testFrame" name="testFrame" src="about:blank" style="display:none;"></iframe>
唯一的问题是,如果您在
https:
src中使用它,那么如果您需要支持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)
(函数($){
var-frm;
$.getNative=函数(对象名,回调){
如果(!frm){
frm=$(“”{
src:“javascript:false”,
样式:“显示:无
}).appendTo(“body”).load(函数(){
回调(this.contentWindow[objectName]);

//$(this).remove();到目前为止,最好的解决方案是使用iframe,但正如Crisim Il Numenoreano所指出的,它应该指向
about:blank
javascript:false
。到目前为止,这似乎效果不错:

function getNative(objectName, callback) {
    $("<iframe>", {
        src: "javascript:false",
        style: "display:none;"
    }).appendTo("body").load(function(){
        callback(this.contentWindow[objectName]);
        $(this).remove();
    });
}

//Use like this:

getNative("JSON", function(JSON) {
    console.log(JSON.stringify({key: "value"}));
});
函数getNative(objectName,回调){ $("", { src:“javascript:false”, 样式:“显示:无 }).appendTo(“body”).load(函数(){ 回调(this.contentWindow[objectName]); $(this.remove(); }); } //这样使用: getNative(“JSON”,函数(JSON){ log(JSON.stringify({key:value})); });

请注意,对于bookmarklets,jquery必须从可靠的来源获取,并在本地范围内进行保护。

请使用双引号准确地包装密钥…@Crisimilnumenorean这不是CNN安装的任何版本。提问者提到了这一技巧,但希望避免动态创建iframe。唉,我无法找到另一个解决方案,所以这可能是要采取的方法。@LukeDennis很抱歉,我帮不上忙:(Well没有意识到,
about:blank
javascript:false
会像跨域一样工作。因此这是一个改进,因为它不需要按我最初的意图点击
window.location.href
。+1Guys,也许你知道为什么返回值可以不定义这个问题的答案?我要求这是:
testFrame.JSON.stringify(obj);
(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)
function getNative(objectName, callback) {
    $("<iframe>", {
        src: "javascript:false",
        style: "display:none;"
    }).appendTo("body").load(function(){
        callback(this.contentWindow[objectName]);
        $(this).remove();
    });
}

//Use like this:

getNative("JSON", function(JSON) {
    console.log(JSON.stringify({key: "value"}));
});