Değiştirilmiş giriş metin kutusunu algıla


289

Diğer birçok soruya baktım ve aşağıdaki kod da dahil olmak üzere çok basit cevaplar buldum. Birisinin bir metin kutusunun içeriğini değiştirdiğini algılamak istiyorum, ancak bir nedenden dolayı çalışmıyor ... Konsol hataları almıyorum. Tarayıcıda change()fonksiyonda bir kesme noktası belirlediğimde asla vurmaz.

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">

1
denenecek birkaç şey var: girişe bir type = "text" verin ve tek bir öğe yapın. <input id = "inputDatabaseName" type = "text" />
szeliga

Bazı gereksiz kodları temizledik, sadece 7 yıl çok geç.
Devil's Advocate

Yanıtlar:


523

inputJavascript olayını jQuery'de şu şekilde kullanabilirsiniz :

$('#inputDatabaseName').on('input',function(e){
    alert('Changed!')
});

Saf JavaScript'te:

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

Veya bunun gibi:

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>

1
Bu etkinlik için belge bulamıyorum, ancak tam olarak beklediğim gibi çalışıyor. Doküman sayfasını nerede bulabileceğim hakkında bir fikrin var mı?
Jorge Pedret

3
HTML5 olayların listesinde bulabilirsiniz: w3schools.com/tags/ref_eventattributes.asp burada ya help.dottoro.com/ljhxklln.php
Ouadie

7
Bu çözüm aslında keyup kullanmaktan çok daha iyi. IE, keyup tetiklemeyen bir X'i tıklatarak kullanıcının giriş alanını temizlemesini sağlar.
Georg

7
Şimdiye kadar en yakın çözüm, ancak tarayıcı metin kutularında otomatik doldurma gerçekleştirdiğinde hala çalışmıyor.
Saumil

3
Bu ilk cevaptan çok daha iyi. Ctrl, Shift tuşlarının tümü keyup olarak sayılır. Ve en kötü yanı, hızlı yazmanız durumunda birkaç girişin yalnızca bir keyup olayı olarak kaydedilmesidir.
octref

174

değiştirmek yerine keyup komutunu deneyin.

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

İşte .keyup () için resmi jQuery belgeleri .


1
sigh yemin ki ben denedim (bu soruya baktıktan sonra: stackoverflow.com/questions/1443292/… ) ... ama görünüşe göre değil çünkü şimdi çalışıyor!
Şeytan'ın Avukatı

27
Değişiklik yalnızca öğe odağı kaybettiğinde ve klavyedeki bir tuş bırakıldığında tuşlar tetiklendiğinde tetiklenir.
Declan Cook

9
kullanıcı kodu ctrl + v kullanarak veya fare ile seçilen bir metni #inputDatabaseName üzerine sürükleyerek yapıştırırsa ne olur? Bunu nasıl tespit edersin?
Radu Simionescu

5
Bununla ilgili asıl sorun, içerik gerçekten değişiyorsa hala dikkate almamasıdır. Sadece bir düğmeye basıldığında
Metropolis

@ Metropolis, cevabımı gördün mü ?? stackoverflow.com/a/23266812/3160597
azerafati

103

Her cevabın bazı noktaları eksik, işte benim çözümüm:

$("#input").on("input", function(e) {
  var input = $(this);
  var val = input.val();

  if (input.data("lastval") != val) {
    input.data("lastval", val);

    //your change action goes here 
    console.log(val);
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">
<p>Try to drag the letters and copy paste</p>

Input EventÜzerinde yangınlar Klavye girişi, fare Drag , otomatik doldurma ve Kopyala-Yapıştır Chrome ve Firefox üzerinde test. Önceki değerin kontrol edilmesi, gerçek değişiklikleri algılamasını sağlar; bu, aynı şeyi yapıştırırken veya aynı karakteri vb. Yazarken tetiklenmemesi anlamına gelir.

Çalışma örneği: http://jsfiddle.net/g6pcp/473/


Güncelleme:

Ve change function yalnızca kullanıcı yazmayı bitirdiğinde ve değişiklik eylemini birkaç kez tetiklemeyi engellediğinde çalıştırmak isterseniz , bunu deneyebilirsiniz:

var timerid;
$("#input").on("input", function(e) {
  var value = $(this).val();
  if ($(this).data("lastval") != value) {

    $(this).data("lastval", value);
    clearTimeout(timerid);

    timerid = setTimeout(function() {
      //your change action goes here 
      console.log(value);
    }, 500);
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">

Kullanıcı yazmaya başlarsa (örn. "Foobar") bu kod change action, her harf kullanıcı türü için çalışmanızı engeller ve yalnızca kullanıcı yazmayı bıraktığında çalışır, Bu özellikle girişleri sunucuya gönderdiğinizde (örn. Arama girişleri), yollu sunucu yapar tek arayışını foobarve altı değil arar fve sonra fove sonra foove foobvb.


1
Bu denedim yaklaşık 6 den ilk çalışan oldu. Muhteşem. Teşekkürler.
Enkode

IE9 üzerinde neredeyse çalışır: bir karakteri silerseniz olayı tetiklemez. Çok iyi bir çözüm olsa
Soma

@Soma, diğerleri "IE kırma bir kusur değil bir özelliktir";) IE artık devam etmesine rağmen ama bunun için bir düzeltme varsa bize bildirin
azerafati

Biliyorum, ama iş için yapmalıydım :( Aslında, kullanıyorum: kullan $("#input").focusout(function () {}). Girişinizin dışını tıkladığınızda, olay tetiklenir. Chrome ve Firefox'un mevcut sürümü ve IE9
Soma

2
@Soma, IE'nin çalışması için tek yol buysa, sadece bu satırı değiştirerek yolumu kullanabilirsiniz$("#input").on("input focusout",function(e){
azerafati

18

Metin girişleri change odağı kaybedene kadar olayı başlatmaz. Girişin dışına tıklayın, uyarı görünecektir.

Metin girişi odağı kaybetmeden önce geri arama tetiklenirse, .keyup()etkinliği kullanın .


changeburada çalışıyor: jsfiddle.net/g6pcp ; keyupiyi bir yol olmayan her
tuştan

1
@diEcho Uyarı sadece kodunu çalıştırmak için bir örnek olduğunu düşünüyorum ... sonunda ne yapmak niyetinde değil.
Scott Harwell

@diEcho Scott'ın söyledikleri, sadece test amaçlıydı. İşte böyle hata ayıkladım: D
Devil's Advocate

@ Lütfen lütfen yerine uygun bir hata ayıklayıcı kullanın alert(). Hata ayıklamayı çok daha kolay
Matt Ball

13

onkeyup, onpaste, onchange, oninputtarayıcı metin kutularında otomatik doldurma gerçekleştirdiğinde başarısız görünüyor. Böyle bir durumu ele autocomplete='off'almak için tarayıcının metin kutusunu otomatik olarak doldurmasını önlemek amacıyla metin alanınıza " " ekleyin,

Örneğin,

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>

3

Benim durumumda, bir tarih seçici bağlı bir metin kutusu vardı. Benim için çalışan tek çözüm, tarih seçicinin onSelect olayında ele almaktı.

<input type="text"  id="bookdate">

$("#bookdate").datepicker({            
     onSelect: function (selected) {
         //handle change event here
     }
});

0

Ben de kullanabilirsiniz keydowndüşünüyorum:

$('#fieldID').on('keydown', function (e) {
  //console.log(e.which);
  if (e.which === 8) {
    //do something when pressing delete
    return true;
  } else {
    //do something else
    return false;
  }
});

-5

ÇALIŞMA:

$("#ContentPlaceHolder1_txtNombre").keyup(function () {
    var txt = $(this).val();
        $('.column').each(function () {
            $(this).show();
            if ($(this).text().toUpperCase().indexOf(txt.toUpperCase()) == -1) {
                $(this).hide();
            }
        });
    //}
});

Bu, farklı bir sorunun koduna benziyor ... Üst değer değerleri ve içeriği gösterme / gizleme ile ilgili şeyler nedir?
Nico Haase
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.