如何在移动浏览器上取消 keydown

how to cancel keydown on mobile browsers

我有这个在桌面浏览器上完美运行。它检查用户何时按下邮政编码文本输入字段中的键:

zip_field.addEventListener(
                    'keydown',
                    function(evt){check_zip({evt:evt, zip_field: zip_field, submit_button: submit_button})}, 
                    false
                    )

check_zip 函数在底部有这个,如果用户键入字母等,可以取消按键:

if(prevent_key)
{
    evt.preventDefault()
    evt.stopPropagation()
    return false;
}

在移动浏览器上,if 语句的处理方式与在桌面浏览器上的处理方式相同,但它仍然允许字符通过。但是,如果我放入断点并单步执行代码,它就可以正常工作!

我在 Chrome 和 Android 上的 Firefox 中进行了测试,两者都发生了这种情况。我还需要在移动设备上执行其他操作才能 prevent/cancel 密钥并防止它出现在输入框中吗?

更新:我能够在 iPhone 上进行测试,它在那里正常工作。所以它只在 Android 上坏了(FF、Chrome 和三星浏览器都失败了)。

evt的访问方式有误。 evt 在您的代码中以对象形式传递给 check_zip() 的参数。 那么你应该这样访问。

function check_zip(param) {
    ...
    if (prevent_key)
    {
        param.evt.preventDefault()
        param.evt.stopPropagation()
        return false;
    }
}

在创建精简测试页后,我发现 Chrome 总是将使用 Android 键盘按下的键解释为 keydown 事件中的 keyCode 229。如果我用 USB 线将我的 phone 插入我的电脑,我在桌面键盘上按下的键使用了正确的键码,但 phone 的虚拟键盘上的键码都是 229。研究我发现了这个:

keyCode on android is always 229

但是,如果我在其中放置断点并逐步执行它,我无法弄清楚为什么它会起作用。