Bir girişe programlı olarak onchange olayını nasıl zorlarım?


123

Bir girişe programlı olarak onchange olayını nasıl zorlarım?

Bunun gibi bir şey denedim:

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

Ama benim nihai amacım herhangi bir dinleyici işlevini ateşlemek ve bu işe yaramıyor gibi görünüyor. Sadece "değer" özniteliğini güncellemek de değildir.

Yanıtlar:


143

Bir Eventnesne oluşturun ve onu dispatchEventöğenin yöntemine aktarın:

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

Bu, addEventListeneryöntemi çağırarak veya onchangeöğenin özelliğini ayarlayarak kayıtlı olup olmadıklarına bakılmaksızın olay dinleyicilerini tetikleyecektir .


Olayın balonlaşmasını istiyorsanız, kurucuya ikinci bir argüman iletmeniz gerekir Event:

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

Tarayıcı uyumluluğuyla ilgili bilgiler:


2
Evet, MDN Olay oluşturma ve tetikleme iyi bir kaynaktır!
Jakub Holý

1
Bu, doğal olarak doğru şekilde nasıl yapılacağıdır. Artık tüm tarayıcılarda destekleniyor: caniuse.com/#feat=dispatchevent
Willem Mulder

1
Bu, bu soru için doğru bir cevaptır. Bunu modern bir şekilde başarmalıyız.
Константин Ван

1
IE11'de eşdeğerini yapmaya çalışıyorum ama bir reactjs giriş alanını değiştirmeye çalışırken çalışmıyor. var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); elem.dispatchEvent(evt);
Bodosko

3
Neden herkes bunun en iyi cevap olduğunu söylüyor? Bağlantılı Etkinlik belgesine göre, IE'nin mevcut sürümü bile bunu hala desteklemiyor.
jeff-h

96

JQuery'de çoğunlukla kullanıyorum:

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

2
tihs bana yardım etti! Kodu kullanarak bir onay kutusunun değerini (işaretli olsun ya da olmasın) ayarlıyordum ve ne yaparsam yapayım IE'de olay hiç tetiklenmiyordu. Bulanıklaştırma () odaklamayı () ve birkaç başka şeyi denedim. Değeri ayarladıktan sonra tetikleyici olarak adlandırdım ve tetikleyiciyi çağırmak için bir tıklama etkinliği ekledim. Birden fazla yangına neden oluyor ama benim için önemli değil. IE'de kod aracılığıyla onay kutuları eklerim ve değişiklik olayı tetiklenmeden önce bunları iki kez tıklamanız gerekir. Bu ipucu için teşekkürler.
Dustin Davis

6
Güncelleme olarak, $ ("# element"). Change (); jquery 1.0'dan beri aynı şeyi yapıyor.
CookieOfFortune

3
Bunun yerel bir onchange tetiklemediğini unutmayın. Yalnızca jQuery aracılığıyla bağlanan tüm onchange dinleyicilerinde etkinleşir!
Willem Mulder

Burada herhangi bir yardım lütfen? Bu çözümlerin hiçbiri benim için işe yaramıyor gibi görünüyor .. stackoverflow.com/questions/51216332/…
Gabe

61

öf için eval kullanmayın şey . Şey, belli şeyler var ama bunlar çok nadir. Aksine, şunu yaparsınız:

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

Daha fazla seçenek için buraya bakın: http://jehiah.cz/archive/firing-javascript-events-properly


3
JSON nesneleştirmek için değerlendirmek;)
Aaron Powell

3
JSON'u nesneleştirmek için json2.js! JSON.parse zaten modern tarayıcılarda mevcut
jinglesthula

12
Bu teknik yalnızca değişiklik işleyicisi "onchange" ayarlanarak eklendiğinde işe yarar. W3c veya microsoft olay işleyicilerini tetikleyen 'gerçek' bir olay oluşturmaz. Daha fazla ayrıntı için bağlantıya bakın.
Stephen Nelson

6
Sanırım bu cevabın artık modası geçmiş, Miscreant'ın cevabını kullanıyor new Event(...)ve dispatchEventgünümüzde doğru çözüm gibi görünüyor.
Jakub Holý

4
Bu yanıt geçersizdir ; Element.addEventListenerOlayları işlemek için kullandıysanız yukarıdaki kod çalışmayacaktır . Bunu modern bir şekilde başarmak için @ Miscreant'ın cevabına bakın.
Константин Ван

23

Bazı nedenlerden dolayı ele.onchange (), sayfamdaki IE'de benim için bir "yöntem bulunamadı" ifadesi atıyor, bu nedenle Kolten'in sağladığı bağlantıdan bu işlevi kullandım ve işe yarayan fireEvent'i (ele, 'değiştir') çağırdım. :

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

Ancak, onchange () işlevinin çalışması gerektiğini doğrulayan bir test sayfası oluşturdum:

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

Düzenleme: ele.onchange () işlevinin çalışmamasının nedeni, aslında onchange olayı için hiçbir şey bildirmemiş olmamdı. Ancak fireEvent hala çalışıyor.


2
Bu tarayıcı algılama yöntemini (nesne algılama ile) verdiğim örnekten daha çok seviyorum.
Chris MacDonald

Bu artık Firefox 23 için çalışmıyor: "element.dispatchEvent bir işlev değil"
Oliver

4
Merhaba Google çalışanları. 2016! Günümüzde gibi kod yazmak element.dispatchEvent(new Event('change', true, true))yerine gizli ve çoğunlukla kaldırılmış olduğu tüm createEventve initEventşeyler.
ericsoco

3

Bu, IE ve Chrome için en doğru cevaptır ::

javascript=>

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

2

QUnit'in altından alınmıştır

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

Elbette, $ .browser öğelerini jQuery'den bağımsız hale getirmek için kendi tarayıcı algılama yöntemlerinizle değiştirebilirsiniz.

Bu işlevi kullanmak için:

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

Bu, temelde gerçek DOM olayını sanki bir şey değişmiş gibi tetikler.


1

Tüm etkinliklerinizi bu kod pasajıyla eklerseniz:

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

o zaman etkinliğinizin adının element.on<EVENTNAME>()nerede <EVENTNAME>olduğunu kullanabilirsiniz ve bu, tüm etkinlikleri<EVENTNAME>


-2

Javascript'teki herhangi bir olayı tetiklemek için.

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

2
bu olayları dinlemek, onları tetiklemek değil.
geçersiz kullanıcı adı

-4

jQuery kullanıyorsanız şunlara sahip olursunuz:

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

veya MS AJAX:

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

Veya öğenin ham HTML'sinde:

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

Soruyu yeniden okuduktan sonra, yapılması gerekenleri özlediğimi düşünüyorum. Bir DOM öğesini bir değişiklik olayını zorlayacak şekilde güncellemenin bir yolunu hiç bulamadım, yaptığınız en iyi şey ayrı bir olay işleyici yöntemine sahip olmaktır, örneğin:

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

Zaten değiştirmeyi yapacak bir JavaScript yöntemi yazdığınız için, çağrılacak yalnızca 1 ek satır var.

Eğer Veya edilir Microsoft AJAX framework kullanarak tüm etkinlik işleyicileri yoluyla erişebilir:

$get('elementId')._events

Ateşlenecek doğru olay işleyicisini / işleyicilerini bulmak için bazı yansıma tarzı çalışmalar yapmanıza izin verir.


1
İnanıyorum ki asıl olayı ateşlemek istiyor, olay ateşlendiğinde bir işlevi çalıştırmak değil ... sanırım . lol
Kolten

-5

JQuery kullanarak aşağıdakileri yapabilirsiniz:

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

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

tanımsız bir işlev değildir.
Hristo Venev
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.