iOS上的Safari中的shiftKey

有没有什么办法可以在javascript中确定是否在移动键盘上按下shift键,并将其与大写locking区分开来(两次按下shift键)

一些事实

首先,我们来看看关于iOS键盘的一些事实,我假定您已经知道:

  • 当您进入键盘模式时, shift键始终被激活
  • Caps Lock必须手动激活(我猜这不是太广泛使用)

iPhone Shift键处理

我调查了一下这个问题,这是我发现的:

  • shift键不触发任何事件

  • 没有特别的iPhone浏览器API来检测是否按下Shift键,除了在iOS应用程序(杜)

  • 由iOS触发的keydownkeypresskeyup事件看起来很正常,除非它们不指示shiftKey的用法,除了它们的时间戳和types之外不能区分。

  • 您不能在iOS中手动调度键盘事件,因为这个问题 , keyCode和只读,并始终设置为0 。 重新触发键盘事件以获得关于仍在开启的键的一些指示是不可能的。

  • 实际上,iPhone像某种Short Term Caps Lock键那样处理shift键。 不同的是,通常情况下,您只需激活一次,然后自动closures。

什么可以做

我假设你想在input字段上指明用户是否应该小心按住Shift / Caps Lock(例如密码字段)。 我想到的是某种解决方法,但我认为总比没有好。

你也可以在这里testingjsfiddle 。

DOM设置

 <div id="wrapper"> <label for="test">ENTER SOMETHING HERE</label> <input type="text" name="test" id="test"/> </div> <div id="warning"></div>​ 

使用Javascript

这将检查用户是否input了大写字母,并假定用户正在使用caps lock如果input了两个大写字母)。

 var isCaps = false, isUppercase = false, str = '', test = document.getElementById('test'), warning = document.getElementById('warning'); function capsDetection(e) { // Since where on iOS, we at least don't have to care // about cross-browser stuff var s = String.fromCharCode(e.which); isCaps = isUppercase; // if the char doesn't match its lower case friend, and the shift key is // not pressed (which is always the case on iOS, but we leave it there // for readability), we have uppercase input isUppercase = (s.toUpperCase() === s && s.toLowerCase() !== s && !e.shiftKey); // if its the second uppercase input in a row, we may have caps lock input isCaps = isCaps && isUppercase; // set the warning if (isUppercase && !isCaps) { str = 'You where using the shift key'; } else if (isCaps) { str = 'Caps lock seems to be activated'; } else { str = ''; } warning.innerHTML = str; } // the right event properties are only available on keypress test.addEventListener('keypress', capsDetection); 

正如我所说,如果你需要知道在没有用户进行任何input的情况下按下Shift键,那么最好不要一个解决scheme。 这似乎是不可能的。