プログラムで入力のonchangeイベントを強制するにはどうすればよいですか?


123

プログラムで入力のonchangeイベントを強制するにはどうすればよいですか?

私はこのようなものを試しました:

var code = ele.getAttribute('onchange');
eval(code);

しかし、私の最終的な目標は、リスナー関数を起動することであり、それは機能しないようです。また、 'value'属性を更新するだけではありません。

回答:


142

Eventオブジェクトを作成しdispatchEvent、要素のメソッドに渡します。

var element = document.getElementById('just_an_example');
var event = new Event('change');
element.dispatchEvent(event);

これにより、addEventListenerメソッドの呼び出しによって、またはonchange要素のプロパティの設定によって登録されたかどうかに関係なく、イベントリスナーがトリガーされます。


イベントをバブルしたい場合は、Eventコンストラクターに2番目の引数を渡す必要があります。

var event = new Event('change', { bubbles: true });

ブラウザーの互換性に関する情報:


2
はい、MDNの作成とトリガーイベントは優れたリソースです。
JakubHolý16年

1
これは、ネイティブで適切に行う方法です。現在、すべてのブラウザーでサポートされています:caniuse.com/#feat=dispatchevent
Willem Mulder

1
これは、本当のこの質問に対しての答え。私たちはこれを現代的な方法で達成しなければなりません。
КонстантинВан

1
IE11で同等のことを実行しようとしていますが、reactjs入力フィールドを変更しようとしても機能しません。 var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); elem.dispatchEvent(evt);
ボドスコ2017年

3
なぜこれが最善の答えだと誰もが言うのですか?リンクされたイベントドキュメントによると、現在のバージョンのIE でもこれをサポートしいません。
jeff-h 2017

96

jQueryでは主に次を使用します:

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

2
tihsが助けてくれました!コードを使用してチェックボックスの値を設定(チェックされているかどうかにかかわらず)しており、IEで何をしてもイベントが発生しませんでした。blur()、focus()、その他いくつかのことを試しました。値を設定した後、トリガーを呼び出し、トリガーを呼び出すクリックイベントも追加しました。複数の火災が発生しますが、私には関係ありません。IEでは、コードを使用してチェックボックスを追加し、変更イベントが発生する前にチェックボックスを2回クリックする必要があります。このヒントをありがとう。
ダスティンデイビス

6
更新として、$( "#element")。change(); jquery 1.0以降、同じことをしています。
CookieOfFortune 2014

3
これはネイティブのonchangeをトリガーしないことに注意してください。jQueryを介してバインドされたすべてのonchangeリスナーでのみ起動します。
Willem Mulder

ここで何か助けてください?これらの解決策はどれも私にはうまくいか
Gabe

61

なにも evalを使わないでください。まあ、あることはありますが、それらは非常にまれです。むしろ、あなたはこれをするでしょう:

document.getElementById("test").onchange()

その他のオプションについては、こちらをご覧ください:http : //jehiah.cz/archive/firing-javascript-events-properly


3
JSONをオブジェクト化するための評価;)
Aaron Powell

3
JSONをオブジェクト化するためのjson2.js!JSON.parseは、最新のブラウザーで既に利用可能です
jinglesthula

12
この手法、「onchange」を設定して変更ハンドラーをアタッチした場合にのみ機能します。w3cまたはmicrosoftイベントハンドラーをトリガーする「実際の」イベントは生成しません。詳細については、リンクを参照してください。
スティーブンネルソン

6
私はこの答えが古くなっていると思います。Miscreantの答えを使用new Event(...)dispatchEventて、今日では正しい解決策であると思われます。
JakubHolý16年

4
この回答は廃止されましたElement.addEventListenerイベントの処理に使用した場合、上記のコードは機能しません。最新の方法でそれを実現するには、@ Miscreantの回答を参照してください。
КонстантинВан

23

何らかの理由でele.onchange()がページのIEで「メソッドが見つかりません」という例外をスローしているため、Koltenが提供するリンクからこの関数を使用し、fireEvent(ele、 'change')を呼び出しました。 :

function fireEvent(element,event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}

ただし、呼び出しはonchange()が機能することを確認するテストページを作成しました。

<input id="test1" name="test1" value="Hello" onchange="alert(this.value);"/>
<input type="button" onclick="document.getElementById('test1').onchange();" value="Say Hello"/>

編集:ele.onchange()が機能しなかった理由は、実際にonchangeイベントに対して何も宣言していないためです。しかし、fireEventは引き続き機能します。


2
私が提供した例よりも、このオブジェクト検出による(オブジェクト検出による)この方法が気に入っています。
クリスマクドナルド

これはFirefox 23では機能しなくなりました。「element.dispatchEventは関数ではありません」
Oliver

4
Google社員の皆さん、こんにちは。2016年です!今日では、我々は次のようなコードを書くelement.dispatchEvent(new Event('change', true, true))代わりに、すべてのこと難解にし、主に非推奨createEventinitEventもの。
ericsoco 2016年

3

これはIEとChromeの最も正しい答えです。

javascript=>

var element = document.getElementById('xxxx');
var evt = document.createEvent('HTMLEvents');
evt.initEvent('change', false, true);
element.dispatchEvent(evt);

2

QUnitの下部から取得

function triggerEvent( elem, type, event ) {
    if ( $.browser.mozilla || $.browser.opera ) {
        event = document.createEvent("MouseEvents");
        event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
            0, 0, 0, 0, 0, false, false, false, false, 0, null);
        elem.dispatchEvent( event );
    } else if ( $.browser.msie ) {
        elem.fireEvent("on"+type);
    }
}

もちろん、jQueryに依存しないようにするために、$。browserを独自のブラウザー検出メソッドに置き換えることができます。

この機能を使用するには:

var event;
triggerEvent(ele, "change", event);

これは基本的に、何かが実際に変更されたかのように、実際のDOMイベントを発生させます。


1

このコードスニペットを使用してすべてのイベントを追加する場合:

//put this somewhere in your JavaScript:
HTMLElement.prototype.addEvent = function(event, callback){
  if(!this.events)this.events = {};
  if(!this.events[event]){
    this.events[event] = [];
    var element = this;
    this['on'+event] = function(e){
      var events = element.events[event];
      for(var i=0;i<events.length;i++){
        events[i](e||event);
      }
    }
  }
  this.events[event].push(callback);
}
//use like this:
element.addEvent('change', function(e){...});

次に、あなたのイベントの名前がelement.on<EVENTNAME>()どこであるかを使うことができ<EVENTNAME>ます、そしてそれはすべてのイベントを<EVENTNAME>


-2

JavaScriptでイベントをトリガーするため。

 document.getElementById("yourid").addEventListener("change", function({
    //your code here
})

2
これはイベントをリッスンしていて、トリガーしていません。
invalidusername

-4

jQueryを使用している場合は、次のようになります。

$('#elementId').change(function() { alert('Do Stuff'); });

またはMS AJAX:

$addHandler($get('elementId'), 'change', function(){ alert('Do Stuff'); });

または、要素の生のHTMLで:

<input type="text" onchange="alert('Do Stuff');" id="myElement" />

質問をもう一度読んだ後、私は何をすべきかを読み損なったと思います。changeイベントを強制する方法でDOM要素を更新する方法を見つけたことはありません。次のように、別のイベントハンドラーメソッドを用意するのが最善です。

$addHandler($get('elementId'), 'change', elementChanged);
function elementChanged(){
  alert('Do Stuff!');
}
function editElement(){
  var el = $get('elementId');
  el.value = 'something new';
  elementChanged();
}

変更を行うJavaScriptメソッドをすでに記述しているため、呼び出すのは1行だけです。

または、Microsoft AJAXフレームワークを使用している場合、次の方法ですべてのイベントハンドラーにアクセスできます。

$get('elementId')._events

これにより、いくつかのリフレクションスタイルの処理を実行して、起動する適切なイベントハンドラを見つけることができます。


1
彼は、イベントが発生したときに関数を実行するのではなく、実際のイベントを発生させたいと考えています... 笑
コルテン

-5

JQueryを使用すると、次のことができます。

// for the element which uses ID
$("#id").trigger("change");

// for the element which uses class name
$(".class_name").trigger("change");

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