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