2

JSON-RPC プロトコルを介して iframe と通信するブックマークレットを実装しています。

window.JSONただし、cnn.com などの一部のサイトでは、ブラウザーに既にネイティブ JSON オブジェクトがあるにもかかわらず、JSON2 が読み込まれます。

問題は、iframe 内で同じ悪い慣行に従いたくないということです。JSON2 は、Mozilla Firefox および Chrome のネイティブ JSON と互換性がないようです。

したがって、ネイティブ JSON と JSON2 で stringify を実行すると、次の結果が得られます。

JSON.stringify({key: "value"})

JSON2

{key:"value"}

ネイティブ JSON

{"key":"value"}

(鍵は で囲みます")


"問題は、JSON2 で生成された文字列に がなく、エラーがスローされると、ネイティブ JSON がそれを好まないことです。

モジラ ファイアフォックス:SyntaxError: JSON.parse: expected property name or '}'

グーグルクローム:SyntaxError: Unexpected token k

この問題を完全に解決するには、文字列をデコードする場合と同じ JSON ライブラリを使用して文字列をエンコードする必要があります。

その方法の 1 つは、必ず JSON2 または JSON3 を両側で使用することですが、可能であればネイティブの json ライブラリを使用したいと考えています。

cnn.com のようなサイトがネイティブの JSON ライブラリをオーバーライドした今、どうすればそれに戻ることができるでしょうか?

おそらく、同じドメインを指す iframe を作成し、その から JSON オブジェクトをフェッチすることもできますcontentWindowが、それは非常に非効率的です。

より良い方法はありませんか?

4

2 に答える 2

2

あなたの問題を正しく理解しているかどうかわからない

このように空のiframeを配置すると

<iframe id="testFrame" name="testFrame" src="about:blank" style="display:none;"></iframe>

その後、jsから呼び出すこともできます

testFrame.JSON.stringify(obj);

唯一の問題は、https:srcで使用するjavascript:false場合、IE6 をサポートする必要があるかどうかです。

編集:私はまだ答えが受け入れられるに値しないと思うので、あなたのコードの修正版を思いついた

(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()、毎回フレームを再作成することなく、ドキュメントで複数回使用できます。

于 2012-10-12T21:07:41.963 に答える
0

これまでのところ、最善の解決策は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"}));
});

ブックマークレットの場合、jqueryは信頼できるソースからフェッチし、ローカルスコープ内でも保護する必要があることに注意してください。

于 2012-10-12T22:21:00.723 に答える