Onchange türünü "type" giriş türünde izlemenin en iyi yolu nedir?


449

Deneyimlerime göre, input type="text" onchangeolay genellikle yalnızca blurdenetimden çıktıktan ( ) sonra gerçekleşir .

onchangeHer textfieldiçerik değişikliğinde tarayıcıyı tetiklemeye zorlamanın bir yolu var mı ? Değilse, bunu “manuel” olarak izlemenin en zarif yolu nedir?

onkey*Etkinliği kullanmak güvenilir değildir, çünkü alanı sağ tıklayıp Yapıştır'ı seçebilirsiniz; bu, alanı klavye girişi olmadan değiştirir.

setTimeouttek yolu? .. Çirkin :-)


@Geçmiş cevabınızın güncelliğini kaybetmemesi için kabul edilen cevabınızı güncelleme şansınız var mı?
Flimm

Yanıtlar:


271

Güncelleme:

Bkz. Başka cevap (2015).


Orijinal 2009 Cevabı:

Peki, onchangeetkinliğin tuş kilidi ile açılmasını, bulanıklaştırılmasını ve yapıştırılmasını mı istiyorsunuz? Bu sihir.

Değişiklikleri yazarken izlemek istiyorsanız, tuşunu kullanın "onkeydown". Yapıştırma işlemlerini fare ile yakalamanız gerekiyorsa "onpaste"( IE , FF3 ) ve "oninput"( FF, Opera, Chrome, Safari 1 ) kullanın.

1 Safari için <textarea>bozuldu. textInputBunun yerine kullan


22
onkeypressyerine kullanılmalıdır onkeydown. onkeydownbir tuş tıklandığında tetiklenir. Bir kullanıcı bir tuşu basılı tutarsa, etkinlik ilk karakter için yalnızca bir kez tetiklenir. onkeypressmetin alanına her karakter eklendiğinde tetiklenir.
fent

61
onchangeTüm bu eylemlere ateş etmek pek sihir değil . <input onchange="doSomething();" onkeypress="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();">çoğu için yeterince iyi yapacak.
12'de

1
Fare kullanarak giriş kutusundaki bazı metinleri silmeye ne dersiniz? Bunun işe yarayacağını sanmıyorum.
Jeevan

47
Jquery 1.8.3 ile, benziyor:$().on('change keydown paste input', function() {})
Narfanator

4
@AriWais: EVET, OMG SO'nun çoğunun kullanımdan kaldırılması gerekir. Millet bu cevap 8 yaşında . Bunun gibi eski cevaplar için bir "kullanımdan kaldırma" düğmesi olsaydı ve topluluk daha iyisini seçebilir.
Crescent Fresh

658

Bugünlerde dinliyorum oninput. onchangeElemana odaklanmaya gerek kalmadan hisseder . HTML5.

IE8 ve altı hariç herkes (mobil hatta) tarafından desteklenir. IE için ekleyin onpropertychange. Ben böyle kullanın:

const source = document.getElementById('source');
const result = document.getElementById('result');

const inputHandler = function(e) {
  result.innerHTML = e.target.value;
}

source.addEventListener('input', inputHandler);
source.addEventListener('propertychange', inputHandler); // for IE8
// Firefox/Edge18-/IE9+ don’t fire on <select><option>
// source.addEventListener('change', inputHandler); 
<input id="source">
<div id="result"></div>


63
Web Standartları gibi sürekli değişen bir dünyada, bazen kabul edilen cevap birkaç yıl sonra değiştirilebilir ... Bu benim için yeni kabul edilen cevap.
Erick Petrucelli

1
IE9'daoninput bile destek kısmi ( caniuse.com/#feat=input-event ).
Kenston Choi

Herhangi bir biçimlendirme innerTextyapılmaması için yerine kullanmak faydalı olabilirinnerHTML
Jeevan Takhar

47

Aşağıdaki kod Jquery 1.8.3 ile benim için iyi çalışıyor

HTML: <input type="text" id="myId" />

Javascript / JQuery:

$("#myId").on('change keydown paste input', function(){
      doSomething();
});

11
JQuery kütüphanesi soruda etiketlenmemiştir.
John Weisz

21
Jquery bir Javascript api, ve ben burada Jquery anahtar kelime ile bir arama getirildi, ben Jquery cevap için her javascript qustion için yeni bir soru oluşturmaya değer sanmıyorum ...
GaelDev

12
Eğer insanların cevaplarda kütüphane kullanımını önermesine izin verilmezse, SO hakkında çok daha fazla cevaplanmamış soru olurdu
dietbacon

3
Birden çok kez patlar. Muhtemelen değişiklik ve tuşa basma nedeniyle. Muhtemelen giriş sadece burada gereklidir.
mmm

1
gerek yoktur keydownçünkü girişin değerini çoğaltır, kaldırır.
Youssef Al Subaihi

43

Javascript burada tahmin edilemez ve komik.

  • onchange yalnızca metin kutusunu bulanıklaştırdığınızda oluşur
  • onkeyup& onkeypressmetin değişiminde her zaman gerçekleşmez
  • onkeydown metin değişikliğinde oluşur (ancak fare tıklamasıyla kes ve yapıştır işlemlerini izleyemez)
  • onpaste& oncuttuşa basıldığında ve hatta sağ fare tıklamasıyla gerçekleşir.

Yani, metin kutusundaki değişikliği izlemek için onkeydown, oncutve gerekiyor onpaste. Bu olayın geri çağrısında, metin kutusunun değerini kontrol ederseniz, geri aramadan sonra değer değiştiği için güncellenmiş değeri alamazsınız. Bunun için bir çözüm, değişikliği izlemek için 50 mili saniye (veya daha az olabilir) zaman aşımı ile bir zaman aşımı işlevi ayarlamaktır.

Bu kirli bir hack ama araştırdığım tek yol bu.

İşte bir örnek. http://jsfiddle.net/2BfGC/12/


4
oninputve textInputbunun gerçek çözümü olan olaylardır, ancak tüm tarayıcılar tarafından desteklenmez.
Sanket Sahu

İkinci mermi noktası için kastettiğini onkeyupve onkeydownbenzer olduğunu varsayıyorum . Her ikisi de Ctrl, Alt, Shift ve Meta tuşlarını yakalayabilir. Üçüncü mermi noktası için kastettiğini varsayıyorum onkeypress.
Daniel Stevens

12

onkeyupyazdıktan sonra olur, örneğin tparmağımı kaldırdığımda basıyorum, eylem gerçekleşiyor, ancak keydownkarakterde rakamları çevirmedent

Umarım bu birisi için yararlıdır.

Şimdi onkeyupyazdıklarınızı göndermek istediğinizde daha iyidir.


8

Benzer bir gereksinimim vardı (twitter tarzı metin alanı). Kullanılan onkeyupve onchange. onchangeaslında alandan kayıp odak sırasında fare hamur işlemleri ilgilenir.

[Güncelleme] HTML5 veya sonraki sürümlerde, oninputyukarıdaki diğer yanıtlarda açıklandığı gibi gerçek zamanlı karakter değiştirme güncellemelerini almak için kullanın .


Oninput, bir textarea, input: text, input: password veya input: search elementinin içeriğinin ne zaman değiştiğini tespit etmek istiyorsanız kullanışlıdır, çünkü bu öğelerdeki onchange olayı, değişiklikten hemen sonra öğe odak kaybettiğinde tetiklenir .
hkasera

@hkasera Evet, HTML5 ile gitmenin oninputyolu budur. Ancak, uyguladığımda, HTML5 yoktu ve IE 8 :( vardı. Kullanıcılar için güncel bilgi sağladığı için güncellemenizi takdir ediyorum.
Mohnish


7

SADECE Internet Explorer kullanıyorsanız bunu kullanabilirsiniz:

<input type="text" id="myID" onpropertychange="TextChange(this)" />

<script type="text/javascript">
    function TextChange(tBox) {
        if(event.propertyName=='value') {
            //your code here
        }
    }
</script>

Umarım yardımcı olur.


8
Sanırım bir şirket içi proje olabilir ... :)
eselk

94
Tanrıya şükür o evde yaşamıyorum! : D
Marco Matarazzi

13
10 yıl önce bu cümle komik bir şey olmazdı .. :(
Michał Tabor

4
benim için bu, IE tek tarayıcı olduğu gömülü bir işletim sistemi ile bazı mobil cihazlar için bir proje geliştiriyorum.
Anders M.

3
SADECE Internet Explorer - LOL kullanıyorsanız. 2016'da günümü yaptım!
Jack Black

4

oldukça yakın bir çözüm var (tüm Yapıştır yollarını düzeltmeyin) ama çoğu:

Hem girdiler hem de textareas için çalışır:

<input type="text" ... >
<textarea ... >...</textarea>

Şunu yapın:

<input type="text" ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >
<textarea ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >...</textarea>

Dediğim gibi, tüm tarayıcılarda bir olayı ateşe yapıştırmanın tüm yolları ... en kötüsü hiç bir olayı ateşlemez, ancak Zamanlayıcılar böyle kullanmak için korkunçtur.

Ancak, Yapıştır yollarının çoğu klavye ve / veya fare ile yapılır, bu nedenle normalde bir onkeyup veya onmouseup bir macundan sonra tetiklenir, ayrıca klavyeye yazarken onkeyup tetiklenir.

Kontrol kodunun fazla zaman almadığından emin olun ... aksi takdirde kullanıcı kötü bir izlenim edinir.

Evet, hile anahtar ve fare ateş etmektir ... ama her ikisi de ateş olabilir dikkat, bu yüzden böyle unutmayın!


4

Lütfen JQuery kullanarak bir sonraki yaklaşımı değerlendirin:

HTML:

<input type="text" id="inputId" />

JavaScript (JQuery):

$("#inputId").keyup(function(){
        $("#inputId").blur();
        $("#inputId").focus();
});

$("#inputId").change(function(){
        //do whatever you need to do on actual change of the value of the input field
});

Ben de aynı şekilde kullanıyorum
:)

Bunun en yeni cevap olmadığını anlıyorum, ancak girdinin sonu dışında herhangi bir yerde olsaydı, her tuştaki girişi bulanıklaştırma ve yeniden odaklama imleç yerleşimini berbat eder mi?
Michael Martin-Smucker

@ MichaelMartin-Smucker Siz öyle düşünüyorsunuz, ama görünüşe göre değil: jsfiddle.net/gsss8c6L
Clonkex

4

"girdi" benim için çalıştı.

var searchBar  = document.getElementById("searchBar");
searchBar.addEventListener("input", PredictSearch, false);

3

Sen kullanabilirsiniz keydown, keyupve keypresssıra olayları.


3

Her birini izlemek için bu örneği deneyin ve bundan önce imleç yanıp sönme oranını tamamen sıfıra indirin.

<body>
//try onkeydown,onkeyup,onkeypress
<input type="text" onkeypress="myFunction(this.value)">
<span> </span>
<script>
function myFunction(val) {
//alert(val);
var mySpan = document.getElementsByTagName("span")[0].innerHTML;
mySpan += val+"<br>";
document.getElementsByTagName("span")[0].innerHTML = mySpan;
}
</script>

</body>

onblur: olay çıkışta oluşturulur

onchange: giriş metninde herhangi bir değişiklik yapılırsa olay çıkışta oluşturulur

onkeydown: olay herhangi bir tuşa basıldığında oluşur (tuşun uzun süre tutulması için)

onkeyup: herhangi bir anahtar sürümünde etkinlik oluşturulur

onkeypress: onkeydown (veya onkeyup) ile aynıdır ancak ctrl, backsace, alt other için tepki vermez


1

2018 burada, yaptığım şey:

$(inputs).on('change keydown paste input propertychange click keyup blur',handler);

Bu yaklaşımdaki kusurları gösterebilirseniz minnettar olurum.


2
2019 burada ve bu her tuşa basıldığında birden çok kez çalışacaktır. Bir örnek için buraya bakın: jsfiddle.net/sp00n82/3r4691tq/5
sp00n

1

Yöntem 1: için bir olay dinleyicisi ekleyin input:

element.addEventListener("input", myFunction);

 

Yöntem 2:oninput özelliği JavaScript ile tanımlayın :

element.oninput = function()
{
    myFunction();
};

 

Yöntem 3:oninput özelliği HTML ile tanımlayın :

<input type="text" oninput="myFunction();">

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.