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 来执行此操作,原因有很多,我们无法讨论。)

本质上,当用户单击按钮时,animate()会调用一个 jQuery,当它完成时,回调函数会调用Window.onResize(). 很简单。

它第一次起作用。当用户点击按钮时,动画发生,并且 onResize 被调用。但即使animate()函数成功完成,所有后续点击都不会触发 onResize 操作。我在回调中放入的任何其他代码,例如alert(),每次动画完成时都会发生,因此回调不是问题。我知道onResize()随后不会调用 ,因为动画操作对元素的大小应用了一堆更改,并且当onResize()触发时,您可以看到更改发生。

为什么Window.onResize()唯一的第一次被调用,随后的调用被忽略?

4

1 回答 1

1

发生这种情况的原因是 GWT 团队在课堂上编写onResize()事件的方式。Window显然,某些浏览器引擎,如 Trident (IE) 和 Webkit (Chrome、Safari),在某些情况下,onResize事件会被多次触发,而它应该只发生一次。为了处理这种情况,该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 回答