Javascript 未立即调用onKeyPress函数

Javascript 未立即调用onKeyPress函数,javascript,html,Javascript,Html,document.getElementById('my').onkeypress=函数(事件){ this.value=this.value.toUpperCase() } 有人能给我解释一下这个变量在上面的代码中指向什么吗?它是否指向我从document.getElementById('my')抓取的输入html元素?还是指向浏览器中的窗口对象?另外,传入匿名函数的“event”参数是什么 此指的是输入元素 这不是一个匿名函数,它是onkeypress函数的声明 事件是上述函数的一个参数

document.getElementById('my').onkeypress=函数(事件){
this.value=this.value.toUpperCase()
}
有人能给我解释一下这个变量在上面的代码中指向什么吗?它是否指向我从document.getElementById('my')抓取的输入html元素?还是指向浏览器中的窗口对象?另外,传入匿名函数的“event”参数是什么


  • 指的是输入元素
  • 这不是一个匿名函数,它是
    onkeypress
    函数的声明
  • 事件
    是上述函数的一个参数
意外的(?)行为是因为代码是在更新输入字段之前执行的,因此只有前一个值是大写的。为了避免这种情况,您可以使用
onkeyup
事件,该事件在释放密钥后触发

请看这里:

document.getElementById('my').onkeypress=函数(事件){
this.value=this.value.toUpperCase()
}
document.getElementById('my2')。onkeyup=函数(事件){
this.value=this.value.toUpperCase()
}
document.getElementById('my3')。oninput=函数(事件){
this.value=this.value.toUpperCase()
}

这里是w3c中关键事件引用的简单定义

提示:与onkeypress事件相关的事件顺序:

onkeydown onkeypress onkeyup注意:onkeypress事件未触发 用于所有浏览器中的所有键(例如ALT、CTRL、SHIFT、ESC)。察觉 仅当用户是否按下某个键时,使用onkeydown, 因为它适用于所有键

这就解释了oninput事件

oninput事件支持所有主要浏览器,包括IE9和更高版本

oninput比“次优”onkeyup更适合您的需要,因为onkeyup仅在释放密钥时启动。键入时,新值会在按下后立即输入,但似乎会在函数启动后将新值添加到框中。我将继续试验,因为我有另一个想法如何做到这一点,但oninput似乎是目前最好的关键事件

document.getElementById('my')。oninput=函数(事件){
this.value=this.value.toUpperCase()
}

尝试使用
onkeydown
这是指#我的元素。如果可能的话,你能在代码片段或JSFIDLE中重新创建问题吗?
onkeypress
在键入的字符“提交”到元素值之前激发。听听
keydup
事件。是的,在keydup上似乎是答案:)@DougieHauser,那怎么样,复制品?OP要求解释,而不是jQuery解决方案。嗨,它知道自onKeyDown事件以来按下了哪个键,这不是问题所在。问题是,它让你有机会在输入发生之前,有目的地做一些事情。有时你希望字段中显示其他内容,有时你不希望任何东西或只需要特定的键来响应,等等@Shomz,我发现如果你使用
window.setTimeout
并将函数连接到onkeypress,它的行为将与oninput解决方案一样!是的,这将启动一个异步事件并将其放入队列中,但被认为是一种黑客行为,通常应该避免(请参阅:)。要让所有东西都能正常工作,最纯粹的方法就是将onkeydown和onkeydup(一个用于在按下时修改文本,另一个用于在释放后修改文本)组合在一起,方法是为它们分配相同的功能。本打算为你的
oninput
评分,但你自己写了答案,所以我可以投票。@Shomz需要更多像你这样的人:)哈哈,谢谢你,先生!这里有很多伟大的人物,你肯定是其中之一。