9

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

4

2 回答 2

6

一些事实

首先,让我们看一下我假设您已经知道的有关 iOS 键盘的一些事实:

  • 当您进入键盘模式时,该shift键始终处于激活状态
  • Caps Lock必须手动激活(我猜这个用的不是太广)

iPhone Shift 键处理

我对这个问题进行了一些调查,这就是我的发现:

  • 按键触发无shift按键事件

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

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

  • 由于这个问题,您无法在 iOS 中手动调度键盘事件,keyCode并且which是只读的并且始终设置为0. 重新触发键盘事件以获取有关 shift 键仍处于打开状态的一些指示是不可能的。

  • 实际上,iPhone 将shift按键视为某种Short Term Caps Lock按键。不同之处在于,通常,您激活它一次,它就会自动停用。

可以做什么

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

您还可以在此处测试 jsfiddle

DOM 设置

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

Javascript

这会检查用户是否输入caps lock了大写字母,如果输入了两个大写字母,则假定用户正在使用。

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);

正如我所说,总比没有好,但如果您需要知道在没有用户进行任何输入的情况下按下了 shift 键,这不是一个解决方案。这在现在看来是不可能的。

于 2012-07-13T15:24:40.283 回答
0

我认为 Javascript 不可能做到这一点。不过,目标 C 是可能的。

http://developer.apple.com/library/safari/#documentation/UserExperience/Reference/TouchEventClassReference/TouchEvent/TouchEvent.html

于 2012-07-16T11:35:13.407 回答