HTMLブラウザ

Q12 20
InternetExplorer内でBiz/Browserを起動させた際、フォーカスが正しくセット
されない場合がある

A12 20
InternetExplorer内でBiz/Browserを動作させた場合、InternetExplorerのバージョンに
よっては、フォーカスが正しくセットされない場合があることが確認されています。

CASE1

FormからDialogを表示して閉じた際、もともとForm上でフォーカスが当たっていたオブジェ
クトにフォーカスが戻るのが本来の動きですが、フレーム分けしたInternetExplorer内で
Biz/Browserを動作させ、FormからDialogを呼び出すと、Dialogを閉じても元々フォーカスが
当たっていたオブジェクトにフォーカスが戻らず、InternetExplorerのアドレスバーや
InternetExplorerの枠にフォーカスが当たってしまうことがあります。

Biz/Browser ver4.2.1.1では、この現象はInternetExplorer6で確認されており、それ以前の
Biz/Browserのバージョンでは、InternetExplorerのバージョンに関わりなく確認されて
います。



● 本来の動作






●確認されている現象(1)




● 確認されている現象(2)



[ 回避方法 ]
CRSスクリプトで明示的にSetForcusメソッドを記述することで回避が可能です。
Dialogを表示した後に、明示的にSetFocusメソッドでBiz/Browserのオブジェクトにフォー
カスを当ててください。

Button Button3 {
    Title = "Dialog表示";

    Function OnTouch( e ) {
        ^.Get("Dialog1.crs");
        /* ---------------------------------------------
        Dialog表示後に明示的にSetFocusメソッドを実行し、
        フォーカスが消えてしまう現象を回避しています。
        --------------------------------------------- */
        [オブジェクト名].SetFocus();
    }
}




CASE2

InternetExplorer7内でBiz/Browserを動作させた場合、MessageBoxを表示後に記述した
SetFocusメソッドが無効となることがあります。

[ 回避方法 ]
イベントハンドラ内で、MessageBox表示前にSetFocusメソッドの記述をすることで
現象を回避が可能です。

Button Button2 {
    Title = "MessageBox表示";

    Function OnTouch( e ) {
        [オブジェクト名].SetFocus();
        MessageBox("msg");

        /*
         MessageBox表示後に記述したSetFocusメソッドは
         無効になることがあります。
        */
        /* [オブジェクト名].SetFocus(); */
    }
}




CASE3

背面にあるウィンドウをJavaScriptのFocusメソッドで前面に表示すると、前面表示された
ウィンドウのフォーカスは、前回フォーカスの当たっていたオブジェクトに戻るのが本来の
動きですが、ここでフォーカスが消えてしまう現象が確認されています。

これは、JavaScriptのFocusメソッドの挙動に由来する現象で、JavaScriptのFocus
メソッドでウィンドウ全体やフレーム分けしたFrameを指定して前面表示した場合に、
フォーカスがどのオブジェクトにも当たっていない状態となります。
※これは、Biz/Browserに特化した現象ではありません。



●確認されている現象と操作

≪1≫ メインウィンドウからサブウィンドウを開く。
≪2≫ サブウィンドウを前面に表示し、テキストボタンにフォーカスを当てる。
≪3≫ マウスクリックでメインウィンドウを前面に表示する。
≪4≫ メインウィンドウからFocusメソッドを実行し、サブウィンドウを前面に表示する。
≪5≫ サブウィンドウのフォーカスが消えてしまう。
    (本来は、≪2≫のテキストボックスにフォーカスが戻る。)






[ 回避方法 ]
JavaScriptのFocusメソッドでウィンドウを前面表示するとフォーカスが消えてしまいます
ので、ウィンドウの前後を入れ替えたタイミングでBiz/Browserのオブジェクトにフォーカ
スを当てる場合は、BizLinkの機能を利用し、HTML側のJavaScriptのFocusメソッド実行
記述の後にCRSスクリプト側のイベントは発行し、SetFocusメソッドを実行します。
※HTMLのオブジェクトにフォーカスを当てるには、JavaScriptで「[フォーム].Focus()」と
 指定します。



[サンプルコード]


「CASE3」の回避方法のサンプルです。

メインウィンドウの「FOCUS」ボタン押下でサブウィンドウを前面に表示し、その後BizLinkを
利用してイベントを発行し、テキストボックスにSetFocusします。


●HTML側 【inputformSample.html】

<OBJECT ID="BizSender" CLASSID="CLSID:6A4C3744-89D7-4695-A167-2862D5E3E6CD"
    CODEBASE="BizLink.dll#version=3,2,1,1">
</OBJECT>
<SCRIPT LANGUAGE="JavaScript">
<!--

    var subwin;

    /* ------------------------------------------------------
    「FOCUS」ボタン押下時にdoSendファンクションを実行します。
    -------------------------------------------------------*/
    function doSend() {
        try{
            subwin.Focus();
            /* -------------------------------------------------
            サブウィンドウをFocusメソッドで前面表示後、BizLinkの
            PostExternalEventメソッドでbtn_Focusイベントを発行
            しています。
            --------------------------------------------------*/
            BizSender.PostExternalEvent("Service_Sample",
                    "PortID_Sample", "btn_Focus", "param");
        } catch( e ) {
            alert((e.number & 0xffff) + " : " + e.description );
        }
    }


//-->
   :
<省略>
   :

<input type="button" name="touroku" value=" FOCUS " class="btn_ok"
        onClick="doSend()">


●Biz/Browser CRS側 【Form1.crs】

EventListener listen {
    Service = "Service_Sample";
    PortId = "PortID_Sample";

    Function Onbtn_Focus( e ){
        ^.TextBox1.SetFocus();
    }

    /* Biz/Designer上では実行しない */
    if( !$DESIGNTIME ) {
        StartListen();
    }
}

CRSファイル形式のサンプルを
  「BizLinkを利用してオブジェクトにフォーカスを当てる(Htm_020.zip)
よりご利用いただけます。

管理番号:Htm_020
  Biz-Collections Bizの宝箱 トップへ
  Biz/Browser・Biz/Designer TIPS集 トップへ