我知道有FocusPanel
我可以在其上附加此类处理程序,但根据我的经验,该组件的行为不太好。所以我想尽可能避免它。
所以我想知道为什么没有办法在文档上附加密钥处理程序?根据怪异模式它可以跨浏览器工作,所以这不应该是一个问题。
我也尝试自己编写一些 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);
}
}-*/;
}