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

2023-12-05

我知道有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);
    }
  }-*/;
}

下面的怎么样?

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐