49

概要と元の質問

window.nameは興味深い獣です。MDN の説明は、元の意図を示唆しています。

ウィンドウの名前は、主にハイパーリンクとフォームのターゲットを設定するために使用されます。Windows に名前を付ける必要はありません。

したがって、これは、このウィンドウでコンソールを開いて、次のように記述できることを意味します。

var win = window.open('http://google.com', 'el goog');

...そして、ポップアップ ブロッカーを通過させると、「el goog」という名前のウィンドウで google.com が開きます。name同一生成元ポリシーのため、 のプロパティにアクセスできませんwinが、新しいウィンドウでコンソールを開いて と入力するとname、 が表示されます"el goog"

ウィンドウを開いたドメイン (この場合は stackoverflow.com) に戻すと、nameプロパティを取得できますが、変更されていません。

win.location.replace(location.href);
win.name; // "el goog"

nameこれは、ウィンドウのプロパティを設定することで、一種のクロスドメイン セッション ストアを使用できることを意味します。

ウィンドウが元のドメインに戻される前にgoogle.com がの値を変更window.nameした場合、「el goog」ではなく新しい値が表示されます。これは、JSONP や CORS と同様に、クロスドメイン データ トランスポートとして使用できます。

より多くの情報を見つけるために少し検索を行ったところ、どうやら道場はそれが輸送手段として合法であると考えているようです。どういうわけか、それは私を完全に安心させるものではありません。私の質問は、評判の良いサイトwindow.nameでデータ トランスポートを使用しているものはありますか? ドキュメントには「JSONPのクエリ文字列に「コールバック」を追加するか、window.nameに「何でも」を追加する」などと書かれているため、簡単に見つけられると思いますが、そのようなものは見たことがありません。誰かが実際に野生でこれを見つけましたか?


別の質問

誰もこの手法を実際に使用していない可能性があります。それが本当なら (Rob W が指摘したように) 上記の質問には答えられません。では、別の質問として、このアプローチの問題点は何ですか? これは、実際に採用されなかった理由を説明するのに役立つかもしれません。

私が見ているように、JSONP よりもこのアプローチには少なくとも 2 つの利点があります。

  • JSONP を使用すると、外部のオリジンからのスクリプトがドメインで実行されることを信頼できます。ではwindow.name、悪意のあるサイトに含まれるすべてのスクリプトが独自のドメインで実行されます。

  • JSONP では、大きなデータ (URL には大きすぎるもの) を渡す方法はなく、HTTP POST を作成する方法もありません。を使用window.nameすると、任意のサイズの任意のデータを投稿できます。

欠点は何ですか?


実装例

クライアント実装の非常に単純な例を次に示します。これは POST リクエストを処理せず、GET のみを処理します。

function fetchData(url, callback) {
    var frame = document.createElement('iframe');
    frame.onload = function() {
        frame.onload = function() {
            callback(frame.contentWindow.name);
            frame.parentNode.removeChild(frame);
        }
        frame.src = 'about:blank';
    }
    frame.src = url;
    document.body.appendChild(frame);
}

// using it

fetchData('http://somehost.com/api?foo=bar', function(response) {

    console.log(response);

});​

ここでテストするためにフィドルをセットアップしました。このスクリプトをテスト サーバーとして使用します。

POST リクエストを作成できる少し長い例を次に示します: http://jsfiddle.net/n9Wnx/2/


概要

私が知る限りwindow.name、データ トランスポートとして普及していません。私の認識は正確なのだろうか (したがって、元の質問)、もしそうなら、なぜそうなのか疑問に思います。window.nameJSONP より優れていると思われる利点をいくつか挙げました。この手法の採用を妨げる一因となった可能性のあるいくつかの欠点を特定できる人はいますか?

winow.nameもっと要点を言うと、データ転送として使用してはいけない確かな理由を誰か教えてもらえますか?

4

2 に答える 2

6

window.name(AFAIK)変更されたときにイベントを発生させないため、トランスポートとしては特に適していません。その結果、window.name双方向通信チャネルとして使用しようとしていたアプリケーションは、更新のためにポーリングする必要がありました。

実際に使用しているサイトに関しては、聞いたことがありません。いくつかあるかもしれませんが、私はこのテクニックが純粋に理論的な意味で議論されているのを聞いたことがあります.

于 2012-05-12T22:58:01.567 に答える