Mendeteksi kotak teks input yang diubah

289

Saya telah melihat banyak pertanyaan lain dan menemukan jawaban yang sangat sederhana, termasuk kode di bawah ini. Saya hanya ingin mendeteksi ketika seseorang mengubah isi kotak teks tetapi untuk beberapa alasan itu tidak berfungsi ... Saya tidak mendapatkan kesalahan konsol. Ketika saya mengatur breakpoint di browser pada change()fungsi itu tidak pernah mengenai itu.

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">
Pengacara Setan
sumber
1
hanya beberapa hal untuk dicoba: beri input type = "text" dan jadikan elemen tunggal. <input id = "inputDatabaseName" type = "text" />
szeliga
Membersihkan beberapa kode yang tidak perlu, terlambat hanya 7 tahun.
Pengacara Setan

Jawaban:

523

Anda dapat menggunakan inputacara Javascript di jQuery seperti ini:

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

Dalam JavaScript murni:

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

Atau seperti ini:

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>
Ouadie
sumber
1
Tampaknya tidak dapat menemukan dokumentasi untuk acara ini, tetapi berfungsi persis seperti yang saya harapkan. Adakah gagasan di mana saya dapat menemukan halaman dokumen?
Jorge Pedret
3
Anda dapat menemukannya di daftar acara HTML5: w3schools.com/tags/ref_eventattributes.asp atau di sini help.dottoro.com/ljhxklln.php
Ouadie
7
Solusi ini sebenarnya jauh lebih baik daripada menggunakan keyup. Misalnya IE memungkinkan pengguna mengosongkan bidang input dengan mengklik X yang tidak memicu keyup.
Georg
7
Solusi terdekat sejauh ini, tetapi masih tidak berfungsi saat browser melakukan pengisian otomatis pada kotak teks.
Saumil
3
Ini jauh lebih baik daripada jawaban pertama. Ctrl, Shift key semua dihitung sebagai keyup. Dan bagian terburuknya adalah, jika Anda mengetik cepat, beberapa input akan didaftarkan sebagai hanya satu peristiwa keyup.
octref
173

coba keyup alih-alih perubahan.

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

Berikut dokumentasi resmi jQuery untuk .keyup () .

Scott Harwell
sumber
1
sigh aku bersumpah aku mencoba itu (setelah melihat pertanyaan ini: stackoverflow.com/questions/1443292/… ) ... tapi ternyata bukan karena itu berfungsi sekarang!
Pengacara Setan
27
ubah hanya api ketika elemen kehilangan fokus dan keyup ditembakkan ketika kunci pada keyboard dilepaskan.
Declan Cook
9
bagaimana jika pengguna menempelkan kode menggunakan ctrl + v atau dengan menyeret teks yang dipilih dengan mouse ke #inputDatabaseName? Bagaimana Anda mendeteksi itu?
Radu Simionescu
5
Masalah utama dengan ini adalah masih tidak memperhitungkan jika kontennya benar-benar berubah. Hanya tombol yang ditekan
Metropolis
@Metropolis, Anda sudah melihat jawaban saya ?? stackoverflow.com/a/23266812/3160597
azerafati
103

Setiap jawaban kehilangan beberapa poin, jadi inilah solusi saya:

$("#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>

The Input Eventkebakaran di Keyboard input, mouse Drag , Autofill dan Copy-Paste diuji pada Chrome dan Firefox. Memeriksa nilai sebelumnya membuatnya mendeteksi perubahan nyata, yang berarti tidak menembak ketika menempelkan hal yang sama atau mengetik karakter yang sama atau lain-lain.

Contoh kerja: http://jsfiddle.net/g6pcp/473/


memperbarui:

Dan jika Anda ingin menjalankan change function hanya saat pengguna selesai mengetik dan mencegah memecat tindakan perubahan beberapa kali, Anda dapat mencoba ini:

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">

Jika pengguna mulai mengetik (mis. "Foobar") kode ini mencegah Anda change actionuntuk menjalankan untuk setiap jenis pengguna huruf dan dan hanya berjalan ketika pengguna berhenti mengetik, Ini bagus khususnya ketika Anda mengirim input ke server (mis. Input pencarian), yang cara Server tidak hanya satu pencarian foobardan tidak enam pencarian untuk fkemudian fodan kemudian foodan foobdan sebagainya.

azerafati
sumber
1
Ini adalah yang pertama bekerja dari sekitar 6 yang saya coba. Luar biasa. Terima kasih.
Enkode
Hampir berfungsi di IE9: jika Anda menghapus karakter, itu tidak memecat acara. Solusi yang sangat baik
Soma
@Soma, seperti yang orang lain katakan "melanggar IE bukan cacat itu adalah fitur";) meskipun IE tidak dilanjutkan lagi tetapi jika Anda memiliki perbaikan untuk itu beri tahu kami
azerafati
Saya tahu, tapi saya harus melakukannya untuk bekerja :( Sebagai soal fakta, saya lakukan: gunakan $("#input").focusout(function () {}). Ketika Anda mengklik di luar input Anda, acara tersebut diaktifkan. Bekerja pada versi Chrome dan Firefox saat ini, dan IE9
Soma
2
@Soma, jika itu satu-satunya cara bagi IE untuk bekerja, Anda dapat menggunakannya dengan cara saya hanya dengan mengubah baris ini$("#input").on("input focusout",function(e){
azerafati
18

Input teks tidak memecat changeacara sampai kehilangan fokus. Klik di luar input dan peringatan akan ditampilkan.

Jika panggilan balik harus diaktifkan sebelum input teks kehilangan fokus, gunakan .keyup()acara tersebut.

Matt Ball
sumber
changebekerja di sini: jsfiddle.net/g6pcp ; keyupwaspada setelah setiap tombol yang bukan cara yang baik
diEcho
1
@diEcho Saya pikir peringatan itu hanya sebuah contoh untuk membuat kodenya berfungsi ... bukan apa yang dia ingin lakukan pada akhirnya.
Scott Harwell
@diEcho Apa yang dikatakan Scott, itu hanya untuk tujuan pengujian. Begitulah cara saya men-debug: D
Devil's Advocate
@Scott tolong tolong gunakan debugger yang tepat daripada alert(). Ini akan membuat proses debug jadi lebih mudah.
Matt Ball
13

onkeyup, onpaste, onchange, oninputtampaknya gagal ketika browser melakukan pengisian otomatis pada kotak teks. Untuk menangani kasus seperti ini, sertakan " autocomplete='off'" di bidang teks Anda untuk mencegah browser mengisi ulang kotak teks secara otomatis,

Misalnya,

<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>
Saumil
sumber
3

Dalam kasus saya, saya memiliki kotak teks yang dilampirkan ke datepicker. Satu-satunya solusi yang bekerja untuk saya adalah menanganinya di dalam event onSelect dari datepicker.

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

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

Saya pikir Anda dapat menggunakan keydownjuga:

$('#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;
  }
});
Yoosaf Abdulla
sumber
-5

KERJA:

$("#ContentPlaceHolder1_txtNombre").keyup(function () {
    var txt = $(this).val();
        $('.column').each(function () {
            $(this).show();
            if ($(this).text().toUpperCase().indexOf(txt.toUpperCase()) == -1) {
                $(this).hide();
            }
        });
    //}
});
guaroa mendez
sumber
Itu terlihat seperti kode untuk pertanyaan yang berbeda ... apa yang dimaksud dengan nilai huruf besar dan menampilkan / menyembunyikan konten?
Nico Haase