为什么GWT不允许我们在文档元素上添加关键事件处理程序?

时间:2011-10-12 09:18:44

标签: events gwt keyboard-events

我知道FocusPanel我可以附加这样的处理程序,但根据我的经验,这个组件表现不佳。所以我想尽可能地避免它。

所以我想知道为什么没有办法在文档上附加键处理程序呢?根据{{​​3}},它可以跨浏览器工作,所以这不应该是一个问题。

我自己也尝试过编写一些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);
    }
  }-*/;
}

1 个答案:

答案 0 :(得分:9)

以下情况如何?

RootPanel.get().addDomHandler(handler, KeyDownEvent.getType());

它将它们添加到文档的正文中,但这并没有太大的不同。