« touchEvent の奇妙な振る舞い⇒迂回策 | トップページ | <span class="sl_ft" style="font-weight:normal">LongDriver</span> のデバッグ結果 »

2020年3月21日 (土)

非表示⇒表示の実行は同一関数内では無意味・・・たぶん

先に書いた LongDriver のデバッグ記事 touchEvent の奇妙な振る舞い⇒迂回策 で、対症療法として仮想マウスパッドを表示し直すという考えを書きました。その際、非表示のコードと表示のコードを

    // code-A
    ground.pad.setAttribute("display", "none")    // (1)
    ground.pad.setAttribute("display", "inline")  // (2)

のように続けて書いたら期待した効果は得られず、

        // code-B
        ground.pad.setAttribute("display", "none");
        setTimeout(function(){
            ground.pad.setAttribute("display", "inline");
        }, 10);

のように、間にディレイを入れると良いと書きました。実は、ディレイを入れるだけならば下記コードもアリですが、これでは LongDriver の不具合は解消されません。

        // code-C
        ground.pad.setAttribute("display", "none");
        setTimeout(function(){return;}, 10);    // (3)
        ground.pad.setAttribute("display", "inline");

このことより、不具合解消に必要なのはディレイではない他の何かだと思われます。裏付けの無い推測ですが、表示に関わるコードは、それが置かれている関数を抜け出る時にまとめて反映されるのではないかと思います。その時、不要な処理は省略されるのではないでしょうか。すなわち、 code-A で (1) は省略されて仮想マウスパッドは非表示化されずに、ただ表示されたままのため、表示し直す効果が得られなかったのではないでしょうか。実際、 code-C を実行した時、仮想マウスパッドが一瞬でも非表示化されることはありませんでした。 (3) の 101000 すなわち 1000ms に増やしても非表示化は確認されませんでした。 code-B では、それが置かれている関数を抜けた後で setTimeout() で指定されている関数を実行するので、非表示と表示が確実に実施されるのだと思います。

そういう訳で、仮想マウスパッドの表示し直しは code-B で行いました。

« touchEvent の奇妙な振る舞い⇒迂回策 | トップページ | <span class="sl_ft" style="font-weight:normal">LongDriver</span> のデバッグ結果 »

フットボールのプレイ図ソフト」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« touchEvent の奇妙な振る舞い⇒迂回策 | トップページ | <span class="sl_ft" style="font-weight:normal">LongDriver</span> のデバッグ結果 »