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

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();"/>

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 () .


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.


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.


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>

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
     }
});

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;
  }
});

-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();
            }
        });
    //}
});

Itu terlihat seperti kode untuk pertanyaan yang berbeda ... apa yang dimaksud dengan nilai huruf besar dan menampilkan / menyembunyikan konten?
Nico Haase
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.