Bagaimana cara mengetahui elemen DOM memiliki fokus?
Saya ingin mencari tahu, dalam JavaScript, elemen yang saat ini memiliki fokus. I've telah mencari melalui DOM dan modern't menemukan apa yang saya butuhkan, namun. Apakah ada cara untuk melakukan hal ini, dan bagaimana?
Alasan saya sedang mencari ini:
I'm mencoba untuk membuat tombol suka panah dan enter
menavigasi melalui tabel input elemen. Tab bekerja sekarang, tetapi masuk, dan panah tidak secara default tampaknya. I'sudah punya kuncinya penanganan bagian set up tapi sekarang aku perlu mencari tahu bagaimana untuk memindahkan fokus lebih dalam hal penanganan fungsi.
1226
16
Gunakan
dokumen.activeElement
, hal ini didukung di semua browser utama.Sebelumnya, jika anda mencoba untuk mencari tahu apa bentuk bidang fokus, anda tidak bisa. Untuk meniru deteksi dalam browser lama, tambahkan "fokus" event handler untuk semua bidang dan catatan terakhir yang berfokus pada bidang dalam sebuah variabel. Menambahkan "blur" handler untuk menghapus variabel pada sebuah acara blur untuk yang terakhir-fokus bidang.
Link terkait:
Seperti yang dikatakan oleh JW, anda dapat't menemukan saat ini difokuskan elemen, setidaknya dalam browser-cara independen. Tapi jika aplikasi anda YAITU hanya (beberapa...), anda dapat menemukannya dengan cara berikut :
EDIT: sepertinya IE tidak memiliki segala sesuatu yang salah setelah semua, ini adalah bagian dari rancangan HTML5 dan tampaknya akan didukung oleh versi terbaru dari Chrome, Safari dan Firefox setidaknya.
Jika anda dapat menggunakan jQuery, sekarang mendukung :fokus, pastikan anda menggunakan versi 1.6+.
Pernyataan ini akan membuat anda yang saat ini difokuskan elemen.
Dari: https://stackoverflow.com/questions/516152/how-to-select-an-element-that-has-focus-on-it-with-jquery/2061798#2061798
dokumen.activeElement
sekarang bagian dari HTML5 kerja draft keterangan, tapi mungkin belum didukung di beberapa non-utama/mobile/browser lama. Anda dapat jatuh kembali kequerySelector
(jika didukung). It's juga layak disebutkan bahwadokumen.activeElement
akan kembalidokumen.tubuh
jika tidak ada elemen yang fokus — bahkan jika jendela browser doesn't memiliki fokus.Kode berikut akan mengatasi masalah ini dan jatuh kembali ke
querySelector
memberikan sedikit dukungan yang lebih baik.Selain hal yang perlu diperhatikan adalah perbedaan kinerja antara dua metode. Query dokumen dengan penyeleksi akan selalu jauh lebih lambat daripada mengakses
activeElement
properti. Melihat ini jsperf.com tes.Dengan sendirinya,
dokumen.activeElement
masih bisa kembali elemen jika dokumen isn't terfokus (dan dengan demikian tidak ada dalam dokumen fokus!)Anda mungkin * ingin bahwa perilaku, atau mungkin* tidak peduli (misalnya hanya
keydown event), tetapi jika anda perlu untuk mengetahui sesuatu adalah benar-benar fokus, selain itu anda dapat cek [
dokumen.hasFocus()`](https://developer.mozilla.org/en-US/docs/Web/API/Document/hasFocus).Berikut ini akan memberikan anda fokus elemen jika ada satu, atau yang lain
null
.Untuk memeriksa apakah spesifik elemen memiliki fokus,'s sederhana:
Untuk memeriksa apakah apapun ** terfokus, it's lebih kompleks lagi:
Robustness Catatan: Dalam kode di mana pemeriksaan terhadap dokumen.tubuh
dan
dokumen.documentElement, hal ini karena beberapa browser kembali salah satu atau
null` ketika tidak ada yang fokus.Itu doesn't account jika
<body>
(atau mungkin<html>
) memilikitabIndex
atribut dan dengan demikian benar-benar bisa fokus. Jika anda're menulis sebuah perpustakaan atau sesuatu dan ingin menjadi kuat, anda mungkin harus menangani itu entah bagaimana.Berikut ini's (berat airquotes) "satu-liner" versi mendapatkan fokus elemen, yang ini secara konseptual lebih rumit karena anda harus tahu tentang hubungan arus pendek, dan y'tahu, jelas-jelas itu doesn't cocok pada satu baris, dengan asumsi anda ingin untuk dapat dibaca. I'm tidak akan merekomendasikan yang satu ini. Tapi jika anda're 1337 hax0r, idk... itu's ada. Anda juga bisa menghapus
|| null
bagian jika anda don't keberatanpalsu
dalam beberapa kasus. (Anda masih bisa mendapatkannull
jikadokumen.activeElement
adalahnol
):Untuk memeriksa apakah elemen tertentu adalah fokus, atau anda bisa menggunakan peristiwa, namun cara ini membutuhkan setup (dan berpotensi teardown), dan yang lebih penting, mengasumsikan keadaan awal:
Anda bisa memperbaiki keadaan awal asumsi dengan menggunakan non-evented cara, tapi kemudian anda mungkin juga hanya menggunakan itu sebagai gantinya.
dokumen.activeElement
mungkin default ke<body>
elemen jika tidak ada focusable unsur-unsur yang berada dalam fokus. Selain itu, jika elemen adalah fokus dan jendela browser yang kabur,activeElement
akan terus fokus elemen.Jika salah satu dari dua perilaku yang tidak diinginkan, mempertimbangkan CSS berbasis pendekatan:
dokumen.querySelector( ':fokus' )
.Saya menyukai pendekatan yang digunakan oleh Joel S, tapi aku juga menyukai kesederhanaan
dokumen.activeElement
. Saya menggunakan jQuery dan gabungan keduanya. Browser lama yang don't dukungandokumen.activeElement
akan menggunakanjQuery.data()
untuk menyimpan nilai 'hasFocus'. Browser yang lebih baru akan menggunakandokumen.activeElement
. Saya berasumsi bahwadokumen.activeElement
akan memiliki kinerja yang lebih baik.Pembantu kecil yang saya've digunakan untuk tujuan ini di Mootools:
Dengan cara ini anda dapat memeriksa apakah elemen memiliki fokus dengan
el.hasFocus()
asalkanstartFocusTracking()
telah disebut pada elemen tertentu.JQuery tidak mendukung
:fokus
pseudo-kelas seperti saat ini. Jika anda mencari untuk itu dalam JQuery dokumentasi, cek di bawah "Penyeleksi" di mana poin anda ke W3C CSS docs. I've diuji dengan Chrome, FF, dan IE 7+. Perhatikan bahwa untuk itu untuk bekerja di IE,<!DOCTYPE...
harus ada pada halaman html. Berikut adalah contoh asumsi anda've diberikan sebuah id untuk unsur yang memiliki fokus:Jika anda ingin mendapatkan sebuah objek yang merupakan instance dari
Elemen
, anda harus menggunakandokumen.activeElement
, tetapi jika anda ingin mendapatkan sebuah objek yang merupakan instance dariTeks
, anda harus menggunakandokumen.getSelection().focusNode
.Saya berharap yang membantu.
Ada potensi masalah dengan menggunakan dokumen.activeElement. Pertimbangkan:
Jika pengguna berfokus pada batin-div, maka dokumen.activeElement masih referensi luar div. Anda tidak dapat menggunakan dokumen.activeElement untuk menentukan mana dari batin div's memiliki fokus.
Berikut fungsi mendapatkan sekitar ini, dan kembali fokus node:
Jika anda lebih suka mendapatkan fokus elemen, gunakan:
Jika anda're menggunakan jQuery, anda dapat menggunakan ini untuk mengetahui apakah suatu elemen aktif:
Membaca jawaban yang lain, dan mencoba sendiri, tampaknya
dokumen.activeElement
akan memberikan elemen yang anda butuhkan di sebagian besar browser.Jika anda memiliki browser yang doesn't mendukung dokumen.activeElement jika anda memiliki jQuery di sekitar, anda harus dapat mengisi semua fokus peristiwa dengan sesuatu yang sangat sederhana seperti ini (belum teruji sebagai I don't memiliki browser memenuhi kriteria tersebut ke tangan):
Dengan dojo, anda dapat menggunakan dijit.getFocus()
Saya telah menemukan berikut cuplikan yang akan berguna ketika mencoba untuk menentukan elemen yang saat ini memiliki fokus. Salin kode berikut ke dalam konsol browser anda, dan setiap detik itu akan mencetak rincian dari elemen saat ini yang memiliki fokus.
Merasa bebas untuk memodifikasi
konsol.log
untuk log out sesuatu yang berbeda untuk membantu anda menentukan elemen jika mencetak seluruh elemen tidak membantu anda menentukan unsur.Hanya menempatkan ini di sini untuk memberikan solusi akhirnya saya datang dengan.
Saya membuat sebuah properti yang disebut dokumen.activeInputArea, dan menggunakan jQuery's HotKeys addon untuk menjebak peristiwa keyboard untuk tombol panah, tab dan enter, dan saya membuat event handler untuk mengklik ke elemen masukan.
Kemudian saya sesuaikan activeInputArea setiap waktu fokus berubah, jadi saya bisa menggunakan properti tersebut untuk mencari tahu di mana aku berada.
It's mudah untuk mengacaukan ini meskipun, karena jika anda memiliki bug dalam sistem dan fokus isn't di mana anda pikir itu, maka sangat sulit untuk mengembalikan fokus yang benar.