val()はjQueryでchange()をトリガーしません


343

changeボタンで値を変更したときにテキストボックスでイベントをトリガーしようとしていますが、機能しません。このフィドルを確認してください。

テキストボックスに何かを入力して別の場所をクリックすると、changeトリガーされます。ただし、ボタンをクリックすると、テキストボックスの値は変更されますが、changeトリガーされません。どうして?



タイトル自体が私の質問に答えました。.change() yellow で確認「注:JavaScriptを使用して、たとえば.val()を使用してinput要素の値を変更しても、イベントは発生しません。」
Bob Stein、

私がstackoverflow.com/questions/11873721/に出会ったらいいのに… もっと早く、それがいくつかに役立つことを願っています。
JeopardyTempest

回答:


454

onchange ユーザーが入力を入力し、入力がフォーカスを失ったときにのみ発生します。

onchange値を設定した後で、手動でイベントを呼び出すことができます。

$("#mytext").change(); // someObject.onchange(); in standard JS

または、次を使用してイベントをトリガーできます。

$("#mytext").trigger("change");

18
jqueryを拡張して、好きなことを行うsay valWithChange関数を追加してください。ユーザーが要素を操作した場合にのみ、自動化された値の変更からイベントがトリガーされないようにするため、これをデフォルトのアクションにすることはできません
redsquare

8
メソッド.change()へのチェーンのオプションに対処するために、この回答を編集してほしい.val()
Snekse

19
その理由は、入力の検証を行うために電話をかける人.val()がいる.change()ためです。トリガ.change()には、.val()無限ループが発生します。
2012

7
彼らが値を自分の検証に失敗するようなものに変更した場合にのみ、それはばかげたことでしょう。
Leng

3
私は結局、blur同じようなことを成し遂げることに拘束されました:$('#mytext').focus().val('New text').blur();
ウェス・ジョンソン

63

redsquareの優れた提案から、これはうまく機能します:

$.fn.changeVal = function (v) {
    return this.val(v).trigger("change");
}

$("#my-input").changeVal("Tyrannosaurus Rex");

5
あなたがラップする必要はありませんthisreturn this.val(v).trigger("change");
氏Polywhirl

27

val元のval関数のプロキシに置き換えることで、変更をトリガーする関数を非常に簡単にオーバーライドできます。

このコードをドキュメントのどこかに追加するだけです(jQueryを読み込んだ後)

(function($){
    var originalVal = $.fn.val;
    $.fn.val = function(){
        var result =originalVal.apply(this,arguments);
        if(arguments.length>0)
            $(this).change(); // OR with custom event $(this).trigger('value-changed');
        return result;
    };
})(jQuery);

実際の例:ここ

(これは、値が実際に変更されていなくてもchangeval(new_val)が呼び出されたときに常にトリガーされることに注意してください。)

値が実際に変更されたときにのみ変更をトリガーする場合は、次のように使用します。

//This will trigger "change" event when "val(new_val)" called 
//with value different than the current one
(function($){
    var originalVal = $.fn.val;
    $.fn.val = function(){
        var prev;
        if(arguments.length>0){
            prev = originalVal.apply(this,[]);
        }
        var result =originalVal.apply(this,arguments);
        if(arguments.length>0 && prev!=originalVal.apply(this,[]))
            $(this).change();  // OR with custom event $(this).trigger('value-changed')
        return result;
    };
})(jQuery);

そのライブの例:http : //jsfiddle.net/5fSmx/1/


4
うーん、不要なアヒルのパッチングだと思います:-p。redsquareによってコメントされているように、そのような関数にとは異なる名前を付ける方が良い場合があり.val()ます。
binki 2014年

1
名前を変更する場合は、既存のコードを変更する必要があります。これにより、既存のコードは引き続き機能します
Yaron U.

4
しかし、正しい定義を.val()念頭に置いて書かれたすべてのコードは、突然副作用を生み出し始めます:-p。
binki 2014年

2
これはプラグインの誤動作も
引き起こし、それほど

1
副作用を回避するために、上記のようにval関数を変更しましたが、別のイベント( "val")をトリガーしています。これにより、既存のコードを保持しながら、必要なときにいつでも簡単に処理できます:$(... ).on( 'change val'、...)
ulu



8

イベントは泡立っていないようです。これを試して:

$("#mybutton").click(function(){
  var oldval=$("#mytext").val();
  $("#mytext").val('Changed by button');
  var newval=$("#mytext").val();
  if (newval != oldval) {
    $("#mytext").trigger('change');
  }
});

これがお役に立てば幸いです。

$("#mytext").trigger('change')古い値を保存せずに単純な古いものを試しましたが.change、値が変わらなくても火災が発生しました。そのため、以前の値を保存し、$("#mytext").trigger('change')変更された場合にのみ呼び出しました。


これは、HTML要素の変更の現在の効果的な実装であるため、これ以上の投票はありませんでした。
vol7ron 2014

4

2019年2月.addEventListener()現在、jQuery .trigger()または.change()では動作しません。Chrome またはFirefoxを使用して以下でテストできます。

txt.addEventListener('input', function() {
  console.log('not called?');
})
$('#txt').val('test').trigger('input');
$('#txt').trigger('input');
$('#txt').change();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" id="txt">

.dispatchEvent()代わりに使用する必要があります。

txt.addEventListener('input', function() {
  console.log('it works!');
})
$('#txt').val('yes')
txt.dispatchEvent(new Event('input'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="text" id="txt">


1

https://api.jquery.com/change/から:

changeその値が変化したときにイベントが要素に送られます。このイベントは、<input>要素、<textarea>ボックス、<select>要素に限定されています。選択ボックス、チェックボックス、ラジオボタンの場合、ユーザーがマウスで選択を行うとすぐにイベントが発生しますが、他の要素タイプの場合は、要素がフォーカスを失うまでイベントは遅延されます。


1

私はこれが古いスレッドであることを知っていますが、見ている他の人にとって、上記の解決策はおそらくchangeイベントをチェックするのではなく、イベントをチェックするのではなく、次のようには良くありませんinput

$("#myInput").on("input", function() {
    // Print entered value in a div box
    $("#result").text($(this).val());
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.