GWT:Window.onResize()在JSNI中触发,只调用一次

GWT:Window.onResize()在JSNI中触发,只调用一次,gwt,jsni,Gwt,Jsni,在我的GWT应用程序中,我有一个按钮,通过JSNI和jQuery将一个单击处理程序附加到该按钮上。JSNI如下所示: private native void attachClickActions() /*-{ $wnd.jQuery("#theButton").click(function() { // ... $wnd.jQuery(this).animate({ // ... }, 500, function()

在我的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来实现这一点,原因有很多,我们没有讨论这些。)

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

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


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

发生这种情况的原因是GWT团队如何在
Window
类中编写
onResize()
事件。显然,某些浏览器引擎,如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);
        }
    }
}

发生这种情况的原因是GWT团队如何在
窗口
类中编写
onResize()
事件。显然,某些浏览器引擎,如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);
        }
    }
}