Apakah mungkin untuk mensimulasikan acara pers utama secara terprogram dalam JavaScript?
javascript
dom-events
berjemur
sumber
sumber
Jawaban:
Versi non-jquery yang berfungsi di webkit dan tokek:
sumber
keyCode
selalu 0, dan saya tidak bisa mengubahnya.event.which
selalu seperti0
saat menggunakandocument.createEvent("KeyboardEvent")
. @ lluft membagikan detail dan solusi, yang bekerja untuk saya, dalam komentar ini di utas lainnya. Pada dasarnya, Anda perlu menggunakandocument.createEvent('Event')
untuk membuat acara umum dan kemudian mengatur jenisnyakeydown
dan memberikankeyCode
properti yang sama dengan kode kunci kunci.Jika Anda boleh menggunakan jQuery 1.3.1:
sumber
trigger
tidak dapat digunakan untuk meniru acara browser asli .Yang dapat Anda lakukan adalah secara terprogram memicu keyevent pendengar dengan menembakkan keyevents . Masuk akal untuk mengizinkan ini dari perspektif keamanan kotak pasir. Dengan menggunakan kemampuan ini, Anda dapat menerapkan pola pengamat yang khas . Anda dapat menyebut metode ini "simulasi".
Di bawah ini adalah contoh bagaimana mencapai ini dalam standar DOM W3C bersama dengan jQuery:
Contoh ini diadaptasi dari: https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events
Di jQuery:
Tetapi pada saat ini, tidak ada [DOM] cara untuk benar-benar memicu keyevents meninggalkan browser-sandbox. Dan semua vendor browser utama akan mematuhi konsep keamanan itu.
Adapun plugin seperti Adobe Flash - yang didasarkan pada NPAPI-, dan mengizinkan melewati kotak pasir: ini adalah penghapusan bertahap ; Firefox .
Penjelasan detail:
Anda tidak dapat dan Anda tidak boleh karena alasan keamanan (seperti yang telah ditunjukkan Pekka). Anda akan selalu membutuhkan interaksi pengguna di antaranya. Selain itu bayangkan peluang vendor browser dituntut oleh pengguna, karena berbagai acara keyboard terprogram akan menyebabkan spoofing serangan.
Lihat posting ini untuk alternatif dan lebih jelasnya. Selalu ada salin dan tempel berbasis flash. Ini adalah contoh yang elegan . Pada saat yang sama itu adalah kesaksian mengapa web menjauh dari vendor plugin.
Ada pola pikir keamanan serupa yang diterapkan dalam kasus kebijakan CORS opt-in untuk mengakses konten jarak jauh secara terprogram.
Jawabannya adalah:
Tidak ada cara untuk secara terprogram memicu kunci input di lingkungan browser berpasir dalam keadaan normal .
Bottomline: Saya tidak mengatakan itu tidak akan mungkin terjadi di masa depan, di bawah mode browser khusus dan / atau hak istimewa menuju tujuan akhir permainan, atau pengalaman pengguna yang serupa. Namun sebelum memasuki mode tersebut, pengguna akan dimintai izin dan risiko, mirip dengan model API Layar Penuh .
Berguna: Dalam konteks KeyCodes, alat ini dan pemetaan kode kunci akan berguna.
Pengungkapan: Jawabannya didasarkan pada jawaban di sini .
sumber
Anda dapat mengirim acara keyboard pada elemen seperti ini
sumber
keypress
disusutkan, menggunakankeydown
sebagai gantinya -> developer.mozilla.org/en-US/docs/Web/Events/keypressAnda bisa menggunakan
dispatchEvent()
:Saya tidak menguji ini, tetapi ini diadaptasi dari kode pada dokumentasi dispatchEvent () . Anda mungkin ingin membacanya, dan juga dokumen untuk createEvent () dan initKeyEvent ().
sumber
initKeyEvent
atauinitKeyboardEvent()
. Keduanya sudah usang karena menggunakan konstruktor KeyboardEvent () .Anda dapat membuat dan mengirim acara keyboard, dan mereka akan memicu penangan acara terdaftar yang sesuai, namun mereka tidak akan menghasilkan teks apa pun , jika dikirim ke elemen input misalnya.
Untuk sepenuhnya mensimulasikan input teks, Anda perlu membuat urutan kejadian keyboard dan secara eksplisit mengatur teks elemen input. Urutan peristiwa tergantung pada seberapa menyeluruh Anda ingin mensimulasikan input teks.
Bentuk paling sederhana adalah:
sumber
Dalam beberapa kasus
keypress
acara tidak dapat memberikan kesungguhan yang diperlukan. Dari mozilla docs kita dapat melihat bahwa fitur tersebut sudah usang:Jadi, karena
keypress
acara tersebut digabungkan dari dua peristiwa yang dipecat secara berurutankeydown
, dan yang mengikutinyakeyup
untuk kunci yang sama, buat saja peristiwa satu per satu:sumber
Membangun jawaban dari alex2k8, berikut adalah versi revisi yang berfungsi di semua browser yang didukung jQuery (masalahnya ada pada argumen yang tidak ada di jQuery.event.trigger, yang mudah dilupakan saat menggunakan fungsi internal itu).
Anda bahkan dapat mendorong ini lebih jauh dan membiarkannya tidak hanya mensimulasikan acara tetapi juga benar-benar memasukkan karakter (jika itu adalah elemen input), namun ada banyak gotcha lintas-peramban ketika mencoba melakukan itu. Lebih baik gunakan plugin yang lebih rumit seperti SendKeys .
sumber
Pada 2019, solusi ini telah bekerja untuk saya:
Saya menggunakan ini di permainan browser saya, untuk mendukung perangkat seluler dengan tombol simulasi.
Klarifikasi: Kode ini mengirimkan satu
keydown
peristiwa, sementara penekanan tombol nyata akan memicu satukeydown
peristiwa (atau beberapa di antaranya jika ditahan lebih lama), dan kemudian satukeyup
peristiwa ketika Anda melepaskan kunci itu. Jika Anda memerlukankeyup
acara juga, Anda juga dapat mensimulasikankeyup
acara dengan mengubah"keydown"
ke"keyup"
dalam potongan kode.Ini juga mengirimkan acara ke seluruh halaman web, karenanya
document
. Jika Anda hanya ingin elemen tertentu untuk menerima acara, Anda bisa menggantidocument
elemen yang diinginkan.sumber
Trusted
?)Bagi mereka yang tertarik, Anda dapat, pada kenyataannya, menciptakan kembali peristiwa input keyboard dengan andal. Untuk mengubah teks dalam area input (memindahkan kursor, atau halaman melalui karakter input) Anda harus mengikuti model acara DOM dengan cermat: http://www.w3.org/TR/DOM-Level-3-Events/ # h4_events-inputevents
Model harus dilakukan:
Kemudian untuk setiap karakter:
Kemudian, secara opsional untuk sebagian besar:
Ini sebenarnya mengubah teks di halaman melalui javascript (tanpa mengubah pernyataan nilai) dan mematikan pendengar / penangan javascript apa pun dengan tepat. Jika Anda mengacaukan urutan, javascript tidak akan menyala dalam urutan yang sesuai, teks di kotak input tidak akan berubah, pilihan tidak akan berubah atau kursor tidak akan pindah ke ruang berikutnya di area teks.
Sayangnya kode ini ditulis untuk seorang majikan di bawah NDA jadi saya tidak bisa membagikannya, tetapi itu pasti mungkin tetapi Anda harus membuat ulang seluruh input kunci "tumpukan" untuk setiap elemen dalam urutan yang benar.
sumber
Pendekatan ini mendukung cross-browser mengubah nilai kode kunci . Sumber
sumber
cukup gunakan CustomEvent
4 ex ingin mensimulasikan ctrl + z
sumber
Berikut perpustakaan yang benar-benar membantu: https://cdn.rawgit.com/ccampbell/mousetrap/2e5c2a8adbe80a89050aaf4e02c45f02f1cc12d4/tests/libs/key-event.js
Saya tidak tahu dari mana asalnya, tetapi ini sangat membantu. Itu menambahkan
.simulate()
metodewindow.KeyEvent
, jadi Anda menggunakannya hanya denganKeyEvent.simulate(0, 13)
untuk mensimulasikanenter
atauKeyEvent.simulate(81, 81)
untuk'Q'
.Saya mendapatkannya di https://github.com/ccampbell/mousetrap/tree/master/tests .
sumber
Ini bekerja untuk saya dan itu mensimulasikan keyup untuk textaera saya. jika Anda ingin untuk seluruh halaman hanya menempatkan
KeySimulation()
pada<body>
seperti ini<body onmousemove="KeySimulation()">
atau jika tidakonmousemove
makaonmouseover
atauonload
karya juga.sumber
initKeyboardEvent
sudah usang. ( Sumber )Itu tunggal baris sekali karena penggunaan yang mudah dalam konteks konsol. Tapi mungkin masih bermanfaat.
sumber
Berikut adalah solusi yang berfungsi di Chrome dan Chromium (hanya menguji platform ini). Tampaknya Chrome memiliki beberapa bug atau pendekatan sendiri untuk menangani kode kunci sehingga properti ini harus ditambahkan secara terpisah ke KeyboardEvent.
sumber
Inilah yang berhasil saya temukan:
sumber
JavaScript asli dengan solusi yang didukung TypeScript:
Ketikkan keyCode atau properti apa pun yang Anda gunakan dan berikan ke KeyboardEventInit
Contoh
sumber
Itulah yang saya coba dengan js / typescript di chrome. Terima kasih atas jawaban ini untuk inspirasi.
sumber
segera setelah pengguna menekan kunci yang dimaksud, Anda dapat menyimpan referensi untuk hal itu dan menggunakannya pada HTML elemen lainnya:
Anda dapat mengatur keyCode jika Anda membuat acara Anda sendiri, Anda dapat menyalin parameter yang ada dari setiap kejadian keyboard nyata (mengabaikan target karena itu adalah tugas dispatchEvent) dan:
sumber
Saya tahu pertanyaannya menanyakan cara javascript mensimulasikan penekanan tombol. Tetapi bagi mereka yang mencari cara jQuery dalam melakukan sesuatu:
sumber
Bagian penting dari membuat ini berfungsi adalah untuk menyadari hal itu
charCode
,keyCode
dan semuanyawhich
merupakan metode yang sudah ketinggalan zaman . Karena itu jika mengolah kode acara tekan tombol menggunakan salah satu dari ketiganya, maka itu akan menerima jawaban palsu (misalnya default 0).Selama Anda mengakses acara pers kunci dengan metode yang tidak usang, seperti
key
, Anda harus OK.Untuk penyelesaian, saya telah menambahkan kode Javascript dasar untuk memicu acara:
sumber
Saya ingin mensimulasikan pers 'Tab' ... Memperluas jawaban Trevor, kita dapat melihat bahwa tombol khusus seperti 'tab' memang ditekan tetapi kami tidak melihat hasil aktual yang dimiliki pers 'tab'. .
mencoba mengirimkan acara-acara ini untuk 'activeElement' serta objek dokumen global keduanya - kode untuk keduanya yang ditambahkan di bawah ini;
potongan bawah ini:
sumber