Javascript iOS上Safari中的Shift键

Javascript iOS上Safari中的Shift键,javascript,ios,safari,Javascript,Ios,Safari,有没有办法在javascript中确定移动键盘上是否按下了shift键,并将其与caps lock(两次按下shift键)区分开来 首先,让我们来看一些关于iOS键盘的事实,我想你已经知道了: 进入键盘模式时,shift键始终处于激活状态 Caps Lock必须手动激活(我想这并没有被广泛使用) iPhone Shift键处理 我对这个问题进行了一些调查,我发现: shift键不触发任何键事件 没有专门的iPhone浏览器API来检测是否按下shift键,除非是在iOS应用程序中(duh)

有没有办法在javascript中确定移动键盘上是否按下了shift键,并将其与caps lock(两次按下shift键)区分开来 首先,让我们来看一些关于iOS键盘的事实,我想你已经知道了:

  • 进入键盘模式时,
    shift
    键始终处于激活状态
  • Caps Lock
    必须手动激活(我想这并没有被广泛使用)
iPhone Shift键处理 我对这个问题进行了一些调查,我发现:

  • shift
    键不触发任何键事件

  • 没有专门的iPhone浏览器API来检测是否按下shift键,除非是在iOS应用程序中(duh)

  • iOS触发的
    keydown
    keypress
    keyup
    事件看起来很正常,只是它们没有指示shiftKey的用法,并且除了时间戳和类型之外无法区分

  • 您无法在iOS中手动分派键盘事件,因为,
    keyCode
    是只读的,并且始终设置为
    0
    。不可能重新触发键盘事件以获取有关shift键仍处于打开状态的指示

  • 实际上,iPhone将shift键视为某种短期大写锁定键。区别在于,通常情况下,您只需激活一次,它就会自动停用

可以做些什么 我假设您希望在输入字段中指示用户是否应小心按下Shift/Caps Lock(例如,密码字段)。我想到的是一种解决办法,但我认为总比什么都没有好

DOM设置

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

正如我所说,总比什么都不做要好,但如果您需要知道在用户不做任何输入的情况下按下了shift键,那么这不是一个解决方案。现在这似乎是不可能的。

我认为这在Javascript中是不可能的。尽管目标C是可能的


这似乎是一个oooold问题:您需要通过iOS SDK还是通过网站来处理它?@MatrosovAlexander我假设是一个网站。在我的iPod 4.3中,根本检测不到shift键。
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);