html <input type = “text” /> acara onchange tidak berfungsi


88

Saya mencoba melakukan eksperimen. Apa yang saya ingin terjadi adalah setiap kali pengguna mengetik sesuatu di kotak teks, itu akan ditampilkan di kotak dialog. Saya menggunakan onchangeproperti acara untuk mewujudkannya tetapi tidak berhasil. Saya masih perlu menekan tombol kirim untuk membuatnya berfungsi. Saya membaca tentang AJAX dan saya berpikir untuk mempelajarinya. Apakah saya masih memerlukan AJAX untuk membuatnya berfungsi atau cukup dengan JavaScript sederhana? Tolong bantu.

index.php

<script type="text/javascript" src="javascript.js"> </script>

<form action="index.php" method="get">
 Integer 1: <input type="text" id="num1" name="num1" onchange="checkInput('num1');" /> <br />
 Integer 2: <input type="text" id="num2" name="num2" onchange="checkInput('num2');" /> <br />
 <input type="submit" value="Compute" />
</form>

javascript.js

function checkInput(textbox) {
 var textInput = document.getElementById(textbox).value;

 alert(textInput); 
}

4
Anda dapat mengirim "ini" alih-alih id, jadi Anda tidak perlu menelepon getElementById
remi bourgarel

Ya ... terima kasih saya melakukan apa yang Ash Burlaczenko katakan kepada saya ...
Pemula Coder

Dengan JQuery, solusi bagus diusulkan di sini: stackoverflow.com/a/8167009/2065594
Cyril Jacquart

Jawaban:


127

onchangehanya dipicu saat kontrol diburamkan. Coba onkeypresssaja.


19
Tidak berfungsi untuk mendeteksi perubahan setelah pengguna menempelkan dari papan klip
Juozas Kontvainis

19
Itu baru saja memperbaiki masalah saya. Saya lebih suka onkeyup, karena mendapat nilai baru di input('element.value']
stealthjong

4
Saya juga melihat "penekanan tombol" tidak muncul setelah menekan backspace, setidaknya saat menggunakan jquery. "keyup" dimunculkan setelah menekan dan melepaskan backspace. "masukan" memecahkan masalah ini dan juga berfungsi untuk salin-tempel, dan menurut saya ini adalah solusi yang tepat di sini (seperti yang ditunjukkan pengguna "99 Masalah - Sintaks bukan" di bawah).
Patrick Finnigan

4
'onkeypres', 'onkeyup', dll. bukanlah solusi ketika seseorang ingin memanggil fungsi hanya jika teks telah berubah ! Peristiwa penting menghasilkan lalu lintas yang tidak perlu dalam kasus ini. (Aneh sekali bahwa balasan ini dipilih sebagai solusi, khususnya dengan begitu banyak suara !! Saya tidak downvote, karena saya tidak suka hanya downvote balasan. Saya lebih suka memberikan alasan mengapa itu tidak OK - Ini lebih membantu!)
Apostolos

Untuk HTML ≥5 atau jQuery ≥1.7 ada solusi lain di bawah ini, yang juga menangani penempelan dari papan klip.
pengguna202729

42

Menggunakan .on('input'... untuk memantau setiap perubahan pada input (paste, keyup, dll) dari jQuery 1.7 ke atas.

Untuk input statis dan dinamis:

$(document).on('input', '.my-class', function(){
    alert('Input changed');
});

Hanya untuk input statis:

$('.my-class').on('input', function(){
    alert('Input changed');
});

JSFiddle dengan contoh statis / dinamis: https://jsfiddle.net/op0zqrgy/7/


Ini bekerja dengan sempurna untuk saya - terima kasih. Catatan untuk orang lain - jangan lupa untuk benar-benar menjalankan kode di atas di onLoad Anda atau sesuatu untuk 'memulai' pemantauan.
Robert Penridge

Terlambat untuk berkomentar tetapi ... Mengapa Anda menyarankan menggunakan jQuery jika pengguna penjawab menampilkan JavaScript biasa?
Andrés Morales

@ AndrésMorales Ini adalah pustaka umum di mana banyak aplikasi memiliki akses langsung, dan mudah ditambahkan ke aplikasi yang tidak. Jelas, jawaban ini tidak berlaku untuk aplikasi yang tidak dapat (atau memilih untuk tidak) menggunakan jQuery.
rybo111

@ rybo111 Persis! jQuery adalah pustaka umum dan banyak digunakan, tetapi langsung terhubung di otak saya ke pertanyaan meme tentang "jumlahkan dua angka menggunakan JavaScript" dan jawaban yang paling disukai tentang penggunaan jQuery untuk melakukannya. Bukan itu masalahnya tetapi banyak orang tidak dapat memisahkan JavaScript dan jQuery.
Andrés Morales

@ AndrésMorales Perhatikan jawaban saya mencakup "paste, keyup, dll". Saya ingat solusi jQuery nyaman ketika saya menjawab pertanyaan ini (7 tahun yang lalu!).
rybo111

30

Memeriksa penekanan tombol hanyalah solusi parsial, karena dimungkinkan untuk mengubah konten bidang input menggunakan klik mouse. Jika Anda mengklik kanan pada bidang teks, Anda akan mendapatkan opsi potong dan tempel yang dapat Anda gunakan untuk mengubah nilai tanpa menekan tombol. Demikian juga, jika pelengkapan otomatis diaktifkan, Anda dapat mengklik kiri ke dalam bidang dan mendapatkan dropdown dari teks yang dimasukkan sebelumnya, dan Anda dapat memilih di antara pilihan Anda menggunakan klik mouse. Jebakan keystroke tidak akan mendeteksi salah satu dari jenis perubahan ini.

Sayangnya, tidak ada peristiwa "perubahan" yang melaporkan perubahan dengan segera, setidaknya sejauh yang saya tahu. Namun ada solusi yang berfungsi untuk semua kasus: menyiapkan peristiwa waktu menggunakan setInterval ().

Misalkan bidang masukan Anda memiliki id dan nama "kota":

<input type="text" name="city" id="city" />

Memiliki variabel global bernama "kota":

var city = "";

Tambahkan ini ke inisialisasi halaman Anda:

setInterval(lookForCityChange, 100);

Kemudian tentukan fungsi lookForCityChange ():

function lookForCityChange()
{
    var newCity = document.getElementById("city").value;
    if (newCity != city) {
        city = newCity;
        doSomething(city);     // do whatever you need to do
    }
}

Dalam contoh ini, nilai "city" dicentang setiap 100 milidetik, yang dapat Anda sesuaikan sesuai kebutuhan. Jika Anda mau, gunakan fungsi anonim alih-alih mendefinisikan lookForCityChange (). Ketahuilah bahwa kode Anda atau bahkan browser mungkin memberikan nilai awal untuk bidang masukan sehingga Anda mungkin diberi tahu tentang "perubahan" sebelum pengguna melakukan sesuatu; sesuaikan kode Anda seperlunya.

Jika gagasan kejadian waktu yang terjadi setiap sepersepuluh detik tampak canggung, Anda dapat memulai pengatur waktu saat bidang input menerima fokus dan menghentikannya (dengan clearInterval ()) saat kabur. Saya rasa tidak mungkin mengubah nilai bidang input tanpa menerima fokus, jadi menyalakan dan mematikan pengatur waktu dengan cara ini seharusnya aman.


1
Jika tidak mungkin mengubah nilai bidang masukan tanpa mendapatkan fokus dan keburaman terjadi saat elemen kehilangan fokus, mengapa tidak mencari perubahan pada onblur?
Pakman

Apakah Anda ingin mengambil tindakan saat bidang masukan berubah, atau saat kehilangan fokus setelah perubahan? Jika Anda ingin segera bertindak, Anda tidak bisa menunggu onblur.
Dragonfly

@Pakman Itu solusi yang layak dalam beberapa kasus. Tetapi jika Anda ingin melakukan pencarian-saat-Anda-mengetik - fitur yang sangat bagus IMO (mengapa pengguna harus mencari barang ketika komputer dapat melakukannya lebih cepat dan tanpa bosan?) - atau hal lain yang benar-benar seperti itu perlu terjadi ketika teks berubah, mengapa Anda tidak bisa?
The Dag

Sedih sekali.
Chuck Batson

1
@ChuckBatson Jawaban ini dari 2012. Saya perhatikan Anda memposting komentar Anda di 2016. Lihat jawaban saya jika Anda menggunakan jQuery, itu sangat mudah sekarang.
rybo111

26

HTML5 mendefinisikan oninputacara untuk menangkap semua perubahan langsung. itu berhasil untuk saya.


1
bekerja dengan kontrol pemintal type = "number" juga (yang onkeypress tidak berfungsi).
Bob

13

onchange hanya terjadi ketika perubahan pada elemen input dilakukan oleh pengguna, seringkali terjadi ketika elemen kehilangan fokus.

jika Anda ingin fungsi Anda oninputaktif setiap kali nilai elemen berubah, Anda harus menggunakan peristiwa - ini lebih baik daripada peristiwa kunci naik / turun karena nilainya dapat diubah dengan mouse pengguna yaitu ditempelkan, atau pengisian otomatis, dll.

Baca lebih lanjut tentang acara perubahan di sini

Baca lebih lanjut tentang acara masukan di sini


11

gunakan acara berikut, bukan "onchange"

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

6

Pertama, apa yang 'tidak berhasil'? Apakah Anda tidak melihat peringatan?

Selain itu, kode Anda dapat disederhanakan untuk ini

<input type="text" id="num1" name="num1" onkeydown="checkInput(this);" /> <br />

function checkInput(obj) {
    alert(obj.value); 
}

2

Saya mengalami masalah saat Safari tidak mengaktifkan peristiwa "onchange" pada bidang masukan teks. Saya menggunakan acara "perubahan" jQuery 1.7.2 dan tidak berhasil juga. Saya akhirnya menggunakan acara textchange ZURB. Ia bekerja dengan mouseevents dan dapat menyala tanpa meninggalkan lapangan:
http://www.zurb.com/playground/jquery-text-change-custom-event

$('.inputClassToBind').bind('textchange', function (event, previousText) {
    alert($(this).attr('id'));
});

2

Beberapa komentar bahwa IMO penting:

  • elemen input tidak memancarkan peristiwa 'perubahan' hingga tindakan PENGGUNA ENTER atau blur menunggu IS berperilaku benar .

  • Acara yang ingin Anda gunakan adalah "input"(" oninput "). Di sini ditunjukkan dengan baik perbedaan antara keduanya: https://javascript.info/events-change-input

  • Kedua peristiwa tersebut menandakan dua gerakan / momen pengguna yang berbeda (peristiwa "input" berarti pengguna sedang menulis atau menavigasi opsi daftar pilihan, tetapi masih tidak mengonfirmasi perubahan. "Ubah" berarti pengguna memang mengubah nilai (dengan enter atau blur kami)

  • Mendengarkan peristiwa penting seperti yang direkomendasikan di sini adalah praktik yang buruk dalam kasus ini. (seperti orang yang mengubah perilaku default ENTER pada input) ...

  • jQuery tidak ada hubungannya dengan ini. Ini semua dalam standar HTML.

  • Jika Anda kesulitan memahami MENGAPA perilaku ini benar, mungkin berguna, sebagai percobaan, gunakan editor teks atau browser Anda tanpa mouse / pad, cukup keyboard.

Dua sen saya.


1

onkeyup bekerja untuk saya. onkeypress tidak terpicu saat menekan spasi.


bagaimana saat sebuah nilai ditempel? Saya menggunakan "onpaste" untuk memicu acara juga
Louis

1

Lebih baik digunakan onchange(event)dengan <select>. Dengan <input>Anda dapat menggunakan acara di bawah ini:

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

-3

coba onpropertychange. ini hanya berfungsi untuk IE.


6
Mengapa ada orang yang ingin mempertimbangkan properti yang hanya berfungsi di BROWSER OBSOLETE yang telah ditinggalkan oleh pengembangnya? Suara negatif.
Sod Almighty
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.