window.openを利用して別画面を表示させることは結構あると思うのですが、
呼び出した画面(以下、子画面)から呼び出し元画面(以下、親画面)の値を
JavaScriptで書き換える時の動作がIEとChromeとで動作が異なっていました。
動作条件としては少し特殊なのですが、下記の2つです。
- 複数の画面から子画面を呼び出す
- 子画面の名前は同じ(呼び出す度に子画面は更新される)
動作の違いについては下記の通りです。
| ブラウザ | JavaScriptで子画面から親画面の値を 変更した時の動作内容 |
|---|---|
| IE | 一番最初に子画面を開いた親画面の値が書き換わる |
| Chrome | 一番最後に子画面を開いた親画面の値が書き換わる |
動作的にはChrome側の動きの方がしっくりと来るのですが、
EDGEでも動作は同じだったので仕様みたいですね。
基本的には呼び出し時に別々な名前を子画面につけて
子画面を複数表示できるようにした方がいいですが、
どうしてもという場合は気をつけたほうが良さそうですね。
動作確認用のサンプルソースは↓です。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript">
function openWindow() {
// 高さと幅を指定
var width = 300;
var height = 300;
// スクロールバーの有無を設定
var scrollbar = 1;
var original_action = document.forms[0].action;
// サブが麺を表示する
var subWnd = window.open('about:blank', 'subWindwow', 'width='+ width + ',height=' + height + ',menubar=0,toolbar=0,location=0,directories=0,status=0,scrollbars=' + scrollbar + ',resizable=1');
// 各種操作
document.forms[0].target = 'subWindwow';
document.forms[0].action = 'subWindow.html';
document.forms[0].submit();
document.forms[0].target = '_self';
document.forms[0].action = original_action;
}
</script>
</head>
<body>
<form method="post">
<!-- 変更確認用 -->
<input type="text" value="" name="outputTextBox" disabled="disabled">
<!-- サブ画面表示用 -->
<input type="button" value="サブ画面表示" onclick="openWindow()">
</form>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script type="text/javascript">
function changeValueParentWindow() {
// 呼び出し元画面のテキストボックスの値を変更する
var parentWnd = window.opener.document.forms[0].outputTextBox;
parentWnd.value = "変更!";
}
</script>
</head>
<body>
<!-- 変更ボタン -->
<form method="post">
<input type="button" value="呼び出し元画面 値変更" onclick="changeValueParentWindow()">
</form>
</body>
</html>
Web系の仕事をやり始めて色々と気付く_(:3」∠)_
