2008-09-28 18 views
7

Aşağıdaki sorun var: Ben, içeriğini Dokunamayacağım bir komut dosyası tarafından düzenlenir (bu benim sayfası bir HTML metin kutusu (<input type="text">) sahipJavaScript Olaylar: Bir <input> kontrol değerindeki değişikliklerden haberdar Getting

ama Harici bileşenleri kullanıyorum).

Bu metin kutusunun değeri her değiştiğinde, komut dosyamda her zaman bildirim almak istiyorum, böylece ona yanıt verebilirim.

Bu denedim:

txtStartDate.observe('change', function() { alert('change' + txtStartDate.value) }); 

hangi (tahmin) çalışmıyor. Sadece metin kutusu değerini klavyeyle değiştirdiğimde ve daha sonra odağı başka bir yere taşıyabiliyorsam ancak yürütülür, ancak kod değeri değiştirirse yürütmez.

Dinleyebileceğim başka bir olay var mı, farkında değil miyim?



Ben Prototip kitaplığı kullanıyorum ve durumda tekrar ilgili, metin kutusu değerini değiştirerek dış bileşeni ettik gibi temel Tarih Seçici (www.basicdatepicker.com)

cevap

5

olduğunu zımni, değişiklik (ve diğer olaylar) sadece kullanıcı biraz harekete geçtiğinde yanar. Bir şeyi değiştiren bir yazı herhangi bir olayı tetiklemez. Tek çözümün, kontrol cihazına dinleyicinize bağlayabileceğiniz bir kanca bulmak. İşte

bunu yapmak görecektir: Firebug ile üstünkörü bir görünüm (ı bileşeni ile aşina değilim) dayanıyor

basicDatePicker.selectDate = basicDatePicker.selectDate.wrap(function(orig,year,month,day,hide) { 
    myListener(year,month,day); 
    return orig(year,month,day,hide); 
}); 

. Bir tarih seçmenin başka yolları varsa, o yöntemleri de kullanmanız gerekir.

+1

jQuery'de bunu yapmak için herhangi bir yolu var mı? –

1

Dış javascript'in nasıl yazıldığına bağlı olarak, dış komut dosyasının ilgili kısımlarını her zaman betiğinize yeniden yazabilir ve değişiklik tanımının tetiklenmesi için harici tanımın üzerine yazabilirsiniz.

Bunu daha önce denetimimin dışında olan komut dosyaları ile yapmak zorundaydım.

Sadece harici işlevi bulmanız, tümüyle aynı ada sahip yeni bir işlev olarak kopyalamanız ve komut dosyasını yeniden yazmak istediğiniz şeyi yapmak için yeniden yazmanız gerekir. komut doğru kapamalar kullanılarak yazılmıştır, sen çok kolayca değiştirmek mümkün olmayacaktır Tabii

...

+0

Bunu düşündüm. Benim sorunum, büyük bir küçültülmüş betik. Değişecek doğru yeri bulmak saatlerimi alabilir. Bunun için hızlı bir yol arıyorum. Yapmam gereken 2 saat sürerse, yapmaya çalıştığım küçük özellik çabaya değmez :-) –

2

IE bu amaçla kullanılabilecek bir onpropertychange olayı vardır.

Gerçek web tarayıcıları (;) için, bir DOMAttrModified mutation event var, ancak Firefox'ta birkaç dakikalık bir denemede, programın değeri değiştirilirken bir metin girişinde ateşleme yapamıyorum. (ya da normal klavye girişi ile), ancak girdinin adını programlı olarak değiştirirsem yine ateşlenir. Meraklı ve meraklı ...

güvenilir bir çalışma, her zaman sadece düzenli girişin değerini yoklamak verebilecek alamıyorsanız:

Kenara Noah açıkladı nasıl gibi problemleri halledecek gelen
var value = someInput.value; 

setInterval(function() 
{ 
    if (someInput.value != value) 
    { 
     alert("Changed from " + value + " to " + someInput.value); 
     value = someInput.value; 
    } 
}, 250); 
+1

Bir form öğesinin "value" özelliği, "value =" özelliğinden farklı ... "' sadece başlangıç ​​değerini belirleyen değer. Değeri komut dosyası veya kullanıcı eylemi ile ayarlama, "değer" özniteliğini (*) güncelleştirmez; bu nedenle DOMAttrModified öğesi yoktur. (*: bir hata nedeniyle IE dışında, ancak IE DOMAttrModified'i desteklememektedir.) – bobince

0

, ayrıca sadece bir zamanlayıcı oluşturmak verebilecek her birkaç yüz milisaniyede bir değeri kontrol eder.

0

YUI analiz edilebilir paginator kontrolünü, Dan. Bu kaba kuvvet, ama sorunumu çözmede çalıştı. Yani, alana yazma yöntemini bulun, kodunu kopyalayın ve değişiklik olayını tetikleyen bir deyim ekleyin ve kodunuzda yalnızca bu değişiklik olayını ele alın. Sadece orijinal işlevini bu yeni sürümüyle değiştirmelisiniz. Yoklama, iyi çalışırken çok daha fazla kaynak tüketen bir çözüm gibi görünüyor.

4

addEventListener ("DOMControlValueChanged 'bu bir komut dosyası tarafından bile olsa, ne zaman bir denetimin değeri değişiklikleri tetikler.

addEventListener (' input" direkt kullanıcı tarafından başlatılan DOMControlValueChanged filtrelenmiş versiyonudur. Maalesef

, DOMControlValueChanged sadece Opera tarafından desteklenmektedir anda ve giriş olay desteği webkit kırılır. girdi olay da Firefox ve Opera'da çeşitli hatalar var. Bu şeyler muhtemelen, çok yakında HTML5 kadar temizlenecektir

FWIW.

Güncelleme: (HTML5'e çıkarıldı çünkü)

9/8/2012 tarihi itibariyle

, DOMControlValueChanged destek Opera'ya düşmüş ve 'giriş' olayı desteği şimdi (daha az hata dahil) tarayıcılarında çok daha iyidir.