在 input type="text" 中按您输入的方式跟踪 onchange 的最佳方法?

IT技术 javascript html forms
2021-02-01 02:14:50

根据我的经验,input type="text" onchange事件通常只有在您离开 ( blur) 控件后才会发生

有没有办法强制浏览器在onchange每次textfield内容更改时触发如果不是,那么“手动”跟踪这种最优雅的方式是什么?

使用onkey*事件并不可靠,因为您可以右键单击该字段并选择粘贴,这将在没有任何键盘输入的情况下更改该字段。

setTimeout唯一的方法吗?...丑:-)

6个回答

这几天听听oninput 感觉就像onchange不需要失去对元素的关注。它是 HTML5。

除了 IE8 及更低版本之外,所有人(甚至移动设备)都支持它。对于 IE 添加onpropertychange. 我像这样使用它:

const source = document.getElementById('source');
const result = document.getElementById('result');

const inputHandler = function(e) {
  result.innerHTML = e.target.value;
}

source.addEventListener('input', inputHandler);
source.addEventListener('propertychange', inputHandler); // for IE8
// Firefox/Edge18-/IE9+ don’t fire on <select><option>
// source.addEventListener('change', inputHandler); 
<input id="source">
<div id="result"></div>

在像 Web 标准这样不断变化的世界中,有时接受的答案可能会在几年后改变……这是我接受的新答案。
2021-03-14 02:14:50
oninputIE9 的支持虽然是部分的(caniuse.com/#feat=input-event)。
2021-03-25 02:14:50
可能值得使用innerText代替,innerHTML以便不呈现任何标记
2021-03-29 02:14:50

更新:

请参阅另一个答案(2015 年)。


2009 年的原始答案:

那么,您希望onchange事件在按键、模糊粘贴时触发吗?那是魔法。

如果您想在键入时跟踪更改,请使用"onkeydown". 如果您需要使用鼠标捕获粘贴操作,请使用"onpaste"( IE , FF3 ) 和"oninput"( FF, Opera, Chrome, Safari 1 )。

1断为<textarea>在Safari。使用textInput替代

onkeypress应该使用而不是onkeydown. onkeydown当一个键被按下时触发。如果用户按住某个键,该事件只会针对第一个字符触发一次。onkeypress每当向文本字段添加字符时触发。
2021-03-24 02:14:50
使用 jquery 1.8.3,看起来像: $().on('change keydown paste input', function() {})
2021-03-26 02:14:50
onchange对所有这些行为发火并不是很神奇<input onchange="doSomething();" onkeypress="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();">对大多数人来说已经足够好了。
2021-03-27 02:14:50
@AriWais:是的,应该弃用大部分 SO。乡亲这个答案是8岁我希望像这个这样的旧答案有一个“弃用”按钮,社区可以选择更好的一个。
2021-04-06 02:14:50
用鼠标删除输入框中的一些文本怎么样?我不认为这会奏效。
2021-04-07 02:14:50

下面的代码对我来说很好用 Jquery 1.8.3

HTML : <input type="text" id="myId" />

Javascript/JQuery:

$("#myId").on('change keydown paste input', function(){
      doSomething();
});
Jquery 是一个 Javascript api,我是通过使用 Jquery 关键字进行搜索带到这里的,我认为不值得为 Jquery 答案的每个 javascript 问题创建一个新问题......
2021-03-14 02:14:50
问题中未标记jQuery
2021-03-23 02:14:50
多次触发。可能是由于更改和keydown。可能只需要在这里输入。
2021-03-23 02:14:50
如果不允许人们在答案中建议使用图书馆,那么关于 SO 的问题将会更多
2021-03-27 02:14:50
你不需要keydown因为它会复制输入的值,删除它。
2021-04-06 02:14:50

Javascript 在这里是不可预测和有趣的。

  • onchange 仅在您模糊文本框时发生
  • onkeyup&onkeypress并不总是发生在文本更改时
  • onkeydown 在文本更改时发生(但无法通过鼠标单击跟踪剪切和粘贴)
  • onpaste&oncut发生在按键甚至鼠标右键单击时。

因此,要跟踪文本框的变化,我们需要onkeydown,oncutonpaste在这些事件的回调中,如果您检查文本框的值,那么您将不会获得更新的值,因为该值在回调后发生了变化。因此,对此的解决方案是设置一个超时函数,超时为 50 毫秒(或可能更少)以跟踪更改。

这是一个肮脏的黑客,但这是我研究过的唯一方法。

这是一个例子。 http://jsfiddle.net/2BfGC/12/

对于第二个要点,我假设您的意思是onkeyuponkeydown,它们是相似的。两者都可以捕获 Ctrl、Alt、Shift 和 Meta 键。对于第三个要点,我假设您的意思是onkeypress.
2021-03-27 02:14:50
oninput并且textInput是事件,这是对此的实际解决方案,但并非所有浏览器都支持。
2021-04-03 02:14:50

我认为在 2018 年最好使用该input事件。

——

正如 WHATWG 规范所描述的(https://html.spec.whatwg.org/multipage/indices.html#event-input-input):

当用户更改值时在控件上触发(另请参阅更改事件

——

以下是如何使用它的示例:

<input type="text" oninput="handleValueChange()">
这听起来不错。许多开发人员似乎忘记了 IME 语音听写和滑动的存在。非游戏输入,要求特定的键码是可访问性敌意和探测破坏。经验法则是,在失去焦点时阅读文本......之前不是。如果你想成为一个 IME,看看 Octo.app 做了什么。
2021-04-05 02:14:50