これは少し複雑です、ご容赦ください。ウェブサイトAにはウェブサイトBを含むiframeがあり、ウェブサイトBにはウェブサイトCを含むiframeがあります。
ウェブサイトCにボタンがあります。クリックすると、ウェブサイトBのURLを更新します。以下は、iframe内にあるウェブサイトCからウェブサイトBを更新するために呼び出されるJavaScriptです。
function url_update(id){
var Host = 'https://websiteb.com ';
var myHost = Host.split('/');
if (id != "" && myHost != ""){
try {
if (id.substring(0,1) != '/'){
id = '/' + id;
}
var dft_url = myHost[0] + '//' + myHost[2] + id;
window.parent.location.href = dft_url;
} catch(e){alert("Cannot go to the desired url location: " + dft_url);}
}
}
ただし、「window.parent.location.href = dft_url;」という行の場合実行されると、次のエラーが発生しました。
Unsafe JavaScript attempt to initiate navigation for frame with URL
'https://websiteB.com' from frame with URL
'https://websiteC.com'. The frame attempting navigation is
neither same-Origin with the target, nor is it the target's parent or
opener.
なぜこれが起こっているのか、そしてそれを修正する方法がわかりません。どんな助けでもありがたいです。
私はいくつかの調査を行いましたが、これはOriginの問題であるとほとんどの人が主張しましたが、WebサイトAを削除すると、WebサイトCを含むiframeを備えたWebサイトBしかないと、上記のコードは機能します。ドメインが異なっていても
この動作の説明は、Chromiumソースコードのコメントにあります。ここを参照してください:
基本的に、トップレベルウィンドウには、他のウィンドウよりもナビゲーションに関する制限が少なくなっています。トップ以外のウィンドウの制限を参照してください。
ドキュメントはその子孫フレームをナビゲートできます。または、より一般的には、ドキュメントがそのフレームの祖先(フレーム階層内)のいずれかと同じオリジンにある場合、ドキュメントはフレームをナビゲートできます。
トップウィンドウはどこですか:
具体的には、そのフレームがドキュメントを開いた場合、またはドキュメントが同じである場合、ドキュメントはトップレベルフレームをナビゲートできます-オリジンは、トップレベルフレームのオープナーの祖先(フレーム階層内)のいずれかと同じです。
その理由は次のとおりです。
トップレベルフレームは、(ほとんどのブラウザで)アドレスバーにURLを表示するため、他のフレームよりもナビゲートしやすいです。
したがって、基本的に、トップウィンドウ以外の場合、ナビゲーションを許可するには絶対に同じOriginである必要がありますが、トップウィンドウの場合、そのウィンドウによって開かれたフレームは、同じでない場合でもナビゲートできます-Origin。これはあなたが直面している問題のようです。Bがトップの場合、同じOriginは適用されませんが、トップでない場合は適用されます。
これによると、簡単な解決策があるか、まったく解決策があるかはわかりません。