Setelah ditinjau dengan cermat, saya mengusulkan ini sebagai solusi yang jauh lebih bersih dalam utas ini:
$("input").focus(function(){
$(this).on("click.a keyup.a", function(e){
$(this).off("click.a keyup.a").select();
});
});
Masalah:
Berikut sedikit penjelasannya:
Pertama, mari kita lihat urutan peristiwa saat Anda mengarahkan mouse ke tab bidang.
Kami dapat mencatat semua peristiwa yang relevan seperti ini:
$("input").on("mousedown focus mouseup click blur keydown keypress keyup change",
function(e) { console.log(e.type); });
Catatan : Saya telah mengubah solusi ini untuk digunakan click
daripada mouseup
seperti yang terjadi kemudian di pipeline acara dan tampaknya menyebabkan beberapa masalah di firefox sesuai komentar @ Jocie
Beberapa browser mencoba memposisikan kursor selama mouseup
atau click
acara. Ini masuk akal karena Anda mungkin ingin memulai tanda sisipan dalam satu posisi dan menyeret untuk menyorot beberapa teks. Itu tidak dapat membuat penunjukan tentang posisi caret sampai Anda benar-benar mengangkat mouse. Jadi fungsi yang ditangani focus
ditakdirkan untuk merespons terlalu dini, meninggalkan browser untuk mengganti posisi Anda.
Tapi intinya adalah kita benar-benar ingin menangani acara fokus. Ini memberi tahu kami saat pertama kali seseorang memasuki bidang. Setelah itu, kami tidak ingin terus mengesampingkan perilaku pemilihan pengguna.
Solusinya:
Alih-alih, di dalam focus
pengendali acara, kami dapat dengan cepat melampirkan pendengar untuk acara click
(klik di) dan keyup
(tab di) yang akan diaktifkan.
Catatan : Kuncian acara tab akan benar-benar diaktifkan di bidang input baru, bukan yang sebelumnya
Kami hanya ingin memecat acara sekali. Kita bisa menggunakan .one("click keyup)
, tetapi ini akan memanggil event handler sekali untuk setiap jenis acara . Sebagai gantinya, segera setelah mouse atau keyup ditekan, kami akan memanggil fungsi kami. Hal pertama yang akan kami lakukan, adalah menghapus handler untuk keduanya. Dengan begitu, tidak masalah apakah kita melakukan tab atau mous. Fungsi tersebut harus dijalankan tepat sekali.
Catatan : Sebagian besar browser secara alami memilih semua teks selama acara tab, tetapi seperti yang ditunjukkan animasigif , kami masih ingin menangani keyup
acara tersebut, jika tidak mouseup
acara tersebut akan tetap ada kapan pun kami tab. Kami mendengarkan keduanya sehingga kami dapat mengubah dari pendengar segera setelah kami memproses seleksi.
Sekarang, kita dapat menelepon select()
setelah browser melakukan pemilihan sehingga kami yakin untuk menimpa perilaku default.
Akhirnya, untuk perlindungan ekstra, kita dapat menambahkan ruang nama acara ke mouseup
dan keyup
fungsinya sehingga .off()
metode ini tidak menghapus pendengar lain yang mungkin sedang bermain.
Diuji dalam IE 10+, FF 28+, & Chrome 35+
Atau, jika Anda ingin memperpanjang jQuery dengan fungsi yang disebut once
yang akan memunculkan tepat sekali untuk sejumlah acara :
$.fn.once = function (events, callback) {
return this.each(function () {
var myCallback = function (e) {
callback.call(this, e);
$(this).off(events, myCallback);
};
$(this).on(events, myCallback);
});
};
Kemudian Anda dapat menyederhanakan kode lebih lanjut seperti ini:
$("input").focus(function(){
$(this).once("click keyup", function(e){
$(this).select();
});
});