GWT:Window.onResize()在JSNI中触发,只调用一次
在我的GWT应用程序中,我有一个按钮,通过JSNI和jQuery将一个单击处理程序附加到该按钮上。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()
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()
只在第一次调用时才被调用,随后的调用被忽略?发生这种情况的原因是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);
}
}
}