根据我的经验,input type="text" onchange事件通常只发生在你离开(模糊)控件之后。

有办法迫使浏览器触发onchange每次文本字段内容的变化?如果不是,那么“手动”跟踪这种情况的最佳方法是什么?

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

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


当前回答

有一个相当接近的解决方案(不修复所有粘贴方式),但他们中的大多数:

它适用于输入以及文本区域:

<input type="text" ... >
<textarea ... >...</textarea>

这样做:

<input type="text" ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >
<textarea ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >...</textarea>

就像我说的,不是所有的方法都可以在所有浏览器上粘贴一个事件…最糟糕的是,有些根本不发射任何事件,但定时器是可怕的用于这样。

但大多数粘贴方式是通过键盘和/或鼠标完成的,所以通常粘贴后会触发onkeyup或onmouseup,在键盘上输入时也会触发onkeyup。

确保你检查代码不花太多时间…否则会给用户留下不好的印象。

是的,诀窍是对键和鼠标开火…但要小心两者都可能被解雇,所以要记住这一点!!

其他回答

方法一:为输入添加事件监听器:

element.addEventListener("input", myFunction);

 

方法2:用JavaScript定义oninput属性:

element.oninput = function()
{
    myFunction();
};

 

方法3:用HTML定义oninput属性:

<input type="text" oninput="myFunction();">

您也可以使用按下键、按上键和按下键事件。

下面的代码为我工作良好的Jquery 1.8.3

HTML: <输入类型=“文本”id=“myId”/>

Javascript/JQuery:

$("#myId").on('change keydown paste input', function(){
      doSomething();
});

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

Onchange只在模糊文本框时发生 Onkeyup & onkeypress并不总是发生在文本更改 Onkeydown发生在文本更改时(但不能跟踪鼠标点击的剪切和粘贴) Onpaste & oncut发生在键盘,甚至鼠标右键单击。

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

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

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

更新:

参见Another answer(2015)。


2009年原文答案:

你想让onchange事件触发按下键,模糊和粘贴?这是魔法。

如果你想在他们输入时跟踪更改,使用"onkeydown"。如果你需要用鼠标捕捉粘贴操作,请使用“onpaste”(IE, FF3)和“oninput”(FF, Opera, Chrome, Safari1)。

在Safari上<textarea>破碎。使用textInput代替