入力要素のJavascript変更イベントは、フォーカスを失ったときにのみ発生します


84

入力要素があり、コンテンツの長さをチェックし続けたいのですが、長さが特定のサイズに等しくなるたびに送信ボタンを有効にしたいのですが、イベントとしてのJavascriptのonchangeイベントで問題が発生しています入力要素がスコープ外になったときにのみ発生し、内容が変更されたときには発生しません。

<input type="text" id="name" onchange="checkLength(this.value)" />

---- onchangeは、名前の内容を変更しても発生しませんが、名前のフォーカスが外れた場合にのみ発生します。

このイベントをコンテンツの変更で機能させるためにできることはありますか?または私がこれに使用できる他のイベント?onkeyup関数を使用して回避策を見つけましたが、ブラウザーのオートコンプリーターから一部のコンテンツを選択しても起動しません。

キーボードでもマウスでも、フィールドの内容が変わっても機能するものが欲しいのですが…何かアイデアはありますか?


あなたは使用することができますonkeyuponchange
James Allardice 2011

1
私が抱えている唯一の問題は、ブラウザのオートコンプリートを選択しても、これらのイベントが発生しないことです。
Sachin Midha 2011

これはどのような入力フィールドですか?
powtac 2011

ああ...私はそれをサンプルコード、そのテキストフィールドに追加するのを忘れました。
Sachin Midha 2011

1
これは非常に一般的な問題であり、多くの人が直面していると思いましたが、今は逆のようです... :)
Sachin Midha 2011

回答:


120
(function () {
    var oldVal;

    $('#name').on('change textInput input', function () {
        var val = this.value;
        if (val !== oldVal) {
            oldVal = val;
            checkLength(val);
        }
    });
}());

これは、キャッチするchange、キーストローク、pastetextInputinput(使用可能な場合)。そして、必要以上に発砲しないでください。

http://jsfiddle.net/katspaugh/xqeDj/


参照:

textInput— W3CDOMレベル3イベントタイプ。http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

ユーザーエージェントは、1つ以上の文字が入力されたときに、このイベントをディスパッチする必要があります。これらの文字は、さまざまなソースから発生する可能性があります。たとえば、キーボードデバイスでキーを押したり離したりした結果、入力方式エディターの処理、または音声コマンドから発生した文字です。「貼り付け」操作で単純な文字シーケンスが生成される場合、つまり、構造やスタイル情報のないテキストパッセージが生成される場合は、このイベントタイプも生成する必要があります。

input- HTML5のイベントタイプ。

ユーザーが値を変更したときにコントロールで起動されます

Firefox、Chrome、IE9およびその他の最新のブラウザがサポートしています。

このイベントは、要素がフォーカスを失ったときに発生するonchangeイベントとは異なり、変更直後に発生します。


1
それは機能していません...あなたはあなたの最後にあなたのコードをチェックしましたか?オートコンプリーターからの選択に取り組んでいましたか...?
Sachin Midha 2011

textInputChrome 15をチェックインしましたが、機能します。inputIE9でイベントをチェックしましたが、それも機能します。FirefoxはサポートするはずDOMAttrModifiedですが、インストールしていません。これらの2つのイベントは、あらゆる種類のテキスト入力で発生するため、期待できる最高のイベントです。
katspaugh 2011

1
素晴らしい解決策....入力は私にとって祝福のように機能しました...入力以外は何も必要ありません、それ自体は十分に機能します。ff4では動作しますが、3.xでは動作しません。デスクトップに3.6があり、動作しませんでした...
Sachin Midha 2011

5
物事を最新の状態に保つために、現在、このソリューションはFF22での単一の入力変更で複数回起動され、キー押下またはテキスト入力イベントを使用する必要はありません。入力とプロパティの変更で十分です
サイバーガード

1
私はそれを見つけたchangekeyupと、inputIE9とFirefox(36.0.4)をカバーするための最良の組み合わせでした。このkeypressイベントは、DeleteやBackspaceなどをキャプチャしなかったため、IE9で機能していないようでした。また、このイベントはinput、キーボードとコンテキストメニューを使用した貼り付けを対象としています。
TLS

9

katspaughの答えの拡張として、cssクラスを使用して複数の要素に対してそれを行う方法を次に示します。

   $('.myclass').each(function(){
        $(this).attr('oldval',$(this).val());
   });

   $('.myclass').on('change keypress paste focus textInput input',function(){
       var val = $(this).val();
       if(val != $(this).attr('oldval') ){
           $(this).attr('oldval',val); 
           checkLength($(this).val());
        }
    });

4

それを見つけるのに30分かかりましたが、これは2019年6月に機能しています。

<input type="text" id="myInput" oninput="myFunction()">

jsでプログラムでイベントリスナーを追加したい場合

inputElement.addEventListener("input", event => {})

3

それをjQueryの方法で行います。

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


$('#name').keyup(function() {
  alert('Content length has changed to: '+$(this).val().length);
});

1
これは、フィールドが焦点を失ったときにのみ発生します。
Felix Kling 2011

@Felix Kling、本当、それをkeyup()に変更しました;)
powtac 2011

キーアップでも同じ問題が発生しました...使用しましたが、問題が発生しました。私の完全な質問を読んでください。
Sachin Midha 2011

0

onkeyupを使用できます

<input id="name" onkeyup="checkLength(this.value)" />

私はonkeyupを使用しました...しかし、ユーザーがブラウザのオートコンプリートから選択した場合、このイベントはトリガーされません...私が使用した回避策の質問にこれをすでに書いています...
Sachin Midha

0

すべての可能性を捉えたい場合はonkeyup、とonclick(またはonmouseup)の組み合わせを使用する必要があります。

<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />

良い試みですが、ここでの問題は、入力要素ではなくオート
コンプリーターで

私が考えることができる他の唯一のこと、そしてそれは厄介な厄介なことですsetTimeoutが、フィールドの値を定期的にチェックすることです...あなたは正確に何をしたいですか?
DaveRandom 2011

それは非常に厄介です...:Dこれはパスワード強度インジケーターが行うことと似ています。パスワードを入力し続けると、パスワードの強度がわかります。入力した文字列の長さが10の場合にのみボタンを有効にし、それ以外の場合は無効のままにします。私は...あなたはそれを得た願っています
サチンMidha

0

これが私が同じ問題のために開発した別の解決策です。ただし、多くの入力ボックスを使用するため、要素自体のユーザー定義属性として古い値「data-value」を保持します。jQueryを使用すると、管理が非常に簡単になります。

        $(document).delegate('.filterBox', 'keyup', { self: this }, function (e) {
            var self = e.data.self;

            if (e.keyCode == 13) {
                e.preventDefault();
                $(this).attr('data-value', $(this).val());
                self.filterBy(this, true)
            }
            else if (e.keyCode == 27) {
                $(this).val('');
                $(this).attr('data-value', '');
                self.filterBy(this, true)
            }
            else {
                if ($(this).attr('data-value') != $(this).val()) {
                    $(this).attr('data-value', $(this).val());
                    self.filterBy(this);
                }
            }
        });

ここでは、クラス 'filterBox'を持つ5〜6個の入力ボックスを使用しました。data-valueがそれ自体の値と異なる場合にのみfilterByメソッドを実行します。

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