Saya ingin mencari tahu, dalam JavaScript, elemen mana yang saat ini memiliki fokus. Saya telah mencari melalui DOM dan belum menemukan apa yang saya butuhkan. Apakah ada cara untuk melakukan ini, dan bagaimana?
Alasan saya mencari ini:
Saya mencoba membuat kunci seperti panah dan enter
menavigasi melalui tabel elemen input. Tab berfungsi sekarang, tetapi masuk, dan panah tampaknya tidak secara default. Saya sudah menyiapkan bagian penanganan kunci tetapi sekarang saya harus mencari cara untuk memindahkan fokus pada fungsi penanganan acara.
javascript
dom
Tony Peterson
sumber
sumber
find-focused-element
paket: npmjs.com/package/find-focused-elementJawaban:
Gunakan
document.activeElement
, itu didukung di semua browser utama.Sebelumnya, jika Anda mencoba mencari tahu bidang formulir apa yang memiliki fokus, Anda tidak bisa. Untuk meniru deteksi dalam browser lama, tambahkan pengendali event "fokus" ke semua bidang dan rekam bidang yang terakhir difokuskan dalam suatu variabel. Tambahkan handler "blur" untuk menghapus variabel pada peristiwa blur untuk bidang yang terakhir difokuskan.
Jika Anda perlu menghapus
activeElement
Anda dapat menggunakan blur;document.activeElement.blur()
. Ini akan mengubahactiveElement
kebody
.Tautan yang berhubungan:
sumber
activeElement
sebenarnya tidak mengembalikan elemen fokus. Setiap elemen dapat memiliki fokus. Jika suatu dokumen memiliki 4 'scrolldivs', 0 atau 1 dari divs tersebut dapat digulir dengan tombol panah. Jika Anda mengklik satu, div itu fokus. Jika Anda mengklik di luar semua, tubuh fokus. Bagaimana Anda mengetahui scrolldiv mana yang difokuskan? jsfiddle.net/rudiedirkx/bC5ke/show (periksa konsol)div
adalah Firefox 17, dan hanya dengan menabraknya . Jenis elemen yang dikembalikan SEMUA browser utamadocument.activeElement
dibatasi pada elemen yang terkait dengan input . Jika tidak ada elemen yang memiliki fokus, semua browser utama mengembalikanbody
elemen - kecuali IE 9, yang mengembalikanhtml
elemen.document.activeElement
harus dibungkus dalamtry catch
seperti dalam beberapa keadaan dapat menyebabkan pengecualian (tidak hanya IE9 AFAIK). Lihat bugs.jquery.com/ticket/13393 dan bugs.jqueryui.com/ticket/8443Seperti yang dikatakan oleh JW, Anda tidak dapat menemukan elemen fokus saat ini, setidaknya dengan cara yang bebas browser. Tetapi jika aplikasi Anda hanya untuk IE (ada beberapa ...), Anda dapat menemukannya dengan cara berikut:
EDIT: Sepertinya IE tidak memiliki semuanya salah, ini adalah bagian dari konsep HTML5 dan tampaknya didukung oleh versi terbaru dari Chrome, Safari dan Firefox.
sumber
Jika Anda dapat menggunakan jQuery, sekarang mendukung: fokus, pastikan Anda menggunakan versi 1.6+.
Pernyataan ini akan memberi Anda elemen yang sedang difokuskan.
Dari: Cara memilih elemen yang memiliki fokus dengan jQuery
sumber
return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
document.activeElement
sekarang merupakan bagian dari spesifikasi rancangan HTML5 , tetapi mungkin belum didukung di beberapa peramban non-utama / seluler / yang lebih lama. Anda dapat kembali kequerySelector
(jika itu didukung). Perlu juga disebutkan bahwadocument.activeElement
akan kembalidocument.body
jika tidak ada elemen yang difokuskan - bahkan jika jendela browser tidak memiliki fokus.Kode berikut akan mengatasi masalah ini dan kembali
querySelector
memberikan sedikit dukungan yang lebih baik.Hal tambahan yang perlu diperhatikan adalah perbedaan kinerja antara kedua metode ini. Meminta dokumen dengan pemilih akan selalu jauh lebih lambat daripada mengakses
activeElement
properti. Lihat tes jsperf.com ini .sumber
Dengan sendirinya,
document.activeElement
masih dapat mengembalikan elemen jika dokumen tidak fokus (dan dengan demikian tidak ada dalam dokumen yang difokuskan!)Anda mungkin menginginkan perilaku itu, atau mungkin tidak masalah (misalnya dalam suatu
keydown
acara), tetapi jika Anda perlu tahu ada sesuatu yang benar-benar fokus, Anda juga dapat memeriksanyadocument.hasFocus()
.Berikut ini akan memberi Anda elemen fokus jika ada, atau yang lain
null
.Untuk memeriksa apakah elemen tertentu memiliki fokus, lebih sederhana:
Untuk memeriksa apakah ada yang fokus, lebih kompleks lagi:
Catatan Robustness : Dalam kode di mana ia mengecek
document.body
dandocument.documentElement
, ini karena beberapa browser mengembalikan salah satunya ataunull
ketika tidak ada yang difokuskan.Itu tidak menjelaskan apakah
<body>
(atau mungkin<html>
) memilikitabIndex
atribut dan dengan demikian bisa benar-benar fokus . Jika Anda sedang menulis perpustakaan atau sesuatu dan ingin menjadi kuat, Anda mungkin harus menanganinya.Ini versi (satu airquotes berat ) "satu-liner" untuk mendapatkan elemen fokus, yang secara konsep lebih rumit karena Anda harus tahu tentang hubungan arus pendek, dan Anda tahu, itu jelas tidak cocok pada satu baris, dengan asumsi Anda ingin itu dapat dibaca.
Saya tidak akan merekomendasikan yang ini. Tetapi jika Anda 1337 hax0r, idk ... itu ada di sana.
Anda juga dapat menghapus
|| null
bagian jika Anda tidak keberatanfalse
dalam beberapa kasus. (Kamu masih bisa mendapatkannyanull
jikadocument.activeElement
adalahnull
):Untuk memeriksa apakah elemen tertentu difokuskan, Anda juga bisa menggunakan acara, tetapi cara ini memerlukan pengaturan (dan berpotensi runtuh), dan yang penting, mengasumsikan keadaan awal :
Anda bisa memperbaiki asumsi keadaan awal dengan menggunakan cara yang tidak terjadi, tetapi kemudian Anda bisa saja menggunakannya.
sumber
document.activeElement
mungkin default ke<body>
elemen jika tidak ada elemen yang bisa fokus dalam fokus. Selain itu, jika elemen difokuskan dan jendela browser buram,activeElement
akan terus menahan elemen fokus.Jika salah satu dari dua perilaku ini tidak diinginkan, mempertimbangkan pendekatan berbasis CSS:
document.querySelector( ':focus' )
.sumber
querySelector
: stackoverflow.com/a/40873560/2624876Saya menyukai pendekatan yang digunakan oleh Joel S, tetapi saya juga suka kesederhanaannya
document.activeElement
. Saya menggunakan jQuery dan menggabungkan keduanya. Browser lama yang tidak mendukungdocument.activeElement
akan digunakanjQuery.data()
untuk menyimpan nilai 'hasFocus'. Browser yang lebih baru akan digunakandocument.activeElement
. Saya berasumsi bahwadocument.activeElement
akan memiliki kinerja yang lebih baik.sumber
$("*:focus")
?Seorang pembantu kecil yang saya gunakan untuk keperluan ini di Mootools:
Dengan cara ini Anda dapat memeriksa apakah elemen memiliki fokus
el.hasFocus()
asalkanstartFocusTracking()
telah dipanggil pada elemen yang diberikan.sumber
JQuery mendukung
:focus
pseudo-class saat ini. Jika Anda mencarinya di dokumentasi JQuery, centang di bawah "Selectors" di mana ia mengarahkan Anda ke dokumen CSS W3C . Saya sudah menguji dengan Chrome, FF, dan IE 7+. Perhatikan bahwa agar berfungsi di IE,<!DOCTYPE...
harus ada di halaman html. Berikut adalah contoh dengan asumsi Anda telah menetapkan id ke elemen yang memiliki fokus:sumber
this.id
alih-alih$(this).attr('id')
, atau setidaknya (ketika Anda sudah memiliki objek jQuery Anda)$(this)[0].id
. Javascript asli pada level ini adalah WAY lebih cepat dan lebih efisien. Mungkin tidak terlihat dalam kasus ini, tetapi di seluruh sistem Anda akan melihat perbedaan.Jika Anda ingin mendapatkan objek yang instance
Element
, Anda harus menggunakandocument.activeElement
, tetapi jika Anda ingin mendapatkan objek yang instanceText
, Anda harus menggunakandocument.getSelection().focusNode
.Semoga membantu.
sumber
document.getSelection().focusNode.parentElement
dan ketuk Enter. Setelah itu, lewatidocument.activeElement
dan lakukan itu samething. ;)document.activeElement
berikan<textarea>
sedangkandocument.getSelection().focusNode
beri<td>
yang berisi<textarea>
(dandocument.getSelection().focusNode.parentElement
beri yang<tr>
berisi<td>
)Element
, Anda harus menggunakandocument.activeElement
, tetapi jika Anda ingin mendapatkan objek yang instanceText
, Anda harus menggunakandocument.getSelection().focusNode
. Tolong, coba lagi. Saya harap saya membantu.focusNode
tidak dijamin menjadi simpul teks juga.Ada potensi masalah dengan menggunakan document.activeElement. Mempertimbangkan:
Jika pengguna berfokus pada div-dalam, maka document.activeElement masih merujuk div luar. Anda tidak dapat menggunakan document.activeElement untuk menentukan fokus div dalam mana.
Fungsi berikut menyiasatinya, dan mengembalikan simpul fokus:
Jika Anda lebih suka mendapatkan elemen fokus, gunakan:
sumber
document.activeElement
:<div>
elemen dalam sebenarnya tidak dapat menerima fokus, seperti yang Anda lihat secara visual dengan mengatur:focus
pseudo-class ke sesuatu yang terlihat (contoh: jsfiddle.net/4gasa1t2/1 ). Yang Anda bicarakan adalah bagian dalam mana<div>
yang berisi seleksi atau tanda sisipan, yang merupakan masalah terpisah.Saya telah menemukan potongan berikut berguna ketika mencoba menentukan elemen mana yang saat ini memiliki fokus. Salin yang berikut ke konsol browser Anda, dan setiap detik akan mencetak detail elemen saat ini yang memiliki fokus.
Jangan ragu untuk memodifikasi
console.log
untuk keluar sesuatu yang berbeda untuk membantu Anda menentukan dengan tepat elemen jika mencetak seluruh elemen tidak membantu Anda menentukan dengan tepat elemen.sumber
Membaca jawaban lain, dan mencoba sendiri, tampaknya
document.activeElement
akan memberi Anda elemen yang Anda butuhkan di sebagian besar browser.Jika Anda memiliki browser yang tidak mendukung document.activeElement jika Anda memiliki jQuery, Anda harus dapat mengisinya pada semua acara fokus dengan sesuatu yang sangat sederhana seperti ini (belum teruji karena saya tidak memiliki browser yang memenuhi kriteria tersebut untuk diberikan. ):
sumber
Jika Anda menggunakan jQuery, Anda dapat menggunakan ini untuk mengetahui apakah suatu elemen aktif:
sumber
Dengan dojo, Anda dapat menggunakan dijit.getFocus ()
sumber
Hanya dengan menempatkan ini di sini untuk memberikan solusi, saya akhirnya menemukan.
Saya membuat properti bernama document.activeInputArea, dan menggunakan addon HotKeys jQuery untuk menjebak acara keyboard untuk tombol panah, tab dan enter, dan saya membuat pengendali event untuk mengklik ke elemen input.
Lalu saya menyesuaikan activeInputArea setiap kali fokus berubah, jadi saya bisa menggunakan properti itu untuk mencari tahu di mana saya berada.
Sangat mudah untuk mengacaukan ini, karena jika Anda memiliki bug dalam sistem dan fokus tidak sesuai dengan yang Anda pikirkan, maka sangat sulit untuk mengembalikan fokus yang benar.
sumber