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

时间:2012-08-10 16:50:46

标签: gwt jsni

在我的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()仅在第一次被调用,后续调用被忽略?

1 个答案:

答案 0 :(得分: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);
        }
    }
}