【发布时间】:2011-10-12 09:18:44
【问题描述】:
我知道有FocusPanel 可以附加这样的处理程序,但根据我的经验,这个组件的表现并不好。所以我想尽可能避免它。
所以我想知道为什么也没有办法在文档上附加密钥处理程序?根据quirksmode.org 的说法,它可以跨浏览器工作,所以这不应该是一个问题。
我也尝试自己编写一些 JSNI 代码来执行此操作,这在大多数情况下都可以正常工作。但是,如果有任何其他小部件在文档上侦听与我相同的事件,并且该小部件允许事件传播,那么我对到达文档的事件几乎无能为力,因为它被标记为死,并且将出现异常每当我尝试访问该事件的数据时抛出。
到目前为止,这是我的代码:
public class RichDocument implements HasKeyPressHandlers, HasKeyDownHandlers,
HasKeyUpHandlers, HasClickHandlers {
private static final RichDocument instance = new RichDocument();
public static RichDocument get() {
return instance;
}
private final EventBus eventBus = new SimpleEventBus();
private RichDocument() {
startListening();
}
@Override
public HandlerRegistration addClickHandler(ClickHandler handler) {
return eventBus.addHandler(ClickEvent.getType(), handler);
}
@Override
public HandlerRegistration addKeyDownHandler(KeyDownHandler handler) {
return eventBus.addHandler(KeyDownEvent.getType(), handler);
}
@Override
public HandlerRegistration addKeyPressHandler(KeyPressHandler handler) {
return eventBus.addHandler(KeyPressEvent.getType(), handler);
}
@Override
public HandlerRegistration addKeyUpHandler(KeyUpHandler handler) {
return eventBus.addHandler(KeyUpEvent.getType(), handler);
}
@Override
public void fireEvent(GwtEvent<?> event) {
eventBus.fireEvent(event);
}
private native void startListening()/*-{
var self = this;
var fire = function (event) {
event = event || $wnd.event;
@com.google.gwt.event.dom.client.DomEvent::fireNativeEvent(Lcom/google/gwt/dom/client/NativeEvent;Lcom/google/gwt/event/shared/HasHandlers;)(event, self);
};
if ($wnd.document.addEventListener) {
$wnd.document.addEventListener("click", fire, false);
$wnd.document.addEventListener("keydown", fire, false);
$wnd.document.addEventListener("keypress", fire, false);
$wnd.document.addEventListener("keyup", fire, false);
} else {
$wnd.document.attachEvent("onclick", fire);
$wnd.document.attachEvent("onkeydown", fire);
$wnd.document.attachEvent("onkeypress", fire);
$wnd.document.attachEvent("onkeyup", fire);
}
}-*/;
}
【问题讨论】:
-
您是否有特定的理由要添加到文档而不是使用
Event.addNativePreviewHandler()? -
@HilbrandBouwkamp 我不知道这种方法,谢谢!我试试看。
-
请注意,
addNativePreviewHandler作用于捕获阶段(在 IE 中模拟),而“附加到文档”将处于冒泡阶段。这可以有所作为。取决于你的需要。 -
@HilbrandBouwkamp, @ThomasBroyer addNativePreviewHandler 似乎有效,但我如何将该事件转换为正确的
KeyUpEvent?
标签: events gwt keyboard-events