よろしくお願いします。
前提・実現したいこと
- リンクをクリックしたら別タブでページを開きたい。
- クリックするたびにタブが増えるのではなく、1 つのタブを使い回したい。
対応ブラウザ
- 最終的には Edge, Chrome で動作するようにしたいです。
- ひとまず Edge でテストしています。今回のエラーも Edge で起きています。
発生している問題・エラーメッセージ
-
リンククリック時に呼んでいる関数内で、
window.open(uri, "HOGE")
で別タブを開いています。
素直にリンクをクリックしている分には希望通りの動きをします。
-
開いた別タブのアドレスバーを手打ちで変更し、google.com など外部サイトに遷移すると
後述「該当のソースコード」の ★★★ の行で JavaScript エラーが出ます。Uncaught DOMException: Blocked a frame with origin "http://localhost" from accessing a cross-origin frame.
該当のソースコード
html
1<a href="javascript:showPreview(111)">111</a> 2<a href="javascript:showPreview(222)">222</a>
js
1let _win = null; 2function showPreview(id) { 3 let uri = "../File/Preview?id=" + id; 4 5 // リンクをクリックした際、前回の画面を一旦クリアしたい 6 if (_win && _win.closed == false) { 7 _win.document.body.innerHTML = ""; //★★★ 8 } 9 10 _win = window.open(uri, "MyPreview"); 11}
なお innerHTML = ""
している箇所の if 文を削除すると、
エラーは出ず、タブがアクティブになりますが、ページは変わりません(外部サイトのまま)
試したこと
location=no
- window.open の際に「アドレスバーを表示しないオプション」を指定しましたが、これだと別タブではなく 別ウインドウで開いてしまいました。
js
1window.open(uri, "MyPreview", "location=no")
target="xxx"
- JavaScript ではなく、href に URL を指定して
target="MyPreview"
で別タブを開く方法も試しましたが、開いた別タブの URL を外部サイトのものに書き換えると
エラーは出ず、タブがアクティブになりますが、ページは変わりません(外部サイトのまま)
html
1<a href="../File/Preview?id=111" target="MyPreview">111</a>
追記:location.href をセット
-
別タブの URL を外部サイトのものに書き換えた後 以下を実行すると、
エラーは出ず、タブがアクティブになりますが、ページは変わりません(外部サイトのまま)
-
なおコメントアウトしている console.log() を生かすとエラーになります。
値のセットはエラーにならず無視するけど 参照は許されない...?
js
1if (_win && _win.closed == false) { 2 _win.location.href = uri; 3 4 //console.log(_win.location.href); //★ここで Uncaught DOMException エラー 5}
以下のいずれかが出来ないものかと思っています
- window.open で開いたタブの URL を変更させない。
- window.open で開いたタブの URL が変更された後、再度こちらから location を変更する。
- window.open で開いたタブが同一ドメインでなくなっていたら閉じる。(その後 同名で開き直す)
妥協案
最悪どうしようもなければ、以下どちらかにしようと思っています。
- location=no を指定して別ウインドウで開く
- Uncaught DOMException が出る部分を try - catch で囲んで
エラーになったら "MyPreview_2" など name を変えて開く...?
他に何か方法はないのかなと思い質問させて頂きました。
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。