入力type =“ text”で入力時の入力どおりに変更を追跡する最良の方法?


449

私の経験では、input type="text" onchangeイベントは通常blur、コントロールを離れた()後にのみ発生します。

コンテンツが変更さonchangeれるたびにブラウザーを強制的にトリガーする方法はありtextfieldますか?そうでない場合、これを「手動で」追跡する最もエレガントな方法は何ですか?

onkey*フィールドを右クリックして[貼り付け]を選択できるため、イベントの使用は信頼できません。これにより、キーボード入力なしでフィールドが変更されます。

あるsetTimeout唯一の方法は?..醜い:-)


@古い回答がトップに固定されないように、受け入れられた回答を更新できる可能性はありますか?
Flimm

回答:


271

更新:

別の回答(2015)を参照してください。


2009年の元の回答:

だから、あなたがしたいonchangeのKeyDown、ぼかしの火災にイベントを、そして貼り付けますか?それは魔法です。

入力時に変更を追跡する場合は、を使用します"onkeydown"。マウスで貼り付け操作をトラップする必要がある場合は、"onpaste"IEFF3)および"oninput"FF、Opera、Chrome、Safari 1)を使用してください。

1 Safariで壊れまし<textarea>た。textInput代わりに使用


22
onkeypressの代わりに使用する必要がありonkeydownます。onkeydownキーがクリックされたときに発生します。ユーザーがキーを押したままにすると、イベントは最初の文字に対して1回だけ発生します。onkeypressテキストフィールドに文字が追加されるたびに発生します。
フェント

61
onchangeこれらすべてのアクションに発砲することは、それほど魔法ではありません。 <input onchange="doSomething();" onkeypress="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();">ほとんどの場合、十分に機能します。
aroth

1
マウスを使用して入力ボックスの一部のテキストを削除するのはどうですか?これでうまくいくとは思いません。
Jeevan 2012

47
jqueryの1.8.3を使用すると、以下のようになります$().on('change keydown paste input', function() {})
Narfanator

4
@AriWais:はい、ほとんどのSOは廃止する必要があります。この答えは8歳です。このような古い回答には「非推奨」ボタンがあればよかったのですが、コミュニティはより良いものを選択できました。
クレセントフレッシュ

658

最近は聞いてい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>


63
Web標準のような絶え間なく変化する世界では、受け入れられた答えが数年後に変更される場合があります...これは私にとって新しい受け入れられた答えです。
Erick Petrucelli 2015年

1
oninputIE9でもサポートは部分的です(caniuse.com/#feat=input-event)。
Kenston Choi 2018

マークアップがレンダリングされないようinnerTextにの代わりに使用する価値があるかもしれinnerHTMLません
Jeevan Takhar

47

以下のコードは、Jquery 1.8.3で私にとってうまくいきます

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

JavaScript / JQuery:

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

11
jQuery ライブラリは質問でタグ付けされていません。
John Weisz

21
JqueryはJavascript APIであり、Jqueryキーワードを使用した検索でここに連れて来られました。Jqueryの回答について各JavaScriptの質問に対して新しい質問を作成する価値はないと思います...
GaelDev

12
回答でライブラリの使用を提案することを人々が許可されなかった場合、SOに関する多くの未回答の質問があります
dietbacon

3
複数回発砲します。変更とキーダウンが原因と思われます。おそらく入力はここでのみ必要です。
mmm

1
keydown入力の値を複製するので必要ありません。削除してください。
ユセフアルスバイヒ

43

Javascriptはここでは予測不可能で面白いです。

  • onchange テキストボックスをぼかした場合にのみ発生します
  • onkeyuponkeypressテキストの変更時に常に発生するとは限りません
  • onkeydown テキストの変更時に発生します(ただし、マウスクリックではカットアンドペーストを追跡できません)
  • onpasteoncutは、キーを押すだけでなく、マウスの右クリックでも発生します。

したがって、テキストボックスの変更を追跡するにはonkeydownoncutとが必要onpasteです。これらのイベントのコールバックで、テキストボックスの値を確認すると、コールバック後に値が変更されるため、更新された値を取得できません。したがって、これに対する解決策は、50ミリ秒(またはそれ以下)のタイムアウトでタイムアウト関数を設定して、変更を追跡することです。

これは汚いハックですが、私が調査したように、これが唯一の方法です。

ここに例があります。 http://jsfiddle.net/2BfGC/12/


4
oninputそしてtextInputこのため、実際のソリューションですが、そのすべてのブラウザでサポートされていないイベントです。
Sanket Sahu

2番目の箇条書きについては、あなたがとを意味しているonkeyupと思いますonkeydown。どちらもCtrl、Alt、Shift、およびMetaキーをキャプチャできます。3番目の箇条書きについては、あなたが意図したものだと思いますonkeypress
ダニエルスティーブンス

12

onkeyupたとえば、入力した後t、指を離したときに押すとアクションが発生しますがkeydown、アクションを実行する前に、文字をディジットしますt

これが誰かのために役立つことを願っています。

だから、onkeyupあなたは今入力した内容送信したいときのためのより良いです。


8

同様の要件がありました(twitterスタイルのテキストフィールド)。中古品onkeyuponchangeonchange実際には、フィールドからフォーカスを失ったときのマウスペースト操作を処理します。

[更新] HTML5以降では、oninput上記の他の回答で説明されているように、を使用してリアルタイムの文字変更更新を取得します。


oninputは、textarea、input:text、input:password、またはinput:search要素のコンテンツがいつ変更されたかを検出する場合に便利です。これらの要素のonchangeイベントは、要素がフォーカスを失ったときに発生し、変更直後ではありません。 。
hkasera

@hkaseraはい、HTML5 oninputを使用する方法です。私が実装された場合でも、:( HTML5は存在しなかったと我々はIE 8を持っていた、それはユーザーのために最新の情報を提供して、私はあなたの更新に感謝。。
Mohnish


7

Internet Explorerのみを使用している場合、これを使用できます。

<input type="text" id="myID" onpropertychange="TextChange(this)" />

<script type="text/javascript">
    function TextChange(tBox) {
        if(event.propertyName=='value') {
            //your code here
        }
    }
</script>

お役に立てば幸いです。


8
私が推測する社内プロジェクトのためかもしれません... :)
eselk

94
私はその家に住んでいない神に感謝します!:D
マルコマタラッツィ

13
10年前にこの文で面白いものはないだろう。.. :(
のMichał小太鼓

4
私にとってこれは役立ちます。IEが唯一のブラウザーである、OSが埋め込まれた一部のモバイル向けのプロジェクトを開発しています。
Anders M.

3
Internet Explorerのみを使用している場合-LOL。2016年の一日を終えました。
ジャックブラック

4

かなり近い解決策があります(すべての貼り付け方法を修正しないでください)が、それらのほとんど:

入力だけでなく、テキストエリアでも機能します。

<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も呼び出されます。

コードのチェックに時間がかからないことを確認してください。そうしないと、ユーザーの理解が低下します。

はい、トリックはキーとマウスで発射することです...しかし、両方が発射される可能性があるので、そのことを覚えておいてください!!!


4

JQueryを使用して次のアプローチを判断してください。

HTML:

<input type="text" id="inputId" />

JavaScript(JQuery):

$("#inputId").keyup(function(){
        $("#inputId").blur();
        $("#inputId").focus();
});

$("#inputId").change(function(){
        //do whatever you need to do on actual change of the value of the input field
});

私は同じように使用します:)
khaled Dehia '25

私はこれが最新の答えではないことを認識していますが、入力の終わり以外の場所にある場合は、キーアップごとに入力をぼかして再度フォーカスしないと、カーソルの配置が台無しになりませんか?
マイケルマーティンスマッカー

@ MichaelMartin-Smuckerそう思うかもしれ
Clonkex 2017

4

「入力」は私のために働いた。

var searchBar  = document.getElementById("searchBar");
searchBar.addEventListener("input", PredictSearch, false);


3

それぞれを追跡するには、この例を試してください。その前に、カーソルの点滅速度を完全にゼロに下げてください。

<body>
//try onkeydown,onkeyup,onkeypress
<input type="text" onkeypress="myFunction(this.value)">
<span> </span>
<script>
function myFunction(val) {
//alert(val);
var mySpan = document.getElementsByTagName("span")[0].innerHTML;
mySpan += val+"<br>";
document.getElementsByTagName("span")[0].innerHTML = mySpan;
}
</script>

</body>

onblur:終了時にイベントが生成されます

onchange:inputtextで変更が行われた場合、終了時にイベントが生成されます

onkeydown:キーが押されるとイベントが生成されます(長時間キーを押した場合も)

onkeyup:キーが離されるとイベントが生成されます

onkeypress:onkeydown(またはonkeyup)と同じですが、ctrl、backsace、alt otherには反応しません


1

ここ2018年、これは私がすることです:

$(inputs).on('change keydown paste input propertychange click keyup blur',handler);

このアプローチの欠陥を指摘していただければ幸いです。


2
ここでは2019、これはキーを押すたびに複数回発生します。例については、こちらをご覧ください:jsfiddle.net/sp00n82/3r4691tq/5
sp00n

1

方法1:のイベントリスナーを追加しinputます。

element.addEventListener("input", myFunction);

 

方法2:oninput JavaScriptでプロパティを定義します。

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

 

方法3:oninputプロパティをHTMLで定義します。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.