概要と元の質問
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.name
JSONP より優れていると思われる利点をいくつか挙げました。この手法の採用を妨げる一因となった可能性のあるいくつかの欠点を特定できる人はいますか?
winow.name
もっと要点を言うと、データ転送として使用してはいけない確かな理由を誰か教えてもらえますか?