Pada IE saya bisa melakukan ini dengan jQuery (sangat tidak standar, tetapi berfungsi)
if ($.browser.msie)
$(document).keydown(function(e) { if (e.keyCode == 8) window.event.keyCode = 0;});
Tetapi apakah mungkin dilakukan dengan cara yang berfungsi pada Firefox, atau dengan cara lintas-browser untuk mendapatkan bonus?
Untuk catatan:
$(document).keydown(function(e) { if (e.keyCode == 8) e.stopPropagation(); });
tidak melakukan apa-apa.
$(document).keydown(function(e) { if (e.keyCode == 8) e.preventDefault(); });
memecahkan masalah, tetapi membuat kunci ruang mundur tidak dapat digunakan pada halaman, yang bahkan lebih buruk daripada perilaku asli.
EDIT: Alasan saya melakukan ini adalah karena saya tidak membuat halaman web sederhana tetapi aplikasi besar. Sangat menyebalkan kehilangan 10 menit kerja hanya karena Anda menekan backspace di tempat yang salah. Rasio mencegah kesalahan vs pengguna yang mengganggu harus jauh di atas 1000/1 dengan mencegah backspace key dari menavigasi kembali.
EDIT2: Saya tidak berusaha mencegah navigasi riwayat, hanya kecelakaan.
EDIT3: komentar @brentonstrines (pindah ke sini karena pertanyaannya sangat populer): Ini adalah 'perbaikan' jangka panjang, tetapi Anda dapat membuang dukungan Anda di balik bug Chromium untuk mengubah perilaku ini di webkit
sumber
Jawaban:
Kode ini memecahkan masalah, setidaknya di IE dan Firefox (belum menguji yang lain, tapi saya memberikan kesempatan yang masuk akal untuk bekerja jika masalahnya bahkan ada di browser lain).
sumber
d.type.toUpperCase() === 'PASSWORD'
juga. Jika tidak, terlihat bagusif( $(d).is( ":input" ) )...
d.isContentEditable
di sini.Kode ini berfungsi pada semua browser dan menelan tombol backspace ketika tidak pada elemen form, atau jika elemen form dinonaktifkan | readOnly. Ini juga efisien, yang penting ketika dijalankan pada setiap kunci yang diketikkan.
sumber
if(!rx.test(e.target.tagName) || $(e.target).is(':checkbox') || $(e.target).is(':radio') || $(e.target).is(':submit') || e.target.disabled || e.target.readOnly )
contentEditable
..is(':checkbox,:radio,:submit')
Jawaban lain di sini telah menetapkan bahwa ini tidak dapat dilakukan tanpa elemen daftar putih di mana Backspace diizinkan. Solusi ini tidak ideal karena daftar putih tidak semudah hanya textareas dan input teks / kata sandi, tetapi berulang kali ditemukan tidak lengkap dan perlu diperbarui.
Namun, karena tujuan menekan fungsionalitas backspace hanyalah untuk mencegah pengguna kehilangan data secara tidak sengaja, solusi beforeunload adalah solusi yang bagus karena modal popup mengejutkan - modal popup buruk ketika dipicu sebagai bagian dari alur kerja standar, karena pengguna terbiasa mengabaikannya tanpa membacanya, dan mereka menjengkelkan. Dalam hal ini, popup modal hanya akan muncul sebagai alternatif untuk tindakan yang langka dan mengejutkan, dan karenanya dapat diterima.
Masalahnya adalah modal sebelumnya tidak boleh muncul setiap kali pengguna menavigasi jauh dari halaman (seperti ketika mengklik tautan atau mengirimkan formulir), dan kami tidak ingin memulai daftar putih atau memasukkan daftar hitam khusus pada kondisi sebelum memuat.
Kombinasi ideal pengorbanan untuk solusi umum adalah sebagai berikut: melacak apakah backspace ditekan, dan hanya memunculkan modal onbeforeunload jika itu. Dengan kata lain:
Ini telah diuji untuk berfungsi di IE7 +, FireFox, Chrome, Safari, dan Opera. Cukup masukkan fungsi ini ke global.js Anda dan panggil dari halaman mana pun di mana Anda tidak ingin pengguna kehilangan data mereka.
Perhatikan bahwa modal onbeforeunload hanya dapat dipicu sekali, jadi jika pengguna menekan backspace lagi, modal tidak akan menyala lagi.
Perhatikan bahwa ini tidak akan memicu pada acara hashchange, namun dalam konteks itu Anda dapat menggunakan teknik lain untuk mencegah pengguna kehilangan data secara tidak sengaja.
sumber
Solusi yang lebih elegan / ringkas:
sumber
Modifikasi Jawaban erikkallen untuk mengatasi berbagai jenis input
Saya telah menemukan bahwa pengguna yang giat dapat menekan backspace pada kotak centang atau tombol radio dalam upaya sia-sia untuk menghapusnya dan sebaliknya mereka akan menavigasi mundur dan kehilangan semua data mereka.
Perubahan ini harus mengatasi masalah itu.
Edit Baru untuk membahas konten yang dapat diedit
Contoh
Untuk menguji membuat 2 file.
starthere.htm - buka ini dulu sehingga Anda punya tempat untuk kembali
test.htm - Ini akan menavigasi mundur ketika backspace ditekan saat kotak centang atau kirim memiliki fokus (dicapai dengan tabbing). Ganti dengan kode saya untuk memperbaikinya.
sumber
Berdasarkan komentar, tampaknya Anda ingin menghentikan orang kehilangan informasi dalam bentuk, jika mereka menekan backspace untuk menghapus tetapi bidang tidak fokus.
Dalam hal ini, Anda ingin melihat event handler onunload . Stack Overflow menggunakannya - jika Anda mencoba untuk meninggalkan halaman ketika Anda mulai menulis jawaban, itu muncul peringatan.
sumber
Berhenti menavigasi kode ini berfungsi!
Tetapi untuk tidak membatasi bidang teks tetapi yang lain
Untuk mencegahnya untuk bidang tertentu cukup gunakan
Mengacu pada yang di bawah ini!
Cegah BACKSPACE dari menavigasi kembali dengan jQuery (Seperti Beranda Google)
sumber
Sebagian besar jawabannya adalah jquery. Anda dapat melakukan ini dengan sempurna dalam Javascript murni, sederhana dan tidak perlu pustaka. Artikel ini adalah titik awal yang baik bagi saya tetapi karena keyIdentifier sudah tidak digunakan lagi, saya ingin kode ini lebih aman sehingga saya menambahkan || e.keyCode == 8 ke pernyataan if. Juga, kode tidak berfungsi dengan baik pada Firefox jadi saya menambahkan return false; dan sekarang ini bekerja dengan sangat baik. Ini dia:
Kode ini berfungsi dengan baik karena,
sumber
Menggabungkan solusi yang diberikan oleh "thetoolman" && "Biff MaGriff"
kode berikut tampaknya berfungsi dengan benar di IE 8 / Mozilla / Chrome
sumber
Tidak yakin mengapa tidak ada yang menjawab ini - sepertinya pertanyaan teknis yang masuk akal untuk menanyakan apakah itu mungkin.
Tidak, saya tidak berpikir ada cara lintas browser untuk menonaktifkan tombol backspace. Saya tahu itu tidak diaktifkan secara default di FF hari ini.
sumber
Saya kesulitan menemukan jawaban non-JQUERY. Terima kasih kepada Stas karena telah menempatkan saya di trek.
Chrome: Jika Anda tidak memerlukan dukungan lintas browser, Anda bisa menggunakan daftar hitam, bukan daftar putih. Versi JS murni ini berfungsi di Chrome, tetapi tidak di IE. Tidak yakin tentang FF.
Di Chrome (ver. 36, pertengahan 2014), penekanan tombol yang bukan pada input atau elemen yang dapat diedit tampaknya ditargetkan untuk
<BODY>
. Ini memungkinkan menggunakan daftar hitam, yang saya pilih untuk masuk daftar putih. IE menggunakan target klik terakhir - jadi mungkin div atau apa pun. Itu membuat ini tidak berguna di IE.Cross Browser: Untuk javascript murni, saya menemukan jawaban Stas sebagai yang terbaik. Menambahkan satu lagi pemeriksaan kondisi untuk konten yang dapat diedit membuatnya berfungsi untuk saya *:
* Perhatikan bahwa IEs [edit: dan Spartan / TechPreview] memiliki "fitur" yang membuat elemen terkait tabel tidak dapat diedit . Jika Anda mengklik salah satunya dan MAKA tekan backspace, itu AKAN menavigasi kembali. Jika Anda tidak memiliki
<td>
s yang dapat diedit , ini bukan masalah.sumber
Solusi ini mirip dengan yang lain yang telah diposting, tetapi menggunakan daftar putih sederhana sehingga mudah disesuaikan untuk memungkinkan backspace dalam elemen tertentu hanya dengan mengatur pemilih dalam fungsi .is ().
Saya menggunakannya dalam formulir ini untuk mencegah backspace pada halaman dari menavigasi kembali:
sumber
Untuk sedikit menguraikan jawaban luar biasa @ erikkallen , berikut adalah fungsi yang memungkinkan semua jenis input berbasis keyboard, termasuk yang diperkenalkan dalam HTML5 :
sumber
JavaScript - cara jQuery:
Javascript - cara asli, yang berfungsi untuk saya:
sumber
Saya punya beberapa masalah dengan solusi yang diterima dan plugin Select2.js; Saya tidak dapat menghapus karakter dalam kotak yang dapat diedit karena tindakan penghapusan sedang dicegah. Ini solusi saya:
Select2 membuat Span dengan atribut "contentEditable" yang disetel ke true untuk kotak kombo yang dapat diedit di dalamnya. Saya menambahkan kode ke akun untuk span tagName dan atribut yang berbeda. Ini menyelesaikan semua masalah saya.
Sunting: Jika Anda tidak menggunakan plugin combobox Select2 untuk jquery, maka solusi ini mungkin tidak diperlukan oleh Anda, dan solusi yang diterima mungkin lebih baik.
sumber
sumber
Kode ini menyelesaikan masalah di semua browser:
sumber
DIV
atauTD
.Cara termudah untuk mencegah navigasi saat menekan backspace
sumber
Menggunakan Dojo toolkit 1.7, ini berfungsi di IE 8:
sumber
Sudahkah Anda mencoba solusi yang sangat sederhana dengan hanya menambahkan atribut berikut ke bidang teks hanya baca Anda:
onkeydown = "return false;"
Ini akan menjaga browser agar tidak kembali ke riwayat ketika tombol Backspace ditekan dalam bidang teks hanya baca. Mungkin saya kehilangan niat Anda yang sebenarnya, tetapi sepertinya ini akan menjadi solusi paling sederhana untuk masalah Anda.
sumber
Solusi yang jauh lebih rapi -
Bergantian, Anda hanya dapat memeriksa apakah
sumber
Versi javascript murni, yang berfungsi di semua browser:
Tentu saja Anda dapat menggunakan "INPUT, TEXTAREA" dan gunakan "if (! Regex.test (elements))" lalu. Yang pertama bekerja dengan baik untuk saya.
sumber
Performa?
Saya khawatir tentang kinerja dan membuat biola: http://jsfiddle.net/felvhage/k2rT6/9/embedded/result/
Saya telah menganalisis metode paling menjanjikan yang saya temukan di utas ini. Ternyata, mereka semua sangat cepat dan kemungkinan besar tidak menimbulkan masalah dalam hal "kelesuan" saat mengetik. Metode paling lambat yang saya lihat adalah sekitar 125 ms untuk 10.000 Panggilan di IE8. Yaitu 0,0125 ms per Stroke.
Saya menemukan metode yang diposting oleh Codenepal dan Robin Maben menjadi yang tercepat ~ 0.001ms (IE8) tetapi waspadalah terhadap semantik yang berbeda.
Mungkin ini melegakan bagi seseorang yang memperkenalkan fungsi semacam ini pada kodenya.
sumber
Jawaban erikkallen yang dimodifikasi:
sumber
Solusi ini bekerja dengan sangat baik ketika diuji.
Saya memang menambahkan beberapa kode untuk menangani beberapa bidang input yang tidak ditandai dengan input, dan untuk mengintegrasikan dalam aplikasi Oracle PL / SQL yang menghasilkan formulir input untuk pekerjaan saya.
"Dua sen" saya:
sumber
Saya membuat proyek NPM dengan versi bersih dari erikkallen yang saat ini diterima
https://github.com/slorber/backspace-disabler
Pada dasarnya ia menggunakan prinsip yang sama tetapi:
sumber
Inilah penulisan ulang jawaban yang saya pilih. Saya mencoba memeriksa element.value! == undefined (karena beberapa elemen seperti mungkin tidak memiliki atribut html tetapi mungkin memiliki properti nilai javascript di suatu tempat di rantai prototipe), namun itu tidak berfungsi dengan baik dan memiliki banyak kasus tepi. Tampaknya tidak ada cara yang baik untuk membuktikan di masa depan, jadi daftar putih tampaknya merupakan pilihan terbaik.
Ini mendaftarkan elemen pada akhir fase gelembung acara, jadi jika Anda ingin menangani Backspace dengan cara kustom apa pun, Anda bisa melakukannya di penangan lain.
Ini juga memeriksa instance dari HTMLTextAreElement karena seseorang secara teoritis dapat memiliki komponen web yang diwarisi dari itu.
Ini tidak memeriksa contentEditable (gabungkan dengan jawaban lain).
https://jsfiddle.net/af2cfjc5/15/
sumber
Sitepoint: Nonaktifkan kembali untuk Javascript
event.stopPropagation()
danevent.preventDefault()
tidak melakukan apa pun di IE. Saya harus mengirim kembalievent.keyCode == 11
(saya hanya mengambil sesuatu) daripada hanya mengatakan"if not = 8, run the event"
untuk membuatnya bekerja.event.returnValue = false
juga berfungsi.sumber
Metode lain menggunakan jquery
sumber
Saya telah menggunakan ini dalam kode saya untuk beberapa waktu sekarang. Saya menulis tes online untuk siswa dan mengalami masalah ketika siswa menekan backspace selama tes mereka dan itu akan membawa mereka kembali ke layar login. Frustrasi! Ini bekerja pada FF pasti.
sumber