Saya memiliki .submit()
acara yang diatur untuk pengiriman formulir. Saya juga memiliki beberapa formulir di halaman, tetapi hanya satu di sini untuk contoh ini. Saya ingin tahu tombol kirim mana yang diklik tanpa menerapkan .click()
acara untuk masing-masing.
Ini pengaturannya:
<html>
<head>
<title>jQuery research: forms</title>
<script type='text/javascript' src='../jquery-1.5.2.min.js'></script>
<script type='text/javascript' language='javascript'>
$(document).ready(function(){
$('form[name="testform"]').submit( function(event){ process_form_submission(event); } );
});
function process_form_submission( event ) {
event.preventDefault();
//var target = $(event.target);
var me = event.currentTarget;
var data = me.data.value;
var which_button = '?'; // <-- this is what I want to know
alert( 'data: ' + data + ', button: ' + which_button );
}
</script>
</head>
<body>
<h2>Here's my form:</h2>
<form action='nothing' method='post' name='testform'>
<input type='hidden' name='data' value='blahdatayadda' />
<input type='submit' name='name1' value='value1' />
<input type='submit' name='name2' value='value2' />
</form>
</body>
</html>
Selain menerapkan acara .click () pada setiap tombol, apakah ada cara untuk menentukan tombol kirim mana yang diklik?
name
?Jawaban:
Saya mengajukan pertanyaan yang sama: Bagaimana saya bisa mendapatkan tombol yang menyebabkan pengiriman dari acara pengiriman formulir?
Saya akhirnya menemukan solusi ini dan itu bekerja dengan cukup baik:
Dalam kasus Anda dengan beberapa bentuk, Anda mungkin perlu sedikit men-tweak ini tetapi itu masih berlaku
sumber
Saya menemukan bahwa ini berhasil.
sumber
Ini bekerja untuk saya:
sumber
id
satuactiveElement
, saya lakukan$(document.activeElement).attr('id');
document.activeElement.id
document.activeElement
bukan input. Dalam kasus saya ini adalah modal div (yang berisi formulir).Ketika formulir dikirimkan:
document.activeElement
akan memberi Anda tombol kirim yang diklik.document.activeElement.getAttribute('value')
akan memberi Anda nilai tombol itu.sumber
Inilah pendekatan yang tampaknya lebih bersih untuk tujuan saya.
Pertama, untuk semua dan semua bentuk:
Ketika acara klik ini diaktifkan untuk formulir, itu hanya merekam target yang berasal (tersedia di objek acara) untuk diakses nanti. Ini adalah langkah yang cukup luas, karena akan diaktifkan untuk klik di mana saja pada formulir. Komentar pengoptimalan diterima, tetapi saya menduga itu tidak akan pernah menyebabkan masalah yang nyata.
Kemudian, di
$('form').submit()
, Anda dapat menanyakan apa yang terakhir diklik, dengan sesuatu sepertisumber
return false
, sedangkan metode ini berfungsi dengan benar karena klik terikat pada formulir alih-alih anak-anaknya.... $(event.target))
tetapi tidak dapat diedit karena hasil edit harus> 6 karakterWow, beberapa solusi bisa jadi rumit! Jika Anda tidak keberatan menggunakan global yang sederhana, manfaatkan fakta bahwa acara klik tombol input akan menyala terlebih dahulu. Seseorang dapat memfilter pemilih $ ('input') lebih lanjut untuk salah satu dari banyak formulir dengan menggunakan $ ('# input myForm').
sumber
Saya telah menemukan solusi terbaiknya
Ini tidak hanya bekerja pada input, tetapi juga bekerja pada tag tombol. Juga mendapat id dari tombol.
sumber
$(document.activeElement).attr('id')
kembaliundefined
Solusi lain yang mungkin adalah menambahkan bidang tersembunyi di formulir Anda:
Kemudian di fungsi siap tambahkan fungsi untuk merekam tombol apa yang ditekan:
Sekarang di form submission handler baca variabel tersembunyi dan putuskan berdasarkan hal itu:
sumber
Membangun apa yang Stan dan yann-h lakukan tetapi yang ini default ke tombol pertama. Keindahan dari pendekatan keseluruhan ini adalah ia mengambil klik dan tombol enter (bahkan jika fokusnya tidak pada tombol. Jika Anda perlu mengizinkan masuk dalam formulir, maka cukup tanggapi ini ketika sebuah tombol terfokus ( yaitu jawaban Stan) .Dalam kasus saya, saya ingin mengizinkan masuk untuk mengirimkan formulir bahkan jika fokus pengguna saat ini adalah pada kotak teks.
Saya juga menggunakan atribut 'nama' daripada 'id' tetapi ini adalah pendekatan yang sama.
sumber
Yang ini berhasil untuk saya
sumber
Jika yang Anda maksud dengan tidak menambahkan acara .click adalah bahwa Anda tidak ingin memiliki penangan terpisah untuk acara tersebut, Anda dapat menangani semua klik (kirim) dalam satu fungsi:
sumber
event.preventDefault
atau lakukan sesuatu sepertiinput.parents("form")[0].submit()
.Karena saya tidak dapat mengomentari jawaban yang diterima, saya membawa versi modifikasi yang harus mempertimbangkan unsur-unsur akun yang berada di luar formulir (yaitu: dilampirkan ke formulir menggunakan
form
atribut). Ini untuk browser modern: http://caniuse.com/#feat=form-attribute . Iniclosest('form')
digunakan sebagai fallback untukform
atribut yang tidak didukungsumber
"button,[type=submit]"
tambahkan bidang tersembunyi
sumber
button[type=submit]
daninput[type=image]
.Bagi saya, solusi terbaik adalah ini:
sumber
Bekerja dengan jawaban yang luar biasa ini , Anda dapat memeriksa elemen aktif (tombol), menambahkan input tersembunyi ke formulir, dan secara opsional menghapusnya di akhir submit handler.
Catatan: Saya pribadi menambahkan kelas
form-js
pada semua formulir yang dikirimkan melalui JavaScript.sumber
Mirip dengan jawaban Stan tetapi:
sumber
Ini adalah solusi yang digunakan oleh saya dan bekerja dengan sangat baik:
sumber
Ini membantu saya https://stackoverflow.com/a/17805011/1029257
Formulir dikirimkan hanya setelah tombol kirim diklik.
sumber
Ini solusinya:
sumber
Saya juga membuat solusi, dan ini bekerja dengan sangat baik:
Menggunakan jQuery dan CSS
Pertama, saya membuat kelas CSS cepat, ini bisa tertanam atau dalam file terpisah.
Selanjutnya, Pada acara klik tombol dalam formulir, tambahkan kelas CSS ke tombol. Jika tombol sudah memiliki kelas CSS, hapuslah. (Kami tidak ingin dua kelas CSS [Untuk berjaga-jaga]).
Sekarang, uji tombol untuk melihat itu memiliki kelas CSS, jika tombol yang diuji tidak memiliki CSS, maka tombol lainnya akan.
Semoga ini membantu! Bersulang!
sumber
button[type=submit]
daninput[type=image]
.hasClass()
danremoveClass()
berlebihan, karenaaddClass()
tidak akan menambah kelas yang sama dua kali.Anda dapat membuat input type = "hidden" sebagai penampung untuk informasi id tombol.
Dalam hal ini formulir meneruskan nilai "1" (id dari tombol Anda) saat mengirim. Ini berfungsi jika onClick terjadi sebelum mengirimkan (?), Apa yang saya tidak yakin apakah itu selalu benar.
sumber
Cara mudah untuk membedakan <button> atau <input type = "button" ...> yang ditekan, adalah dengan memeriksa 'id' mereka:
sumber
Berikut adalah contoh, yang menggunakan formulir ini.untuk mendapatkan formulir yang benar dengan pengirimannya, dan bidang data untuk menyimpan elemen yang terakhir diklik / fokus. Saya juga memasukkan kode kirim di dalam batas waktu untuk memastikan acara klik terjadi sebelum dijalankan (beberapa pengguna melaporkan dalam komentar bahwa di Chrome kadang-kadang acara klik dipecat setelah pengiriman).
Bekerja ketika menavigasi baik dengan tombol dan dengan mouse / jari tanpa mengandalkan browser untuk mengirim acara klik pada tombol RETURN (meskipun tidak ada salahnya), saya menambahkan pengendali acara untuk acara fokus untuk tombol dan bidang.
Anda dapat menambahkan tombol ketik = "kirim" ke item yang menyelamatkan diri saat diklik.
Dalam demo saya menetapkan batas merah untuk menampilkan item yang dipilih dan peringatan yang menunjukkan nama dan nilai / label.
Ini FIDDLE
Dan ini adalah kode (yang sama):
Javascript:
DUMMY HTML:
DUMB CSS:
sumber
Saya menulis fungsi ini yang membantu saya
lalu gunakan
sumber
sumber
Anda ingin menggunakan window.event.srcElement.id seperti ini:
untuk tombol yang terlihat seperti:
Anda akan mendapatkan peringatan yang berbunyi: "item yang diklik adalah tombol myButton.
Dalam contoh Anda yang ditingkatkan, Anda dapat menambahkan window.event.srcElement ke process_form_submission dan Anda akan memiliki referensi ke elemen mana saja yang menjalankan proses.
sumber