html <input type =“ text” /> onchangeイベントが機能しない


87

私はいくつかの実験をしようとしています。私がしたいのは、ユーザーがテキストボックスに何かを入力するたびに、それがダイアログボックスに表示されることです。onchangeイベントプロパティを使用してそれを実現しましたが、機能しません。それを機能させるには、送信ボタンを押す必要があります。私はAJAXについて読み、これについて学ぶことを考えています。それを機能させるにはまだAJAXが必要ですか、それとも単純なJavaScriptで十分ですか?助けてください。

index.php

<script type="text/javascript" src="javascript.js"> </script>

<form action="index.php" method="get">
 Integer 1: <input type="text" id="num1" name="num1" onchange="checkInput('num1');" /> <br />
 Integer 2: <input type="text" id="num2" name="num2" onchange="checkInput('num2');" /> <br />
 <input type="submit" value="Compute" />
</form>

javascript.js

function checkInput(textbox) {
 var textInput = document.getElementById(textbox).value;

 alert(textInput); 
}

4
idの代わりに「this」を送信できるため、getElementByIdを呼び出す必要はありません
remi bourgarel 2011年

ええ... AshBurlaczenkoが私に言ったことをしてくれてありがとう...–
初心者コーダー

JQueryを使用すると、ここで提案された優れたソリューション:stackoverflow.com/a/8167009/2065594
Cyril Jacquart 2017年

回答:


127

onchangeコントロールがぼやけている場合にのみトリガーされます。onkeypress代わりに試してください。


19
ユーザーがクリップボードから貼り付けた後の変更を検出するために機能しません
Juozas Kontvainis 2013

19
それで私の問題は解決しました。( 'element.value')でonkeyup新しい値を取得するので、私は好みますinput
stealthjong 2014

4
また、少なくともjqueryを使用している場合は、バックスペースを押しても「keypress」が発生しないことに気付きました。「keyup」は、バックスペースを押して放した後に発生します。「入力」はこの問題を解決し、コピー&ペーストでも機能します。これが適切な解決策だと思います(ユーザー「99の問題-構文は1つではありません」が以下で指摘しているように)。
Patrick Finnigan

4
'onkeypres'、 'onkeyup'などは、テキストが変更された場合のみ関数を呼び出したい場合の解決策ではありません。この場合、主要なイベントによって不要なトラフィックが発生します。(この返信が解決策として選択されたのは非常に奇妙です。特に、非常に多くの票があります。返信を単に反対票を投じるのは好きではないので、反対票を投じません。理由を説明したいと思います。 OKではありません-もっと役に立ちます!)
Apostolos 2017

HTML≥5またはjQuery≥1.7の場合、クリップボードからの貼り付けも処理する他のソリューションが以下にあります。
user202729 2018年

41

.on('input'...jQuery 1.7以降からの入力(貼り付け、キーアップなど)へのすべての変更を監視するために使用します。

静的および動的入力の場合:

$(document).on('input', '.my-class', function(){
    alert('Input changed');
});

静的入力の場合のみ:

$('.my-class').on('input', function(){
    alert('Input changed');
});

静的/動的な例を使用したJSFiddle:https://jsfiddle.net/op0zqrgy/7/


これは私にとって完璧に機能しました-ありがとう。他の人への注意-onLoadで上記のコードを実際に実行するか、監視を開始するための何かを実行することを忘れないでください。
ロバートペンリッジ2014年

コメントするには遅すぎますが...応答するユーザーがプレーンなJavaScriptを表示している場合、なぜjQueryの使用を提案するのですか?
アンドレス・モラレス

@AndrésMoralesこれは、多くのアプリケーションがすぐにアクセスできる一般的なライブラリであり、アクセスできないアプリケーションに簡単に追加できます。明らかに、この回答は、jQueryを使用できない(または使用しないことを選択した)アプリケーションには適用されません。
rybo111

@ rybo111その通り!jQueryは一般的なライブラリであり、広く使用されていますが、私の脳内では、「JavaScriptを使用して2つの数値を合計する」というミームの質問と、jQueryを使用してそれを行うことについて最も賛成の回答に直接リンクしています。そうではありませんが、多くの人はJavaScriptとjQueryを分離できません。
アンドレス・モラレス

@AndrésMorales私の答えは「貼り付け、キーアップなど」をカバーしていることに注意してください。この質問に答えたとき(7年前!)、jQueryソリューションが便利だったことを思い出します。
rybo111

30

マウスクリックを使用して入力フィールドの内容を変更できるため、キーストロークのチェックは部分的な解決策にすぎません。テキストフィールドを右クリックすると、キーストロークを行わずに値を変更するために使用できるカットアンドペーストオプションがあります。同様に、オートコンプリートが有効になっている場合は、フィールドを左クリックして、以前に入力したテキストのドロップダウンを取得し、マウスクリックを使用して選択肢の中から選択できます。キーストロークトラッピングは、これらのタイプの変更のいずれも検出しません。

残念ながら、少なくとも私が知る限り、変更をすぐに報告する「onchange」イベントはありません。ただし、すべての場合に機能する解決策があります。setInterval()を使用してタイミングイベントを設定します。

入力フィールドのIDと名前が「city」であるとします。

<input type="text" name="city" id="city" />

「city」という名前のグローバル変数があります。

var city = "";

これをページの初期化に追加します。

setInterval(lookForCityChange, 100);

次に、lookForCityChange()関数を定義します。

function lookForCityChange()
{
    var newCity = document.getElementById("city").value;
    if (newCity != city) {
        city = newCity;
        doSomething(city);     // do whatever you need to do
    }
}

この例では、「city」の値は100ミリ秒ごとにチェックされ、必要に応じて調整できます。必要に応じて、lookForCityChange()を定義する代わりに無名関数を使用してください。コードまたはブラウザでさえ入力フィールドの初期値を提供する可能性があるため、ユーザーが何かを行う前に「変更」が通知される可能性があることに注意してください。必要に応じてコードを調整します。

10分の1秒ごとにタイミングイベントがオフになるという考えがうまくいかない場合は、入力フィールドがフォーカスを受け取ったときにタイマーを開始し、ぼかし時に(clearInterval()を使用して)タイマーを終了できます。フォーカスを受け取らずに入力フィールドの値を変更することはできないと思うので、この方法でタイマーのオンとオフを切り替えるのは安全なはずです。


1
フォーカスを取得せずに入力フィールドの値を変更することができず、要素がフォーカスを失ったときにブラーが発生する場合は、onblurの変更を探してみませんか?
パックマン2014

入力フィールドが変更されたとき、または変更後にフォーカスが失われたときにアクションを実行しますか?すぐに行動したいのなら、オンブラーを待つことはできません。
トンボ

@Pakmanそれは場合によってはまともな解決策です。しかし、入力どおりの検索を実行したい場合は、非常に優れた機能IMO(コンピューターが非常に高速で退屈することなく実行できるのに、なぜユーザーは何かを探す必要があるのでしょうか?)テキストが変更されたときに発生する必要がありますが、なぜできないのですか?
ダグ

これになるととても悲しい。
チャックバトソン2016年

1
@ChuckBatsonこの回答は2012年のものです。2016年にコメントを投稿したことに気付きました。jQueryを使用している場合は私の回答を参照してください。今では信じられないほど簡単です。
rybo111 2016

26

HTML5は、oninputすべての直接的な変更をキャッチするイベントを定義します。わたしにはできる。


1
type = "number"スピナーコントロールでも機能します(onkeypressは機能しません)。
ボブ

13

onchange 入力要素への変更がユーザーによってコミットされた場合にのみ発生します。ほとんどの場合、これは要素がフォーカスを失ったときです。

要素の値が変更されるたびに関数を起動する場合は、oninputイベントを使用する必要があります。これは、ユーザーのマウスで値を変更できるため、キーのアップ/ダウンイベントよりも優れています。つまり、貼り付けや自動入力などです。

変更イベントの詳細については、こちらをご覧ください

入力イベントの詳細については、こちらをご覧ください


11

「onchange」の代わりに次のイベントを使用する

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

6

まず、「機能しない」とは何ですか?アラートが表示されませんか?

また、あなたのコードはこれに単純化することができます

<input type="text" id="num1" name="num1" onkeydown="checkInput(this);" /> <br />

function checkInput(obj) {
    alert(obj.value); 
}

2

Safariがテキスト入力フィールドで「onchange」イベントを発生させないという問題が発生しました。jQuery 1.7.2の「変更」イベントを使用しましたが、どちらも機能しませんでした。結局、ZURBのtextchangeイベントを使用しました。これはmouseeventsで機能し、フィールドを離れることなく起動できます:http://www.zurb.com/playground/jquery-text-change-custom-event

$('.inputClassToBind').bind('textchange', function (event, previousText) {
    alert($(this).attr('id'));
});

2

IMOが重要であるといういくつかのコメント:

  • USERアクションENTERまたはblurawaitが正しい動作になるまで、入力要素が「change」イベントを発行しない

  • 使用したいイベントは"input"( " oninput ")です。ここでは、2つの違いがよく示されていますhttps//javascript.info/events-change-input

  • 2つのイベントは、2つの異なるユーザージェスチャ/モーメントを通知します(「入力」イベントは、ユーザーが選択リストオプションを記述またはナビゲートしているが、変更を確認しなかったことを意味します。「変更」は、ユーザーが値を変更したことを意味します(入力またはぼかしを使用)私たちの)

  • この場合、ここで推奨されている多くのような重要なイベントを聞くことは悪い習慣です。(入力に対するENTERのデフォルトの動作を変更する人のように)...

  • jQueryはこれとは何の関係もありません。これはすべてHTML標準です。

  • これが正しい動作である理由を理解するのに問題がある場合は、おそらく役立つでしょう。実験として、マウス/パッドなしで、キーボードだけでテキストエディタまたはブラウザを使用してください。

私の2セント。


1

onkeyupは私のために働いた。スペースを押し戻すときにonkeypressはトリガーされません。


値を貼り付けるとどうなりますか?私も「onpaste」を使用してイベントをトリガーします
Louis

1

onchange(event)一緒に使用することをお勧めします<select>。では<input>、あなたのイベントの下に使用することができます。

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

-3

試してみてくださいonpropertychange。IEでのみ機能します。


6
開発者によって放棄された廃止されたブラウザでのみ機能するプロパティを検討したいのはなぜですか?反対票を投じる。
Sod Almighty 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.