在Android的Firefox/Chrome浏览器中,当输入字母时,OnKeyPress、onKeyDown和onKeyUp事件没有被触发。

4
我在Android的Firefox/Chrome浏览器中遇到了问题。
当我在输入框中输入文本时(参见下面的代码),当输入字母时,不会触发onkeypress、onkeyup和onkeydown事件,但当输入“%”符号或按下空格键时,会触发这些事件。
在Android预装的浏览器中,一切正常。
还有一件非常罕见的事情,如果我的光标不是最后一个字符,那么行为就不同了... 如果我的光标在文本中间,在Firefox下,所有事件都会因为任何键而被触发。在Chrome下,一个按键会触发两次onkeyup和onkeydown事件,但不会触发onkeypress事件。
我在不同的设备上测试过,类似的问题都存在。
我找不到任何类似的问题报告在互联网上。有人之前遇到过这个问题吗?你是如何解决它的?
像Amazon.com这样的网站自动完成工作正常,所以必须有一种解决方法...
请注意,此问题已在最新版本的Firefox和Chrome中消失。
非常感谢您的帮助。
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<h1>onKeyXxx event test</h1>
<input type="text" onkeydown="alert('DOWN');" onkeypress="alert('Press');" onkeyup="alert('UP');">
<hr/>
</body>
</html>

onchange 怎么样?它应该可以工作,因为这不是基于 key 的事件。 - antyrat
Onchange不会有帮助。我想在输入时进行自动选择过滤值。 - Cedric Simon
好的,那么setInterval和每500毫秒定期检查新值呢? - antyrat
好的,不用着急,你还有7天时间来完成赏金任务,也许会有人找到更优雅的解决方案或者能够更具体地描述你的问题;) - antyrat
一个相关的问题:https://dev59.com/zGzXa4cB1Zd3GeqPYuTv - Palec
显示剩余3条评论
2个回答

4

setInterval起到了关键作用。

我还不确定如何在Script.aculo.us(我用于自动选择下拉框的库)中实现它,但我会找到一个方法。

这里是一个实现setTimer的解决方案示例 :)

<!DOCTYPE html>
<html>
<head>
<script>
typedText="";
function checkTextChange(){
    if (document.getElementById("test").value != typedText){
        typedText=document.getElementById("test").value;
        document.getElementById("output").innerHTML=typedText;
        return true;
    } else {
        return false;
    }
}
if (navigator.appVersion.indexOf("Android")>-1 && (navigator.appVersion.indexOf("Safari")==-1 || navigator.appVersion.indexOf("Chrome")>-1)){
    alert("Using work around");
    var myVar = setInterval(function(){checkTextChange();},200);
}
 </script>
</head>
<body >
<h1>onKeyXxx event test</h1>
<form>
<input type="text" name="test" id="test"  onkeydown="checkTextChange();" onkeypress="checkTextChange();" onkeyup="checkTextChange();">
</form>
<div id="output"></div>
<hr>
</body>
</html>

3
无法直接使用警报,请按照以下任何方式进行操作。
<input type="text" onkeydown="JavaScript:return alert('DOWN');">

或者

<input type="text" onkeydown="return myFun();">

您可以在文档的任何位置使用 `` 标签来定义您的函数。

那么为什么当我按下空格或百分号键时,或者在单词内部写入时它能够工作呢? - Cedric Simon
尝试这个练习,它可能会解决你的问题。有时候当你犯了小错误时,JavaScript 会出现冲突,最好你试试这个方法。 - Dilip Suvagiya
做到了:D。至少在Chrome下的keydown和keyup,以及在FF下的所有3个都可以工作。非常感谢。现在我将不得不深入挖掘“真正”的代码(scriptaculous autoselect),它不仅仅是触发一个警报,看看我如何解决它。我会告诉你结果,但是你的技巧已经解决了给定代码的问题。谢谢。 - Cedric Simon
欢迎您!现在请您将此答案标记为正确,以便其他人可以使用。 - Dilip Suvagiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接