2010-05-18 51 views
249

Takvim widget'ından bir tarih-saat metin alanı değeri ayarlıyorum.Bir onchange olayını manuel olarak nasıl tetikleyebilirim?

document.getElementById('datetimetext').value = date_value; 

İstediğim geçerli:: Ben sayfanın diğer bazı alanları sıfırlamak için gereken tarih-saat textfield değeri değiştirerek üzerinde Açıkçası, takvim Widget böyle bir şey yapar. Tetiklenmemiş olan datetimetext alanına bir onchange olay dinleyicisi ekledim, çünkü onchange öğesinin yalnızca odak noktası & odağı kaybolduğunda tetiklendiğini tahmin ediyorum.

Bu nedenle, bu onchange olayını manuel olarak tetiklemenin bir yolunu arıyorum (sanırım metin alanındaki değer farkını kontrol etmem gerekiyor).

Herhangi bir fikrin var mı?

+5

$ (document.activeElement) .trigger ("değişim"); – TechDog

cevap

326

Bunu yapabileceğiniz birkaç yol var. Eğer simüle etmek için bunu gerekirse

element.onchange(); 

: onchange dinleyici element.onchange özelliği ile ayarlanan bir fonksiyondur ve olay nesnesinin veya köpürme/yayılımı umursamazlar ise kolay yöntem sadece bu işlevi çağırmak için uygun var

if ("createEvent" in document) { 
    var evt = document.createEvent("HTMLEvents"); 
    evt.initEvent("change", false, true); 
    element.dispatchEvent(evt); 
} 
else 
    element.fireEvent("onchange"); 
+1

teşekkürler. Bu çalışır, ancak burada tarayıcı algılama hakkında emin değilim. YUI kütüphanesi ile aynı şeyi yapmanın bir yolu olup olmadığını merak ediyorum. Yine de teşekkürler. – CodeTweetie

+1

Teşekkürler. Android'in WebView'ında 'else' bloğundan gelen 3 satır ile çalışıyor gibi görünüyor. – Kuitsi

+2

Andy E, bu IE10'da çalışmaz, herhangi bir fikir? –

11

kullananlara jQuery için: html özellik veya addEventListener/attachEvent aracılığıyla olayı ayarlarsanız tam olarak gerçek bir olay ya, doğru olay yangın özelliği tespiti biraz yapmanız gereken yöntem: http://api.jquery.com/change/

+36

Bu "uygun yöntem", yalnızca kendi değişiklik olayını tetikleyen yerel değişiklik olayını tetiklemez. Olayı jQuery olmadan bağlarsanız ve jQuery'yi tetiklemek için jQuery'yi kullanırsanız, bağlandığınız geri aramalar çalışmayacaktır. – Gherman

+6

Yorum için teşekkürler - Sadece bu tuzağa düştüm! –

+2

Aynısı $ .trigger ('change') için geçerli gibi görünüyor. JQuery'nin docs durumuna rağmen, yerel olayı tetikler, dispatchEvent() ile aynı şeyi yapmaz. –

175

MDN modern tarayıcılarda bunu yapmanın çok daha temiz bir yolu vardır düşündürmektedir:

// Assuming we're listening for e.g. a 'change' event on `element` 

// Create a new 'change' event 
var event = new Event('change'); 

// Dispatch it. 
element.dispatchEvent(event); 
+0

Bu benim için çalışmadı. Bunun yalnızca özel etkinlikler için uygun olmadığından emin misiniz? –

+25

@BrettZamir Benim için çalıştı (en azından Chrome 36) şu şekilde: 'document.querySelector ('select.freight'). DispatchEvent (yeni Olay ('değişiklik', {'kabarcıklar': doğru})) – SlimShaggy

+5

Sadece FYI bu konuda ... MDN bunu belirtiyor, ama IE10 + tarafından desteklenmiyor (tartışmasız ayrıca modern kelimesinin tanımıyla da modern ..) ve sadece Safari'de (yazının yazıldığı saatte) IE10 + bu kurucuya sahip yöntem ancak örneğin olay türünü belirtmeniz gerekir. MouseEvent veya KeyboardEvent: see: - https://msdn.microsoft.com/en-us/library/ie/dn905219%28v=vs.85%29.aspx – MrJustastic

İlgili konular