2016-04-22 20 views
3

の内側に指定されているときは、このようなHTMLありますフォームターゲット休憩グローバル変数名はIFRAME

<form action="frame.html" target="frame1"><input type="submit"></form> 
<iframe name="frame1" id="frame1" src="frame.html"></iframe> 

をそして、それは(製品コードの場合、いくつかのポストデータを送信する)フレームをリロード正常に動作します。しかしframe.htmlにグローバル変数「name」を定義するコード、コードブレークがあり、代わりに新しいタブframe.htmlを開いた場合。

var name = "a"; 

クロームFirefoxので同じよ​​うに動作します。

はここgithub.ioに例を示します http://evigl.github.io/form-target-iframe-test/
出典:https://github.com/EviGL/form-target-iframe-test/tree/gh-pages
(最初のフレームは、通常の作業枠で、2番目の新しいウィンドウで明確にするため、いくつかにconsole.log年代を開きます)。

これは変ですね。 frame.htmlが別のドメインにある場合でも同じように動作します。それは同じ原産地政策を破ることはありませんか?

この動作を無効にする方法はありますか?私はフレームの中にいくつかの制御されていないコードを持っています(ユーザーが生成したコードのプレビュー)、それを変更することはオプションではありません。また、別のドメインにもあります。

答えて

2

これは奇妙なのですか?

はい。下位互換性のために維持されている非常に初期のDOMデザインの結果です(ブラウザが実際にまだ使用している恐ろしいものを投げ捨てることはないため)。

同じ原点ポリシーを壊しませんか?

いいえJSが起源を越え何かを読んでいないれます。

この動作を無効にする方法はありますか?

実際はありません。 getElementByIdを使ってハックして、JSでフレームに新しいsrcを割り当てることができます(ただし、フレーム内の新しいページにリンクするとそのページが破損するかどうかわかりません)。フレームを完全に破棄して置き換えますそれは新しいものと一緒に(また、JSと)。

+0

_No。 JSは原点を越えて何も読んでいません._ しかし、いくつかのドメインで変数 "name"の値をブルートフォースすることができます(同時に数十万のタブを開く)。フレームがリロードされたか、新しいウィンドウが開かれたかどうかをJSで判断する方法があると思います。 iframeを再作成すると、その仕事ができます。私は答えを受け入れるでしょう。 – EviGL

+0

もう1つの回避策は、グローバルにしないでください。関数でアクセス可能にする。 – SaidbakR

+1

@sємsєм - 質問は、 "フレーム内のある制御されていないコード(ユーザーが生成したコードのプレビュー)を変更することはオプションではありません" – Quentin