iOS上的Safari中的shiftKey
有没有什么办法可以在javascript中确定是否在移动键盘上按下shift键,并将其与大写locking区分开来(两次按下shift键)
一些事实
首先,我们来看看关于iOS键盘的一些事实,我假定您已经知道:
- 当您进入键盘模式时,
shift
键始终被激活 -
Caps Lock
必须手动激活(我猜这不是太广泛使用)
iPhone Shift键处理
我调查了一下这个问题,这是我发现的:
-
shift
键不触发任何事件 -
没有特别的iPhone浏览器API来检测是否按下Shift键,除了在iOS应用程序(杜)
-
由iOS触发的
keydown
,keypress
,keyup
事件看起来很正常,除非它们不指示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。 这似乎是不可能的。
我不认为这是可能的Javascript。 尽pipe目标C是可能的。