@星田 知子 様、こんにちは。
お問い合わせありがとうございます!
ご説明いただいた内容からすると、問題は(画面 A → 画面 B → 画面 C で、C を閉じると B ではなく A が前面に出てしまう)Edge の IE モードでのウィンドウフォーカスの扱いに関係しており、最新の Windows アップデート (KB5065426) の後に発生しているようです。
状況の説明
- 3つのポップアップ画面があります:
- A(親) → B(子) → C(孫)
- C で次のコードを実行しています:
window.close();
- 期待される動作: C を閉じたら B が前面に表示される。
- 実際の動作: A が前面に出て、B は背後に残る。
なぜこうなるのか
- Edge IE モードは旧 IE エンジンを Edge 内で動かしているため、フォーカスのルールは古い IE と同じではありません。
- アップデート後、ポップアップを閉じたときにどのウィンドウがフォーカスされるかの決定方法が変わったようです。
- その結果、C を閉じると B ではなく A が前面に出ることがあります。
- これは .NET コードの問題ではなく、ブラウザ側の挙動の変化です。
例えると紙の山のようなものです: C が一番上、B がその下、A が一番下にあります。C を置いて B を手に取るつもりが、下の A が飛び出してくる感じです。
修正方法
C を閉じる前に、ブラウザにどのウィンドウを前面に出すかを明示的に指示できます。
1. C の閉じるコードを変更:
if (window.opener && !window.opener.closed) {
try {
window.opener.focus(); // B を前面に表示
} catch (e) {
// エラーが出ても無視
}
}
window.close(); // その後 C を閉じる
2. 任意: 少し遅延を入れる
setTimeout(() => {
if (window.opener && !window.opener.closed) {
window.opener.focus();
}
window.close();
}, 50); // 50ミリ秒
これにより、アップデート後の Edge IE モードでも B が確実に前面に表示 されます。
追加のヒント
- アップデートが適用されていない環境でテストして、違いを確認してみてください。
- ポップアップの設定(ウィンドウ名や機能)を一貫して使用すると、親子関係が正しく維持されます。
- 必要に応じて、B が C の終了を検知(
onunloadやポーリング)して、自動的に前面に出るようにすることもできます。
参考になれば幸いです!もし役に立った場合は、他の方のために解決済みとしてマークしてみてください。