【问题标题】:onKeyPress Function Not Being Called ImmediatelyonKeyPress 函数没有被立即调用
【发布时间】:2016-02-24 05:13:24
【问题描述】:

    document.getElementById('my').onkeypress = function(event) {
      this.value = this.value.toUpperCase()
    }
    <input id='my' type="text">

有人可以向我解释一下上面代码中的this 变量指向什么吗?它是否指向我从document.getElementById('my) 抓取的输入 html 元素?还是它指向浏览器中的窗口对象?还有传入匿名函数的event参数是什么?

由于某种原因,当我运行此代码时,每个字符的值都是大写的,除了最后一个字符。例如,当我输入:字符 a 不会立即大写,只有在我输入另一个字母时才会大写。例如:Ab。现在 b 不是大写的,直到我在 b 之后输入另一个字母:ABc。这种情况还在继续。有人能解释一下为什么会这样吗?

【问题讨论】:

  • 试试onkeydown?
  • this 指的是#my 元素。
  • 如果可能,您能否在代码 sn-p 或 jsfiddle 中重新创建问题?
  • onkeypress 在输入的字符“提交”到元素值之前触发。
  • 收听keyup事件。

标签: javascript html


【解决方案1】:

有人可以向我解释一下上面代码中这个变量指向什么吗?它是否指向我从 document.getElementById('my) 中获取的输入 html 元素?还是它指向浏览器中的窗口对象?还有传递给匿名函数的“事件”参数是什么?

  • this 指的是输入元素
  • 它不是匿名函数,它是onkeypress 函数的声明
  • event是上述函数more info的参数

意外(?)行为是因为代码在输入字段更新之前执行,所以只有前一个值被大写。为避免这种情况,您可以使用onkeyup 事件,该事件在您释放键后触发。

看这里:

document.getElementById('my').onkeypress = function(event) {
  this.value = this.value.toUpperCase()
}

document.getElementById('my2').onkeyup = function(event) {
  this.value = this.value.toUpperCase()
}

document.getElementById('my3').oninput = function(event) {
  this.value = this.value.toUpperCase()
}
<input id='my' type="text" placeholder="onkeypress">
<input id='my2' type="text" placeholder="onkeyup">
<input id='my3' type="text" placeholder="oninput">

感谢 @www139 在 cmets 中提出 oninput,因为它确实是现代浏览器的最佳解决方案 请注意它仅支持 HTML5,您无法获取密钥代码等信息, 标识符等...

【讨论】:

  • 是的,打开按键似乎是答案:) stackoverflow.com/questions/3063434/…
  • @DougieHauser,那又如何,一个副本? OP 要求解释,而不是 jQuery 解决方案。
  • 嗨,它知道自 onKeyDown 事件以来按下了哪个键,这不是问题。问题是它让您有机会在输入发生之前故意做某事。有时您希望显示该字段中的其他内容,有时您不希望任何内容或仅响应特定键等。
  • @Shomz,我发现如果你将window.setTimeout 与连接到onkeypress 的函数一起使用,它的行为就像oninput 解决方案一样!
  • 是的,这将启动一个异步事件并将其放入队列中,但被认为是一种 hack,通常应该避免(参见:ejohn.org/blog/how-javascript-timers-work)。即使在较旧的浏览器上,让所有东西都完美运行的最纯粹的方法是通过为它们分配相同的功能来组合 onkeydown 和 onkeyup(一个用于在按下时修改文本,另一个用于在释放后修改文本)。
【解决方案2】:

这是来自 w3c 的关键事件引用的简单定义。

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

onkeydown onkeypress onkeyup 注意:onkeypress 事件不会被触发 适用于所有浏览器中的所有键(例如 ALT、CTRL、SHIFT、ESC)。检测 仅用户是否按下了键,使用 onkeydown 代替, 因为它适用于所有键。

这解释了 oninput 事件; http://help.dottoro.com/ljhxklln.php

oninput 事件支持所有主流浏览器,包括 IE 9 及更高版本。

oninput 比“次佳”的 onkeyup 更适合您的需求,因为 onkeyup 仅在释放键时触发。当您键入时,一旦按下它就会输入新值,但是它似乎在函数触发后将新值添加到框中。我将继续试验,因为我对如何做到这一点有另一个想法,但 oninput 似乎是目前最好的关键事件。

document.getElementById('my').oninput = function(event) {
  this.value = this.value.toUpperCase()
}
&lt;input id='my' type="text"&gt;

更新

您仍然可以实际使用 onkeypress 事件,但您需要使用超时来等待新值插入到文本框中,然后再执行该函数。

这是另一个代码sn-p....

document.getElementById('my').onkeypress = function(event) {
  var elem = this;
  window.setTimeout(function() {
    elem.value = elem.value.toUpperCase()
  }, 0);
}
&lt;input id='my' type="text"&gt;

【讨论】:

  • 正要为oninput 表扬你,但你自己写了答案,所以我可以投票。
  • @Shomz stackoverflow 需要更多像你这样的人 :)
  • 哈哈,谢谢你,先生! SO上有很多很棒的人,你肯定是其中之一。
猜你喜欢
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
相关资源
最近更新 更多