【问题标题】:How to listen for keyboard open/close in Javascript/Sencha?如何在 Javascript/Sencha 中监听键盘打开/关闭?
【发布时间】:2012-01-04 16:53:37
【问题描述】:

我有一个 HTML5/Javascript (Sencha) 应用程序,我已在 XCode 中将它打包到 PhoneGap for iOS 中。一种或另一种方式,我希望能够监听键盘打开/关闭事件并相应地做一些事情。有没有办法做到这一点?

【问题讨论】:

  • 当您聚焦 textfield, textareafield ... 时,将自动调用键盘。因此,您可以在 javascript 中创建焦点事件的侦听器。
  • 那么,我也想听一下textfields等什么时候失去焦点,有没有事件?
  • 我觉得你可以使用 blur 事件
  • 成功了。如果您想继续并发布实际答案,我会给您支票。
  • 很高兴听到这个消息...我会将其发布为答案。

标签: javascript ios sencha-touch keyboard-events


【解决方案1】:

当您聚焦 textfield, textareafield ... 时,将自动调用键盘。因此,您可以在 javascript 中创建 focus 事件的侦听器,这类似于侦听键盘打开事件。您也可以使用 blur 监听器来处理键盘关闭。

谢谢。

【讨论】:

  • 我正在使用它来设置焦点。 inpMessage.fieldEl.dom.focus();它在 chrome 中工作正常而不是在设备中。
  • 请注意,这将在键盘动画打开之前触发,因此如果您需要进行定位/布局调整可能为时过早
  • 您需要在发布答案之前进行更多测试。当您点击 Android 设备的后退按钮时,键盘将被隐藏,但不会触发模糊事件。
  • @devmaniac ...感谢您的反馈。我并不是说隐藏键盘会调用模糊事件。如果我们对当前聚焦的文本字段调用 blur,它将隐藏键盘。它恰恰相反。 :)
【解决方案2】:

我遇到了同样的问题,我认为在你的情况下最好的解决方案是使用一个 PhoneGap 插件来绑定原生事件,就像这个:

https://github.com/driftyco/ionic-plugins-keyboard/tree/60b803617af49a10aff831099db90340e5bb654c

它在 Android 和 iOS 上的效果一样好,只需绑定这些事件:

window.addEventListener('native.showkeyboard', keyboardShowHandler);

window.addEventListener('native.hidekeyboard', keyboardHideHandler);

【讨论】:

  • 这也适用于浏览器吗?因为那个库似乎是为 Cordova 准备的
  • 你确实需要Phonegap/Cordova(注意,这个答案是7岁)
【解决方案3】:

最近我遇到了类似的问题。经过一番研究,我意识到“Visual viewport Api”是解决方案。

'视觉视口是屏幕的视觉部分,不包括屏幕键盘、捏拉缩放区域之外的区域或任何其他不随页面尺寸缩放的屏幕工件'

https://developer.mozilla.org/en-US/docs/Web/API/Visual_Viewport_API

window.visualViewport.addEventListener('resize', event => console.log(event.target));

每次调整“视觉视口”的大小时都会执行上述代码,例如,当键盘打开/关闭时。

【讨论】:

  • 我认为这是最好的答案,因为它允许您避免将此功能与本机层集成紧密耦合。因此,如果这个应用程序从 PhoneGap 转移到仅 Web、React Native 或本机 Web 视图中,则无需更改实现。
【解决方案4】:

使用 onclick 或 onfocus 事件很容易触发打开状态,但在关闭键盘时不会触发 onblur 事件(因为光标保留在输入/文本区域中)。所以我通过检测在键盘打开/关闭时显着改变的窗口高度找到了解决方案。

它也适用于 Android 和 iOS 上的现代浏览器。演示:http://jsfiddle.net/qu1ssabq/3/

如有必要,您可以针对不支持 addEventListener 或 innerHeight 的设备改进我的代码 - Internet 上有可用的替代方法。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0, minimal-ui">
<title>Detect keyboard opened/closed event</title>
</head>
<body>

<textarea id="txta" onclick="xfocus()" onblur="xblur()"></textarea><br>

<span id="status" style="background: yellow; width: auto;">closed</span>

<script type="text/javascript">
  function xfocus() {
    setTimeout(function() {
      height_old = window.innerHeight;
      window.addEventListener('resize', xresize);
      document.getElementById('status').innerHTML = 'opened'; // do something instead this
    }, 500);
  }
  function xresize() {
    height_new = window.innerHeight;
    var diff = Math.abs(height_old - height_new);
    var perc = Math.round((diff / height_old) * 100);
    if (perc > 50)
      xblur();
  }
  function xblur() {
    window.removeEventListener('resize', xresize);
    document.getElementById('status').innerHTML = 'closed'; // do something instead this
  }
</script>

</body>
</html>

【讨论】:

    【解决方案5】:

    另一个潜在的(但非常老套的)解决方案是观察窗口调整大小事件。它不适用于所有用例,但在智能手机上调整窗口大小并不常见,因此调整大小事件可能来自键盘打开。此代码未经测试,但它说明了总体思路:

    let fullWindowHeight = window.innerHeight;
    let keyboardIsProbablyOpen = false;
    
    window.addEventListener("resize", function() {
      if(window.innerHeight == fullWindowHeight) {
        keyboardIsProbablyOpen = false;
      } else if(window.innerHeight < fullWindowHeight*0.9) {
        keyboardIsProbablyOpen = true;
      }
    });
    

    与焦点/模糊事件一起使用可能有助于(例如)在用户按下后退按钮时检测键盘关闭(正如@filipvkovic 所指出的那样)。

    【讨论】:

      【解决方案6】:

      据我所知,这仅适用于 PhoneGap 的 Android 版本,请参阅此处的拉取请求:https://github.com/phonegap/phonegap-android/issues/94。

      这些事件称为hidekeyboard 和showkeyboard。您可以检查它们是否也在 iOS 上触发。

      【讨论】:

        【解决方案7】:

        按照camiloHimura's answer的建议,您可以使用window.visualViewport。

        视觉视口是屏幕的视觉部分,不包括屏幕键盘、捏拉缩放区域之外的区域或任何其他不随页面尺寸缩放的屏幕工件。

        我在几个打开键盘的设备上测量了window.screen.height 和window.visualViewport.height 之间的差异,它总是大于300px。

        所以你可以这样做:

        const listener = () => {
          const MIN_KEYBOARD_HEIGHT = 300 // N.B.! this might not always be correct
            
          const isMobile = window.innerWidth < 768
          const isKeyboardOpen = isMobile 
            && window.screen.height - MIN_KEYBOARD_HEIGHT > window.visualViewport.height
        }
        
        window.visualViewport.addEventListener('resize', listener)
        
        

        您应该记住,此解决方案可能不适用于所有情况,因为它严重依赖于所有设备键盘高度大致相同的假设。当然,您可以调整硬编码的值,但正如您所见,这不是万无一失的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-03
          • 1970-01-01
          • 2015-05-12
          • 1970-01-01
          相关资源
          最近更新 更多