Bagaimana cara saya secara terprogram memaksakan acara onchange pada input?

123

Bagaimana cara saya secara terprogram memaksakan acara onchange pada input?

Saya sudah mencoba sesuatu seperti ini:

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

Tetapi tujuan akhir saya adalah mengaktifkan fungsi pendengar apa pun, dan itu sepertinya tidak berhasil. Juga tidak hanya memperbarui atribut 'nilai'.

Soldarnal
sumber

Jawaban:

142

Buat sebuah Eventobjek dan teruskan ke dispatchEventmetode elemen:

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

Ini akan memicu event listener terlepas dari apakah mereka didaftarkan dengan memanggil addEventListenermetode atau dengan menyetel onchangeproperti elemen.


Jika Anda ingin acara menggelembung, Anda perlu meneruskan argumen kedua ke Eventkonstruktor:

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

Informasi tentang kompatibilitas browser:

Bajingan
sumber
2
Ya, acara MDN Membuat dan memicu acara adalah sumber yang bagus!
Jakub Holý
1
Ini adalah cara melakukannya dengan benar, secara native. Didukung di semua browser sekarang: caniuse.com/#feat=dispatchevent
Willem Mulder
1
Ini adalah jawaban yang benar untuk pertanyaan ini. Kita harus mencapai ini dengan cara modern.
Константин Ван
1
Saya mencoba melakukan hal yang setara pada IE11 tetapi tidak berfungsi ketika mencoba mengubah bidang masukan reactjs. var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); elem.dispatchEvent(evt);
Bodosko
3
Mengapa semua orang mengatakan ini adalah jawaban terbaik? Menurut dokumen Acara yang ditautkan, bahkan versi IE saat ini masih tidak mendukung ini.
jeff-h
96

Di jQuery saya kebanyakan menggunakan:

$("#element").trigger("change");
Danita
sumber
2
tihs membantu saya! Saya mengatur nilai kotak centang (dicentang atau tidak) menggunakan kode dan acara itu tidak aktif di IE sama sekali tidak peduli apa yang saya lakukan. Saya mencoba blur () focus () dan beberapa hal lainnya. setelah saya menetapkan nilai yang saya sebut pemicu dan saya menambahkan acara klik untuk memanggil pemicu juga. Ini menyebabkan banyak kebakaran tetapi itu tidak masalah bagi saya. Di IE saya menambahkan kotak centang melalui kode dan Anda harus mengkliknya dua kali sebelum peristiwa perubahan terjadi. Terima kasih atas tip ini.
Dustin Davis
6
Sebagai pembaruan, $ ("# element"). Change (); melakukan hal yang sama sejak jquery 1.0.
CookieOfFortune
3
Perhatikan bahwa ini TIDAK memicu onchange asli. Ini hanya akan mengaktifkan semua pendengar onchange yang terikat melalui jQuery!
Willem Mulder
Ada bantuan di sini? Tidak satu pun dari solusi ini yang tampaknya berhasil untuk saya .. stackoverflow.com/questions/51216332/…
Gabe
61

ugh jangan gunakan eval untuk apa pun . Memang ada hal-hal tertentu, tetapi itu sangat jarang. Sebaliknya, Anda akan melakukan ini:

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

Lihat di sini untuk opsi lainnya: http://jehiah.cz/archive/firing-javascript-events-properly

Kolten
sumber
3
eval untuk mengobyektifkan JSON;)
Aaron Powell
3
json2.js untuk mengobyektifkan JSON! JSON.parse sudah tersedia di browser modern
jinglesthula
12
Teknik ini hanya bekerja jika penangan perubahan dipasang dengan mengatur "onchange". Itu tidak menghasilkan acara 'nyata' yang memicu w3c atau penangan acara microsoft. Lihat tautan untuk lebih jelasnya.
Stephen Nelson
6
Saya pikir jawaban ini sudah ketinggalan zaman sekarang, jawaban Miscreant menggunakan new Event(...)dan dispatchEventmerupakan solusi yang tepat saat ini, tampaknya.
Jakub Holý
4
Jawaban ini sudah usang ; kode di atas tidak akan berfungsi jika Anda biasa Element.addEventListenermenangani acara. Untuk mencapainya dengan cara modern, lihat jawaban @ Miscreant.
Константин Ван
23

Untuk beberapa alasan ele.onchange () adalah melemparkan "metode tidak ditemukan" expception untuk saya di IE pada halaman saya, jadi saya akhirnya menggunakan fungsi ini dari link Kolten disediakan dan memanggil fireEvent (ele, 'perubahan'), yang bekerja :

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);
    }
}

Namun saya melakukannya, membuat halaman pengujian yang mengonfirmasi bahwa panggilan harus onchange () berfungsi:

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

Sunting: Alasan ele.onchange () tidak berfungsi adalah karena saya belum benar-benar menyatakan apa pun untuk acara onchange. Tapi fireEvent masih berfungsi.

Soldarnal
sumber
2
Saya suka metode deteksi browser ini (dengan deteksi objek) lebih baik daripada contoh yang saya berikan.
Chris MacDonald
Ini tidak berfungsi lagi untuk Firefox 23: "element.dispatchEvent bukan fungsi"
Oliver
4
Halo rekan-rekan Google. Ini 2016! Saat ini kami menulis kode seperti element.dispatchEvent(new Event('change', true, true))alih - alih semua yang misterius dan sebagian besar usang createEventdan initEventsemacamnya.
ericsoco
3

Ini adalah jawaban paling benar untuk IE dan Chrome ::

javascript=>

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

Diambil dari bagian bawah 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);
    }
}

Anda dapat, tentu saja, mengganti barang $ .browser ke metode deteksi browser Anda sendiri untuk membuatnya independen jQuery.

Untuk menggunakan fungsi ini:

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

Ini pada dasarnya akan mengaktifkan peristiwa DOM asli seolah-olah ada sesuatu yang benar-benar berubah.

Chris MacDonald
sumber
1

Jika Anda menambahkan semua acara Anda dengan cuplikan kode ini:

//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){...});

maka Anda dapat menggunakan di element.on<EVENTNAME>()mana <EVENTNAME>nama acara Anda, dan itu akan memanggil semua acara dengan<EVENTNAME>

Wntiv Senyh
sumber
-2

Untuk memicu acara apa pun di Javascript.

 document.getElementById("yourid").addEventListener("change", function({
    //your code here
})
Hareesh Seela
sumber
2
ini mendengarkan peristiwa, bukan memicunya.
invalidusername
-4

jika Anda menggunakan jQuery, Anda akan memiliki:

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

atau MS AJAX:

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

Atau dalam HTML mentah elemen:

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

Setelah membaca ulang pertanyaan itu, saya pikir saya salah membaca apa yang harus dilakukan. Saya tidak pernah menemukan cara untuk memperbarui elemen DOM dengan cara yang akan memaksa peristiwa perubahan, hal terbaik yang Anda lakukan adalah memiliki metode penanganan peristiwa terpisah, seperti ini:

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

Karena Anda sudah menulis metode JavaScript yang akan melakukan perubahan, hanya ada 1 baris tambahan untuk dipanggil.

Atau, jika Anda sedang menggunakan kerangka Microsoft AJAX Anda dapat mengakses semua event handler melalui:

$get('elementId')._events

Ini akan memungkinkan Anda melakukan beberapa cara kerja gaya refleksi untuk menemukan penangan kejadian yang tepat untuk diaktifkan.

Aaron Powell
sumber
1
Saya yakin dia ingin mengaktifkan acara yang sebenarnya, bukan menjalankan fungsi saat acara tersebut dipecat ... saya kira . lol
Kolten
-5

Menggunakan JQuery, Anda dapat melakukan hal berikut:

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

// for the element which uses class name
$(".class_name").trigger("change");
BAJA ITBOY
sumber
undefined bukanlah sebuah fungsi.
Hristo Venev