为什么 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 不允许我们在文档元素上添加关键事件处理程序? 的相关文章

  • 阻止 GWT 中的事件冒泡

    我有以下代码片段 changeTextArea 是一个 TextArea 对象 changeTextArea addKeyboardListener new KeyboardListenerAdapter public void onKey
  • javascript捕获文本区域中的粘贴事件

    我目前有一个文本区域 我需要控制已粘贴的文本 本质上 我需要能够将用户想要粘贴到文本区域中的任何内容并将其放入变量中 然后我将计算出他们粘贴文本的位置和字符串的大小 以将其从文本区域中删除 然后最后用我自己的方式处理变量中的文本 我的问题
  • 使用 Javascript 跟踪 HTML 元素的显示变化

    假设我有一个给定的 HTML 元素 例如 div div 在该元素内部 可能会发生很多事情 这些事情会改变该元素的某些显示配置 例如其高度或固定位置 我是否可以跟踪与该元素的显示相关的任何更改 当元素更改任何显示变量时是否会触发一般事件 只
  • 使用 MessagingCenter 和标准 .NET 事件处理程序向感兴趣的各方通知更改有什么区别?

    使用 MessagingCenter 和标准 NET 事件处理程序向感兴趣的各方通知更改有什么区别 下面演示了同一事物的两个 未经测试的 实现 public class FooClass public event EventHandler
  • Swing:如何创建事件并将其分派给组件?

    我需要将一些事件发送到 Swing 中的组件 因此它的处理方式就像任何用户生成的标准 Swing 事件一样 基本上 类似于宏记录器 然后是 JEditorPane 的执行器 但我需要对生成的事件有更多的控制 所以 假设我有一个编辑 我想 捕
  • 如何在调试时轻松查看事件订阅数量?

    在调试时 我可以查看一下textBox1 TextChanged查看事件订阅数量 如果是 那么我该如何钻取它 我需要知道在给定时间有多少订阅进行调试 因为看起来一个事件被多次触发 但我怀疑这个错误确实是因为textBox1 TextChan
  • 了解 Document.createElement()

    我在用着GWT及其底层DOM能力 我基本上想要实现的是 Have a div包含一些文本的元素 其中一些文本将被包围span元素 span 元素可相互拖动并提供上下文菜单 New span元素可以由最终用户动态创建 它可能是这样的 在应用程
  • WPF:鼠标按下时不会触发鼠标离开事件

    我遇到鼠标进入 离开事件的问题 当按下鼠标按钮并按住光标在控件内 然后光标以足够快的速度移出控件时 此事件不会触发 你能告诉我为什么会这样吗 有什么方法可以正确获取这些事件吗 请检查示例项目以查看其实际效果 https www dropbo
  • WxWidgets自定义事件

    我正在尝试使用自定义事件 in my WxWidgetsC 应用程序 如所描述的here http wiki wxwidgets org Custom Events 22But I don 27t need a whole new even
  • 如何从 DataGridView 数据单元格获取按键、按键事件

    我需要在单元格编辑期间接收按键事件DataGridView控制 从我在网上查到的DataGridView旨在传递所有关键事件DataGridView到单元格编辑控件 您无法轻松获取这些事件 我找到了这个一段代码 http www codep
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • iPhone 上的全屏视频播放器是否有“onClose”事件?

    我在网站上使用 html5 视频播放器 当用户开始播放时 播放器进入全屏模式并播放视频 视频结束后 我看到ended事件并通过关闭视频播放器myvideo webkitExitFullScreen 现在 当玩家实际获得时我需要另一个事件cl
  • 如何用 jQuery 替换击键?

    我需要能够用 jQuery 替换击键 当按下右箭头时 我希望改为按下 Tab 键 到目前为止我有
  • 从 JSNI 调用 Java 方法

    我想调用Java方法test 来自 JSNI 变量successHandler 但是 我收到错误 ERROR Line 110 Missing qualifier on instance method com gw myProject cl
  • 如何将事件侦听器与“请求”事件结合起来?

    我为终端编写了一个简单的小迷宫游戏 它反复要求用户做某事 例如 您想朝哪个方向走 N E S W 我有一个navigate 方法在循环中运行 触发这些问题 存储答案并根据答案执行某些操作 public enum Dir N E S W pu
  • C# 中的应用程序关闭事件

    我正在使用 NAudio 编写音乐播放器 在关闭播放器之前 我想调用一些停止播放的方法 我该怎么做呢 WinForms 订阅Application ApplicationExit http msdn microsoft com en us
  • 脚本块上的新闭包

    考虑这段代码 PS gt timer New Object Timers Timer PS gt timer Interval 1000 PS gt i 1 PS gt Register ObjectEvent timer Elapsed
  • 更改src iframe具有跨域功能

    我正在尝试使用 GWT 制作一款将在一个 iframe 内运行的应用程序 直到这里一切正常 问题是我的实际网络中有一种表单可以将请求发送到 iframe 使用java脚本 当我按下 发送表单 按钮时 我更改了iframe的src并稍后刷新它
  • 为什么锁可以确保底层监视器被释放而直接使用监视器却不能?

    msdn 文章线程同步 C 编程指南 http msdn microsoft com en us library ms173179 28v vs 90 29 aspx规定 lock x DoSomething 相当于 System Obje
  • C++事件系统设计[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要使用 C 中的事件系统 我主要有四个要求 Speed 使用方便 类型安全 友善破坏 我所说的 友好破坏 是指事件和订阅者需要在其

随机推荐