

javascriptで、親ウィンドウからopenで子ウィンドウを開いた後、親ウィンドウにfocus()します。  
このとき、子ウィンドウを前面に表示し続ける方法を探しています。  
ブラウザはIE11です。

具体的には、子ウィンドウを開くときに、setTimeoutで3秒後に親ウィンドウにfocusしています。  
このとき子ウィンドウはフォーカスを失うから、window.onblurかdocument.onfocusoutで  
子ウィンドウにfocusすれば前面に表示し続けられると考えました。  
それで、親ウィンドウと子ウィンドウを下記のようにしました。

親ウィンドウ(parent.html):

[code]

    <html>
    <body>
    <a href="javascript:void(0);" onclick="openCF();">子ウィンドウを開く</a>
    <script type="text/javascript">
    function openCF() {
        open("./child.html", "_blank", 'width=200,height=200');
    
        setTimeout(function(){
            window.focus();
        },3000);
    }
    </script>
    </body>
    </html>
    
[/code]

子ウィンドウ(child.html)：

[code]

    <html>
    <body>
    <p>子ウィンドウ</p>
    <script type="text/javascript">
        window.focus();    
        window.onblur = getFocus1;
        document.onfocusout = getFocus2;
    
        function getFocus1(){
            window.focus();
        }
    
        function getFocus2(){
            window.focus();
        }
    </script>
    </body>
    </html>
    
[/code]

これをIE11で実行すると、子ウィンドウを開いてから3秒後、予想に反して子ウィンドウは  
親ウィンドウの後ろに隠れてしまいます。  
ただし、子ウィンドウが前面に表示されているときに後ろの親ウィンドウを選択したときは、  
子ウィンドウは隠れずに表示され続けます。  
親ウィンドウにfocusしても子ウィンドウが隠れないようにすることはできないでしょうか?

**追記**

[window.openでモーダルぽくする -
Qiita](http://qiita.com/bassyaroo/items/6566d06e27fdd970dc01)

上記URLを参考にして、一定時間ごとに子ウィンドウにフォーカスが当たっているかをチェックし、外れていたらフォーカスを当てるという処理にしてみました。  
parent.htmlを下記のようにしました。

[code]

    <html>
    <body>
    <a href="javascript:void(0);" onclick="openCF();">子ウィンドウを開く</a>
    <script type="text/javascript">
    function openCF() {
        var childWindow = open("./child.html", "_blank", 'width=200,height=200');
    
        setTimeout(function(){
            window.focus();
        },3000);
    
        var interval = setInterval(function()
        {
            // 子画面にフォーカスを当てる
            if(childWindow != null && !childWindow.document.hasFocus())
            {
                childWindow.focus();
            }
        },100);
    }
    
    </script>
    </body>
    </html>
    
[/code]

setIntervalを使って、子ウィンドウを0.1秒ごとにチェックし、フォーカスが当たっていなければfocus()します。

これで実行してみると、子ウィンドウにフォーカスを当てる処理は動いているようなのですが、それでも子ウィンドウは前面には来ませんでした。  
フォーカスが当たっていることと、ウィンドウが最前面に表示されることは必ずしも一致しないのか、と思ってさらに調べています。

引き続き、ご回答いただけると幸いです。


CC BY-SA 4.0
2017-04-21T09:05:18.903
34186
2022-01-21T14:05:45.693
2019-06-26T00:53:47.917
3060
22698
question
javascript
親ウィンドウにフォーカスが当たっても子ウィンドウを表示し続ける方法は?


この手の動作はユーザビリティを損なうので年々ブラウザによる制限が厳しくなっています。  
モバイルも増えてきた今、そもそも「ウィンドウ」を利用するのも良い方法ではありません。  
ポップアップ表示などは、なるべく１タブ内で上手く行ってください。


CC BY-SA 3.0
2017-04-27T14:01:18.037
34329
2017-04-27T14:01:18.037
5721
34186
answer


Windows を開いた側で 子 Windows にフォーカスをあてると目的の動作になると思ます。

`parent.html` の一部

[code]

    function openCF() {
        var childWin = open("./child.html", "_blank", 'width=200,height=200');
    
        setTimeout(function(){
            childWin.focus();
            setTimeout(arguments.callee, 1000)
        },3000);
    }
    
[/code]

サンプルは 定期的にフォーカスを当てていますが、子Windows の フォーカス状態を 子Windows の  
`input[hidden]` な領域に設定しておき、その値を見て、フォーカスが外れているな。と判断できた時にフォーカスを当てるようにすると、もうすこし
まともな動作になると思います。

* * *

ただ、この方法でも 親の IE が最小化されている時には子はフォーカスされません。  
これは Windows API レベルで どうしようもない問題なのでこれを回避するためには  
専用のプログラムを作成するしかありません。

[外部アプリケーションのウィンドウをフォーカスさせる方法](https://dobon.net/vb/dotnet/process/appactivate.html)

* * *

また、管理者権限で コマンドプロンプトを開いたり、リモートデスクトップ接続の場合などセキュリティー的に 特権が分離されたアプリケーションが存在する場合には
それらのアプリが最優先となるため、思った通りには動かないと思います。  
それは Windows である限りどうしようもありません。


CC BY-SA 4.0
2019-12-12T00:21:21.077
61355
2019-12-12T00:28:29.423
2019-12-12T00:28:29.423
18851
18851
34186
answer