Cara terbaik untuk melacak onchange saat Anda mengetik input type = "text"?

449

Dalam pengalaman saya, input type="text" onchangeperistiwa biasanya terjadi hanya setelah Anda meninggalkan ( blur) kontrol.

Apakah ada cara untuk memaksa browser untuk memicu onchangesetiap kali textfieldkonten berubah? Jika tidak, apa cara paling elegan untuk melacak "secara manual" ini?

Menggunakan onkey*acara tidak dapat diandalkan, karena Anda dapat mengklik kanan bidang dan memilih Tempel, dan ini akan mengubah bidang tanpa input keyboard apa pun.

Apakah setTimeoutsatu-satunya jalan? .. Jelek :-)

Ilya Birman
sumber
@Apakah ada kemungkinan Anda dapat memperbarui jawaban yang Anda terima sehingga yang kedaluwarsa tidak disematkan ke atas?
Flimm

Jawaban:

271

Memperbarui:

Lihat jawaban lain (2015).


Jawaban Asli 2009:

Jadi, Anda ingin onchangeacara tersebut diaktifkan pada keydown, blur, dan paste? Itu ajaib.

Jika Anda ingin melacak perubahan saat diketik, gunakan "onkeydown". Jika Anda perlu menjebak operasi tempel dengan mouse, gunakan "onpaste"( IE , FF3 ) dan "oninput"( FF, Opera, Chrome, Safari 1 ).

1 Rusak untuk <textarea>di Safari. Gunakan textInputsebagai gantinya

Crescent Fresh
sumber
22
onkeypressharus digunakan sebagai ganti onkeydown. onkeydownkebakaran ketika kunci diklik. Jika pengguna menekan tombol, acara hanya akan diaktifkan sekali untuk karakter pertama. onkeypresskebakaran setiap kali char ditambahkan ke bidang teks.
fent
61
Tidak cukup ajaib untuk onchangemenembak semua tindakan itu. <input onchange="doSomething();" onkeypress="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();">akan cukup baik untuk sebagian besar.
Agustus
1
Bagaimana dengan menghapus beberapa teks dalam kotak input menggunakan mouse? Saya tidak berpikir ini akan berhasil.
Jeevan
47
Dengan jquery 1.8.3, terlihat seperti:$().on('change keydown paste input', function() {})
Narfanator
4
@ AriWais: YA, omg sebagian besar SO harus ditinggalkan. Orang-orang jawaban ini adalah 8 tahun . Saya berharap ada tombol "usang" untuk jawaban lama seperti ini, dan komunitas dapat memilih yang lebih baik.
Crescent Fresh,
658

Hari-hari ini dengarkan oninput. Rasanya seperti onchangetanpa perlu kehilangan fokus pada elemen. Itu adalah HTML5.

Ini didukung oleh semua orang (bahkan ponsel), kecuali IE8 dan di bawah. Untuk IE tambahkan onpropertychange. Saya menggunakannya seperti ini:

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>

Robert Siemer
sumber
63
Dalam dunia yang terus berubah seperti Standar Web, terkadang jawaban yang diterima dapat diubah setelah beberapa tahun ... Ini adalah jawaban yang baru diterima bagi saya.
Erick Petrucelli
1
Dukungan untuk oninputbahkan di IE9 meskipun parsial ( caniuse.com/#feat=input-event ).
Kenston Choi
Mungkin ada baiknya menggunakan innerTextdi tempat innerHTMLsehingga setiap markup tidak diberikan
Jeevan Takhar
47

Kode di bawah ini berfungsi dengan baik untuk saya dengan Jquery 1.8.3

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

Javascript / JQuery:

$("#myId").on('change keydown paste input', function(){
      doSomething();
});
Amrit Pal Singh
sumber
11
Pustaka jQuery tidak ditandai dalam pertanyaan.
John Weisz
21
Jquery adalah api Javascript, dan saya dibawa ke sini oleh pencarian dengan kata kunci Jquery, saya rasa tidak ada gunanya membuat pertanyaan baru untuk setiap jawaban javascript untuk jawaban Jquery ...
GaelDev
12
Jika orang tidak diizinkan untuk menyarankan penggunaan perpustakaan dalam jawaban, akan ada BANYAK lagi pertanyaan yang belum terjawab tentang SO
dietbacon
3
Kebakaran beberapa kali. Kemungkinan karena perubahan dan keydown. Kemungkinan input hanya diperlukan di sini.
mmm
1
Anda tidak memerlukannya keydownkarena itu akan menduplikasi nilai input, menghapusnya.
Youssef Al Subaihi
43

Javascript tidak dapat diprediksi dan lucu di sini.

  • onchange terjadi hanya ketika Anda mengaburkan kotak teks
  • onkeyup& onkeypressTidak selalu terjadi pada perubahan teks
  • onkeydown terjadi pada perubahan teks (tetapi tidak dapat melacak potong & tempel dengan klik mouse)
  • onpaste& oncutTerjadi dengan penekanan tombol dan bahkan dengan klik kanan mouse.

Jadi, untuk melacak perubahan di kotak teks, kita perlu onkeydown, oncutdanonpaste . Dalam panggilan balik acara ini, jika Anda memeriksa nilai kotak teks maka Anda tidak mendapatkan nilai yang diperbarui karena nilai diubah setelah panggilan balik. Jadi solusi untuk ini adalah mengatur fungsi batas waktu dengan batas waktu 50 mili-detik (atau mungkin kurang) untuk melacak perubahan.

Ini adalah retasan kotor tapi ini satu-satunya cara, seperti yang saya teliti.

Berikut ini sebuah contoh. http://jsfiddle.net/2BfGC/12/

Sanket Sahu
sumber
4
oninputdan textInputperistiwa yang merupakan solusi aktual untuk ini, tetapi tidak didukung oleh semua browser.
Sanket Sahu
Untuk poin kedua saya anggap Anda maksud onkeyupdan onkeydown, yang serupa. Keduanya dapat menangkap tombol Ctrl, Alt, Shift, dan Meta. Untuk poin peluru ketiga saya anggap Anda maksudkan onkeypress.
Daniel Stevens
12

onkeyupterjadi setelah Anda mengetik misalnya saya menekan tketika saya mengangkat jari tindakan terjadi tetapi pada keydowntindakan terjadi sebelum saya digit karaktert

Semoga ini bermanfaat bagi seseorang.

Jadi onkeyuplebih baik ketika Anda ingin mengirim apa yang baru saja Anda ketik sekarang.

Fernando André
sumber
8

Saya memiliki persyaratan serupa (bidang teks gaya twitter). Digunakan onkeyupdan onchange. onchangesebenarnya menangani operasi tempel mouse selama kehilangan fokus dari lapangan.

[Perbarui] Di HTML5 atau lebih baru, gunakan oninputuntuk mendapatkan pembaruan modifikasi karakter waktu nyata, seperti yang dijelaskan dalam jawaban lain di atas.

Mohnish
sumber
Oninput berguna jika Anda ingin mendeteksi ketika isi dari suatu textarea, input: teks, input: kata sandi atau input: elemen pencarian telah berubah, karena peristiwa onchange pada elemen-elemen ini menyala ketika elemen kehilangan fokus, tidak segera setelah modifikasi .
hkasera
@kaska Ya, dengan HTML5 oninputadalah cara untuk pergi. Tetapi, ketika saya menerapkan, HTML5 tidak ada dan kami memiliki IE 8 :(. Saya menghargai pembaruan Anda karena menyediakan informasi terkini untuk pengguna.
Mohnish
7

Jika Anda HANYA menggunakan Internet Explorer, Anda dapat menggunakan ini:

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

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

Semoga itu bisa membantu.

RolandDeschain
sumber
8
Bisa jadi untuk proyek in-house kurasa ... :)
eselk
94
Terima kasih Tuhan aku tidak tinggal di rumah itu! : D
Marco Matarazzi
13
10 tahun yang lalu tidak ada yang lucu dalam kalimat ini .. :(
Michał Tabor
4
bagi saya ini membantu, saya sedang mengembangkan proyek untuk beberapa ponsel dengan OS tertanam di mana IE adalah satu-satunya browser.
Anders M.
3
Jika Anda HANYA menggunakan Internet Explorer - LOL. Jadikan hari saya 2016!
Jack Black
4

ada solusi yang cukup dekat (jangan memperbaiki semua cara Tempel) tetapi kebanyakan dari mereka:

Ini berfungsi untuk input dan juga untuk textareas:

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

Lakukan seperti ini:

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

Seperti yang saya katakan, tidak semua cara untuk Menempelkan peristiwa di semua browser ... terburuk beberapa tidak memadamkan acara sama sekali, tetapi Timer mengerikan untuk digunakan untuk itu.

Tetapi sebagian besar cara Tempel dilakukan dengan keyboard dan / atau mouse, jadi biasanya onkeyup atau onmouseup dipecat setelah ditempelkan, juga onkeyup dipecat saat mengetik pada keyboard.

Pastikan kode cek Anda tidak membutuhkan banyak waktu ... jika tidak, pengguna akan mendapatkan impresi yang buruk.

Ya, triknya adalah menembakkan kunci dan mouse ... tapi waspadalah keduanya dapat dipecat, jadi ingatlah seperti itu !!!

z666zz666z
sumber
4

Tolong, nilai pendekatan berikutnya menggunakan JQuery:

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
});
Alex Uke
sumber
Saya menggunakan cara yang sama
:)
Saya menyadari ini bukan jawaban terbaru, tetapi tidak akan mengaburkan dan memfokuskan kembali input pada setiap keyup mengacaukan penempatan kursor jika ada di mana pun kecuali akhir input?
Michael Martin-Smucker
@ MichaelMartin-Smucker Anda akan berpikir begitu, tetapi ternyata tidak: jsfiddle.net/gsss8c6L
Clonkex
4

"input" bekerja untuk saya.

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

Anda bisa menggunakan keydown, keyupdan keypressacara juga.

Gumbo
sumber
3

Untuk melacak setiap coba contoh ini dan sebelum itu benar-benar mengurangi kursor berkedip ke nol.

<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: event menghasilkan saat keluar

onchange: event menghasilkan saat keluar jika ada perubahan yang dibuat pada inputtext

onkeydown: event menghasilkan pada sembarang tombol tekan (untuk tahan lama juga)

onkeyup: event menghasilkan pada setiap rilis kunci

onkeypress: sama seperti onkeydown (atau onkeyup) tetapi tidak akan bereaksi untuk ctrl, backsace, alt lainnya

Venkat
sumber
1

2018 di sini, inilah yang saya lakukan:

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

Jika Anda bisa menunjukkan kelemahan dalam pendekatan ini, saya akan berterima kasih.

a20
sumber
2
2019 di sini, dan ini akan menyala beberapa kali untuk setiap penekanan tombol. Sebagai contoh, lihat di sini: jsfiddle.net/sp00n82/3r4691tq/5
sp00n
1

Metode 1: Tambahkan pendengar acara untuk input:

element.addEventListener("input", myFunction);

 

Metode 2: Tentukan oninputproperti dengan JavaScript:

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

 

Metode 3: Tentukan oninputproperti dengan HTML:

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