1

私の GWT アプリケーションには、JSNI と jQuery を介してクリック ハンドラーをアタッチしたボタンがあります。JSNI は次のようになります。

private native void attachClickActions() /*-{
    $wnd.jQuery("#theButton").click(function() {
        // ...
        $wnd.jQuery(this).animate({
            // ...
        }, 500, function() {
            @com.google.gwt.user.client.Window::onResize()();
        });
    });
}-*;

(いいえ、Java コードの ClickHandler を介してこれを行うことはできません。さまざまな理由がありますが、これは議論の対象ではありません。)

基本的に、ユーザーがボタンをクリックすると jQueryanimate()が呼び出され、終了するとコールバック関数が を呼び出しますWindow.onResize()。ものすごく単純。

そして、それは初めて機能します。ユーザーがボタンをクリックすると、アニメーションが発生し、onResize が呼び出されます。ただし、animate()関数が正常に完了しても、後続のすべてのクリックで onResize アクションが起動されるわけではありません。など、コールバックに追加した他のコードはalert()、アニメーションが完了するたびに発生するため、コールバックの問題ではありません。onResize()アニメーションアクションが要素のサイズに一連の変更を適用し、onResize()がトリガーされると、変更が発生することがわかるため、 がその後呼び出されないことはわかっています。

Window.onResize()最初にのみが呼び出され、その後の呼び出しが無視されるのはなぜですか?

4

1 に答える 1

1

これが起こった理由は、GWT チームがクラスonResize()でイベントをどのように書いたかによるものです。Windowどうやら、Trident (IE) や Webkit (Chrome、Safari) などの特定のブラウザー エンジンでは、onResizeイベントが 1 回だけ発生するはずのイベントが複数回トリガーされる場合があります。この状況に対処するために、onResize()メソッドの実装には、ブラウザー ウィンドウの現在のサイズのチェックが含まれています。サイズが最後のonResize()呼び出しから変更されていない場合、再度トリガーされることはありません。

私は基本的に、実際にはサイズ変更されていないウィンドウでイベントを複数回呼び出そうとしonResize()ていたため、この IE/Webkit の「修正」により、イベントの発生が停止していました。

onResize()誰かが興味を持っている場合は、メソッドの実際のコードを次に示します。

static void onResize() {
    if (resizeHandlersInitialized) {
        // On webkit and IE we sometimes get duplicate window resize events.
        // Here, we manually filter them.
        int width = getClientWidth();
        int height = getClientHeight();
        if (lastResizeWidth != width || lastResizeHeight != height) {
            lastResizeWidth = width;
            lastResizeHeight = height;
            ResizeEvent.fire(getHandlers(), width, height);
        }
    }
}
于 2012-08-13T15:25:23.223 に答える