【问题标题】:How to disable key bindings in X3DOM如何在 X3DOM 中禁用键绑定
【发布时间】:2017-05-19 08:50:26
【问题描述】:

我将 X3DOM 用于一个简单的游戏,但我不能按照我想要的方式使用键盘键,因为 X3DOM 会对它们做出反应。

例子:

window.addEventListener('keydown', event => this.onKeyDown(event));

我想为if keyCode == 68 拥有自己的关键事件。这行得通,但 X3DOM 也会对其做出反应,通过更改导航模式并显示覆盖。

如何禁用此功能?

【问题讨论】:

    标签: javascript x3dom


    【解决方案1】:

    免责声明:我从未使用过 x3dom,我只是在源代码中闲逛

    似乎有一些代码disables keypress handling

    this.disableKeys = x3dElem.getAttribute("keysEnabled");
    this.disableKeys = this.disableKeys ? (this.disableKeys.toLowerCase() == "true") : false;
    

    稍后在设置keypress event handler时读取:

    this.onKeyPress = function (evt) {
        if (!this.parent.disableKeys) {
            evt.preventDefault();
            this.parent.doc.onKeyPress(evt.charCode);
        }
        this.parent.doc.needRender = true;
    }
    

    所以看来设置keysEnabled=... 属性可以将其关闭。奇怪的是,他们的逻辑是向后的(?)条件:

    • x3dElem.getAttribute("keysEnabled") 必须为真(即必须有属性)
    • 如果那是假的,this.disableKeys 总是假的
    • 否则等于该属性的值小写等于'true'

    所以要禁用按键事件,请使用<... keysEnabled="true" ...>

    我做了一个github issue关于向后逻辑,也许将来会是keysDisabled="true"

    更新:

    在最新版本中,该属性已重命名为disableKeys,因此请使用<... disableKeys="true" ...>

    【讨论】:

      【解决方案2】:

      您可以使用event.preventDefault 来防止 X3DOM 对该键做出反应:

      window.addEventListener('keydown', event => {
          if ((event.which === 68) || (event.keyCode === 68)){
              event.preventDefault();
              //
              // ...
              //
          }
      });
      

      【讨论】:

      • 这只有在你能够在加载 x3dom 之前钩住它的情况下才有效——否则由于事件处理程序的排序为时已晚
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      • 2015-01-30
      • 1970-01-01
      相关资源
      最近更新 更多