JQuery'de giriş değişikliği algılanıyor mu?


360

Jquery kullanırken .change, bir de inputgiriş odağını kaybettiğinde olay sadece tetiklenir

Benim durumumda, giriş değeri değiştirilir değişmez servisi aramam gerekiyor (değerin geçerli olup olmadığını kontrol et). Bunu nasıl başarabilirim?


3
ne tür bir girdi? Metin kutusu? Onay kutusu? radyo? textarea? bakalım şu ana kadar ne buldun
Patricia

Üzgünüz, bu tür metin girişi. Söylediğim gibi, değişikliği denedim ama bu ihtiyacım olan şeyi tetiklemiyor (girişteki metindeki her değişiklik için). Ben de tuşunu denedim ama bu çalışma almak için giriş "kirli" olup olmadığını izlemek için kapalı tutmak zorunda kalacak.
Banshee

2
bir tuşa basarlarsa, zamanın% 99'unu değiştirir, her zaman olay işleyicide olmayan anahtarları kontrol edebilirsiniz.
Patricia

Yanıtlar:


546

Açıklama ve örnek için GÜNCELLENDİ

örnekler: http://jsfiddle.net/pxfunc/5kpeJ/

Yöntem 1. inputolayı

Modern tarayıcılarda inputetkinliği kullanın . Bu olay, kullanıcı bir metin alanına yazarken, yapıştırma, geri alma, temelde değer bir değerden diğerine her değiştiğinde tetiklenir.

JQuery bunu böyle yapmak

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

jQuery 1.7 başlayarak yerine bindsahip on:

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

Yöntem 2. keyupolayı

Eski tarayıcılar için keyupetkinliği kullanın (bu, klavyedeki bir tuş serbest bırakıldığında tetiklenir, bu etkinlik bir tür yanlış pozitif verebilir çünkü "w" serbest bırakıldığında giriş değeri değiştirilir ve keyupolay tetiklenir. "shift" tuşu serbest bırakıldığında keyupolay tetiklenir, ancak girişte herhangi bir değişiklik yapılmamıştır.). Ayrıca, kullanıcı bağlam menüsünden sağ tıklar ve yapıştırırsa bu yöntem kullanılmaz:

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

Yöntem 3. Zamanlayıcı ( setIntervalveya setTimeout)

Sınırlamaların üstesinden gelmek keyupiçin, değerde bir değişiklik belirlemek üzere girişin değerini düzenli olarak kontrol edecek bir zamanlayıcı ayarlayabilirsiniz. Bu zamanlayıcı kontrolünü yapmak için setIntervalveya setTimeoutdüğmesini kullanabilirsiniz . Bu SO sorusunun işaretli cevabına bakın: jQuery metin kutusu değişiklik olayı veya belirli bir giriş alanı için zamanlayıcıyı başlatmak ve durdurmak için focusve blurolaylarını kullanarak çalışan bir örnek için kemanı görün


Bu çözüm hakkında daha fazla bilgi verebilir misiniz? Mevcut değeri nasıl alabilirim? Bunu yalnızca geçerli değerde değişiklik yapıldığında nasıl çalıştırabilirim?
Banshee

giriş olayı? jQuery (henüz) 'de girdi etkinliği yok ... stackoverflow.com/q/11189136/104380
vsync

Yöntemle 2 için genellikle keyUp hem bağlama ve değişim. Bu şekilde, bir tuşa basmadan (yapıştırma gibi) girişin gerçekleştiği durumlarda, en azından giriş odağı kaybettiğinde olayı tetikler.
2013 rspeed

"Girdi" etkinliği için dokümanlar: whatwg.org/specs/web-apps/current-work/multipage/…
jackocnr

1
@AdiDarachi MutationObserver, DOM öğelerindeki değişiklikleri izleyecektir. Ancak, bir giriş alanındaki verileri değiştiren bir kullanıcı bir MutationObserver değişikliğini tetiklemez ... Bir test senaryosu oluşturdum , yalnızca innerTextveya valueöznitelikte (kullanıcı girdisini simüle eden) bir JS kodu değişikliği bir MutationObserver olayını tetikleyecek jsfiddle.net/pxfunc/ 04chgpws / 1 (MutationObserver olay günlüğü için console.log dosyasına bakın). Bakabileceğim farklı bir test vakanız var mı?
MikeM

189

HTML5'iniz varsa:

  • oninput (yalnızca bir değişiklik gerçekleştiğinde tetiklenir, ancak hemen gerçekleşir)

Aksi takdirde, giriş öğesinin değerinde bir değişiklik olduğunu gösterebilecek tüm bu olayları kontrol etmeniz gerekir:

  • onchange
  • onkeyup( Değil keydown veya keypressgiriş alanının değeri henüz yeni tuş olmaz gibi)
  • onpaste (desteklendiğinde)

ve belki:

  • onmouseup (Bundan emin değilim)

@naomik testimden onay kutusu girişleri için çalışır; IE / Edge hariç. Diğer bazı istisnalar görünebilir, ancak bu giriş türleri (IMHO) için onchange kullanmak daha akıllıdır.
HellBaby

82

HTML5 ile ve jQuery kullanmadan, inputetkinliği kullanabilirsiniz :

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

Girişin metni her değiştiğinde tetiklenir.

IE9 + ve diğer tarayıcılarda desteklenir.

Burada bir jsFiddle'da canlı deneyin .



1
'değişiklik' metin değiştiğinde değil, yalnızca bulanıklaştırmada tetiklenir. Metin değişikliklerini algılamak için 'giriş' olayını kullanın.
Dermot Doherty

14

Diğerlerinin önerdiği gibi, durumunuzdaki çözüm birden fazla olayı koklamaktır .
Bu işi yapan eklentiler genellikle aşağıdaki olayları dinler:

$ input . açık ( 'keydown keypress keyup mousedown click mouseup' , işleyiciyi değiştir );

Uygun olabileceğini düşünüyorsanız focus, blurve diğer etkinlikleri de ekleyebilirsiniz .
Dinlemek için olayları aşmamanızı öneririm, çünkü tarayıcı belleğine kullanıcının davranışına göre yürütmek için daha fazla prosedür yükler.

Uyarı: bir giriş öğesinin değerini JavaScript ile değiştirmenin (örn. JQuery .val()yöntemiyle) yukarıdaki olaylardan hiçbirini tetiklemeyeceğini unutmayın.
(Referans: https://api.jquery.com/change/ ).


Ayrıca otomatik tamamlama ile ilgili sorunları önlemek için odaklanma eklemenizi öneririz
binar

Anlıyorum. Arama yaptım ve odaklama yalnızca IE tarafından ve kısmen Chrome tarafından destekleniyor gibi görünüyor, değil mi?
Emanuele Del Grande

5
Hafif bir ek olarak, jQuery'den olayı tetiklemek için, .val()örneğin bir giriş alanındaki bir değişiklik olayı için ilgili eylemi çağırabilirsiniz, böyle bir şey yaparsınız ... $('#element').val(whatever).change()
SourceVisor

2

Öğenin içinde bir şey değiştiğinde etkinliğin tetiklenmesini istiyorsanız, keyup etkinliğini kullanabilirsiniz .


Tamam, ama bu tuşlar aşağı yukarı aynı değil mi? Girişin "kirli" olup olmadığını kontrol etmem gerekecek mi?
Banshee

@SnowJim, yalnızca girdi gerçekten değiştiğinde bir şeyler yapmak istiyorsanız onchange, durumu kendiniz kullanmanız veya izlemeniz gerekir. keydownetkinleştiği çünkü çalışmıyor önce girişin durumu değişti alır.
Alnitak

@Alnitak tam olarak ve bu yüzden burada soruyu soruyorum. Değişim çalışmıyor, sadece girişten ayrılırken atıldı.
Banshee

Odadaki fil elbette hareketlidir. Orada hiçbir klavye veya fare olayı çok işe yaramaz eminim. : p
Askdesigners

@Askdesigners Keyup / down etkinlikleri mobil cihazlarda da aynı şekilde çalışmalıdır.
Jivings

2

//. blur öğe odak kaybettiğinde tetiklenir

$('#target').blur(function() {
  alert($(this).val());
});

// Manuel olarak tetiklemek için şunu kullanın:

$('#target').blur();

1
.change sadece giriş odağı kaybettiğinde ve değer değiştiğinde atıldığım gibi, giriş (metin) değiştiğinde bile (girişteki metin değiştiğinde) bir tane almam gerekiyor. Bulanıklaştırma yalnızca giriş odağı kaybettiğinde tetiklenir.
Banshee

1

Giriş HTML Öğeleri ile kullanabileceğiniz keyup ve keypress gibi jQuery olayları vardır . Ayrıca blur () olayını da kullanabilirsiniz.


1
.change sadece giriş odağı kaybettiğinde ve değer değiştiğinde atıldığım gibi, giriş (metin) değiştiğinde bile (girişteki metin değiştiğinde) bir tane almam gerekiyor. Bulanıklaştırma yalnızca giriş odağı kaybettiğinde tetiklenir.
Banshee

1
bir keypressolay sırasında bir girişin değerini güvenilir bir şekilde kontrol edemezsiniz çünkü basılı tuş henüz bu değeri değiştirmez.
Alnitak

0

Bu, jQuery 1.7 ve üstünü kullanan bir girdideki her değişikliği kapsar:

$(".inputElement").on("input", null, null, callbackFunction);
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.