val()関数で<select>の値を設定するときにchange()イベントをトリガーします


132

select要素の値を設定するときに変更イベントをトリガーする最も簡単で最良の方法は何ですか。

私は次のコードを実行することを期待していました

$('select#some').val(10);

または

$('select#some').attr('value',  10);

結果としてchangeイベントがトリガーされますが、これはかなり論理的なことだと思います。正しい?

まあ、そうではありません。これを実行してchange()イベントをトリガーする必要があります

$('select#some').val(10).change();

または

$('select#some').val(10).trigger('change');

しかし、selectの値がjavascriptコードによって変更されるとすぐに変更イベントをトリガーするいくつかのソリューションを探しています。


純粋なjavascript element.addEventListener?
Manuel Bitto、2011

4
$( 'select#some')。val(10).change(); ユーザーにとってはほとんど瞬時です。
ディミトリ

@マヌエル私はそれを試しました。iv'e使用されたobject.change = function(....およびobject.addEventListener(...しかし、object.value、$(object).val()、および$(object).attr( 'value')のいずれも使用されていません)そのリスナーをトリガーします
ゴランRadulovic

回答:


124

非常によく似た問題があり、提案されたコードがうまく機能したため、問題の原因がよくわかりません。それはすぐに(あなたの要件)、次の変更コードをトリガーします。

$('#selectField').change(function(){
    if($('#selectField').val() == 'N'){
        $('#secondaryInput').hide();
    } else {
        $('#secondaryInput').show();
}
});

次に、データベースから値を取得し(これはフォームで新しい入力と既存のレコードの編集の両方に使用されます)、選択した値として設定し、上記のコード".change()をトリガーするために欠落していた部分を追加します

$('#selectField').val(valueFromDatabase).change();

そのため、データベースの既存の値が「N」の場合、フォームの2次入力フィールドがすぐに非表示になります。


これはまさに私が必要としたものです。DOMイベントハンドラーを動的にトリガーする方法を発見する最良の方法は何ですか?jQueryはこれを文書化していますか?ありがとうございました!
Con Antonakos、2014年

2
$( "#discount_type").val(2).trigger( 'change');
Satanand Tiwari

$( '#add_itp_spt_parent_id')。val(add_fpt_val).trigger( 'change'); $( '#add_itp_spt_parent_id')。change(); 両方のソリューションが機能していません。
Kamlesh

あなたが使用する前に定義された変更機能は、私の問題を解決しました。ありがとう。
Kamlesh

45

私が見つけた1つのこと(難しい方法)は、

$('#selectField').change(function(){
  // some content ...
});

使用する前に定義

$('#selectField').val(10).trigger('change');

または

 $('#selectField').val(10).change();

4
古い投稿ですが、これで私の問題は解決し、長い時間を費やす脳のクラッキングから私を救いました...それを使用する前に、リスナーを定義する必要があります。純粋なJavaScriptでもです。
Temitayo、2015

少し詳しく説明してもらえますか?このため、「change()」はありませんか?
ディマR.

まあ、この種のリスナーはロード時に巻き上げられないかもしれません。私のプロジェクトではchange()、リスナーを定義する前にをchange()呼び出しましたが、呼び出しをリスナーの下に移動して機能するまで機能しませんでした。さて、これは問題にはならないはずです。それは、コードを構造化する方法の問題にすぎません。
Temitayo、2015

1
これは私が必要としたものです。この問題を解決するために私を永遠に連れて行ってくれて、ありがとう。
ジェイミーM.

ブラボー!!! 「あなたが使用する前に定義された変更機能」は、私の問題を解決しました。親愛なるありがとう。
Kamlesh

17

正解はすでに重複した質問にあります:val()を使用してselectの値を設定すると、jquery changeイベントがトリガーされないのはなぜですか?

おそらくご存知のとおり、selectの値を設定してもchange()イベントはトリガーされません。JSを通じて要素の値が変更されたときに発生するイベントを探している場合、イベントはありません。

本当にこれを実行したい場合は、間隔でDOMをチェックし、変更された値を追跡する関数を作成するのが唯一の方法だと思いますが、必要でない限り、絶対にこれを行わないでください(必要な理由がわからないため)。

この解決策を追加しました:
別の可能な解決策は、独自の.val()ラッパー関数を作成し、を通じて値を設定した後にカスタムイベントをトリガーさせる.val()ことです。その後、.val()ラッパーを使用しての値を設定する<select>と、カスタムイベントがトリガーされます。トラップして処理できます。

必ずreturn this、jQuery形式でチェーンできるようにしてください。


私はこの質問についていくつかのフォーラムを読みました、そしてあなたの答えは私が探していた最後の完了でした。追跡のアイデアは精神的な実験としてのみ機能します。明らかにそれは全く実用的ではありませんが、それは例示です。そしてラッパーのアイデアは素晴らしいです、そして「これを返す」部分を指摘してくれてありがとう よろしく。
David L

なぜ$('select').val(value).change()いつも動かないの?明確な説明はありますか?
Istiaque Ahmed 2017

2

私はそれを分離し、次にアイデンティティ比較を使用して次に何をするかを決定します。

$("#selectField").change(function(){
  if(this.value === 'textValue1'){ $(".contentClass1").fadeIn(); }
  if(this.value === 'textValue2'){ $(".contentclass2").fadeIn(); }
});

2

jQueryはネイティブの変更イベントをトリガーせず、独自の変更イベントのみをトリガーするため。jQueryなしでイベントをバインドし、jQueryを使用してイベントをトリガーした場合、バインドしたコールバックは実行されません。

ソリューションは次のようになります(100%動作)。

var sortBySelect = document.querySelector("select.your-class"); 
sortBySelect.value = "new value"; 
sortBySelect.dispatchEvent(new Event("change"));
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.