Saya mencoba untuk memindahkan fokus ke elemen berikutnya dalam urutan tab berdasarkan elemen saat ini yang memiliki fokus. Sejauh ini saya belum menemukan apa pun dalam pencarian saya.
function OnFocusOut()
{
var currentElement = $get(currentElementId); // ID set by OnFocusIn
currentElementId = "";
currentElement.nextElementByTabIndex.focus();
}
Tentu saja nextElementByTabIndex adalah bagian penting agar ini berfungsi. Bagaimana cara menemukan elemen berikutnya dalam urutan tab? Solusinya harus berdasarkan menggunakan JScript dan bukan sesuatu seperti JQuery.
javascript
jscript.net
JadziaMD
sumber
sumber
currentElementId = "";
?input
,button
dan memberitextarea
tag dan mengabaikantabindex
atribut"..newElementByTabIndex
kode Anda karena itulah yang tidak berfungsi.focus()
metode tersebut ada.Jawaban:
Tanpa jquery: Pertama-tama, pada elemen tab -able Anda, tambahkan
class="tabable"
ini akan memungkinkan kami memilihnya nanti. (Jangan lupa awalan pemilih kelas "." Pada kode di bawah)sumber
var tabbables = document.getElementsByName("tabable");
denganvar tabbables = document.getElementsByTagName("input");
sebaliknyavar tabbables = document.querySelectorAll("input, textarea, button")
// IE8 +, dapatkan referensi ke semua tabbable tanpa memodifikasi HTML Anda.Saya tidak pernah menerapkan ini, tetapi saya telah melihat masalah yang serupa, dan inilah yang akan saya coba.
Coba ini dulu
Pertama, saya akan melihat apakah Anda bisa dengan mudah mengaktifkan
keypress
peristiwa untuk tombol Tab pada elemen yang saat ini memiliki fokus. Mungkin ada cara berbeda untuk melakukan ini untuk browser yang berbeda.Jika itu tidak berhasil, Anda harus bekerja lebih keras…
Mereferensikan implementasi jQuery, Anda harus:
1. Dengarkan Tab dan Shift + Tab
Mendengarkan Tab dan Shift + Tab mungkin tercakup dengan baik di tempat lain di web, jadi saya akan melewatkan bagian itu.
2. Ketahui elemen mana yang dapat ditab
Mengetahui elemen mana yang dapat ditab lebih rumit. Pada dasarnya, elemen dapat ditab jika dapat difokuskan dan tidak memiliki
tabindex="-1"
set atribut . Jadi kita harus bertanya elemen mana yang bisa difokuskan. Elemen berikut dapat difokuskan:input
,select
,textarea
,button
, Danobject
unsur-unsur yang tidak cacat.a
danarea
elemen yang memilikihref
atau memiliki nilai numerik untuktabindex
set.tabindex
set.Selain itu, sebuah elemen hanya dapat difokuskan jika:
display: none
.visibility
adalahvisible
. Ini berarti bahwa leluhur terdekat yang harusvisibility
ditetapkan harus memiliki nilaivisible
. Jika tidak ada leluhur yangvisibility
menetapkan, maka nilai yang dihitung adalahvisible
.Detail selengkapnya ada di jawaban Stack Overflow lainnya .
3. Pahami cara kerja tab order
Urutan tab elemen dalam dokumen dikontrol oleh
tabindex
atribut. Jika tidak ada nilai yang ditetapkan, makatabindex
efektif0
.The
tabindex
Agar dokumen tersebut adalah: 1, 2, 3, ..., 0.Awalnya, ketika
body
elemen (atau tidak ada elemen) memiliki fokus, elemen pertama dalam urutan tab adalah bukan nol terendahtabindex
. Jika beberapa elemen memiliki yang samatabindex
, Anda kemudian pergi dalam urutan dokumen sampai Anda mencapai elemen terakhir dengan itutabindex
. Kemudian Anda pindah ke level terendah berikutnyatabindex
dan proses berlanjut. Terakhir, selesaikan elemen tersebut dengan nol (atau kosong)tabindex
.sumber
Inilah sesuatu yang saya buat untuk tujuan ini:
Fitur:
sumber
nextElementSibling
mungkin tidak focusable, yang focusable berikutnya mungkin tidak saudara kandung.hidden
dan juga mencakuptextarea
danselect
.Saya membuat plugin jQuery sederhana yang melakukan hal ini. Ini menggunakan pemilih ': tabbable' dari jQuery UI untuk menemukan elemen 'tabbable' berikutnya dan memilihnya.
Contoh penggunaan:
sumber
Inti dari jawabannya terletak pada menemukan elemen selanjutnya:
Pemakaian:
Perhatikan bahwa saya tidak peduli dengan prioritas
tabIndex
.sumber
Seperti yang disebutkan dalam komentar di atas, menurut saya tidak ada browser yang mengekspos informasi pesanan tab. Berikut adalah perkiraan yang disederhanakan tentang apa yang dilakukan browser untuk mendapatkan elemen berikutnya dalam urutan tab:
Ini hanya mempertimbangkan beberapa tag dan mengabaikan
tabindex
atribut tetapi mungkin cukup tergantung pada apa yang Anda coba capai.sumber
Tampaknya Anda dapat memeriksa
tabIndex
properti elemen untuk menentukan apakah dapat difokuskan. Elemen yang tidak dapat difokuskan memilikitabindex
"-1".Maka Anda hanya perlu mengetahui aturan untuk tab stop:
tabIndex="1"
memiliki prioritas tertinggi.tabIndex="2"
memiliki prioritas tertinggi berikutnya.tabIndex="3"
berikutnya, dan seterusnya.tabIndex="0"
(atau tabbable secara default) memiliki prioritas terendah.tabIndex="-1"
(atau tidak tabbable secara default) tidak bertindak sebagai tab stop.Berikut adalah contoh bagaimana membuat daftar tab stop, secara berurutan, menggunakan Javascript murni:
Kami pertama kali menjalankan DOM, mengumpulkan semua tab stop secara berurutan dengan indeksnya. Kami kemudian menyusun daftar terakhir. Perhatikan bahwa kita menambahkan item dengan
tabIndex="0"
di akhir daftar, setelah item dengan atabIndex
1, 2, 3, dll.Untuk contoh yang berfungsi penuh, di mana Anda dapat melihat-lihat menggunakan tombol "enter", lihat biola ini .
sumber
Tabbable adalah paket JS kecil yang memberikan daftar semua elemen tabbable agar tab . Jadi Anda bisa menemukan elemen Anda di dalam daftar itu, lalu fokus pada entri daftar berikutnya.
Paket dengan benar menangani kasus edge rumit yang disebutkan dalam jawaban lain (misalnya, tidak ada leluhur yang dapat
display: none
). Dan itu tidak tergantung pada jQuery!Pada tulisan ini (versi 1.1.1), ada peringatan bahwa ia tidak mendukung IE8, dan bug browser mencegahnya menangani
contenteditable
dengan benar.sumber
sumber
Ini adalah posting pertama saya di SO, jadi saya tidak memiliki reputasi yang cukup untuk mengomentari jawaban yang diterima, tetapi saya harus mengubah kodenya menjadi yang berikut:
Perubahan var menjadi konstan tidak kritis. Perubahan utama adalah kita menyingkirkan selektor yang memeriksa tabindex! = "-1". Kemudian, jika elemen memiliki atribut tabindex DAN disetel ke "-1", kami TIDAK menganggapnya dapat difokuskan.
Alasan saya perlu mengubahnya adalah karena saat menambahkan tabindex = "- 1" ke sebuah
<input>
, elemen ini masih dianggap dapat difokuskan karena cocok dengan pemilih "input [type = text]: not ([disabled])". Perubahan saya setara dengan "jika kita adalah input teks yang tidak dinonaktifkan, dan kita memiliki atribut tabIndex, dan nilai atribut itu -1, maka kita tidak boleh dianggap dapat difokuskan.Saya percaya bahwa ketika penulis jawaban yang diterima mengedit jawaban mereka untuk memperhitungkan atribut tabIndex, mereka tidak melakukannya dengan benar. Tolong beri tahu saya jika bukan ini masalahnya
sumber
Ada properti tabindex yang dapat disetel pada komponen. Ini menentukan urutan komponen input harus diulang ketika memilih satu dan menekan tab. Nilai di atas 0 dicadangkan untuk navigasi khusus, 0 adalah "dalam urutan alami" (jadi akan berperilaku berbeda jika disetel untuk elemen pertama), -1 berarti tidak dapat difokuskan pada keyboard:
Ini juga dapat diatur untuk hal lain selain bidang input teks tetapi tidak terlalu jelas apa yang akan dilakukannya di sana, jika ada. Bahkan jika navigasi berfungsi, mungkin lebih baik menggunakan "urutan alami" untuk hal lain selain elemen masukan pengguna yang sangat jelas.
Tidak, Anda tidak memerlukan JQuery atau skrip apa pun untuk mendukung jalur navigasi kustom ini. Anda dapat menerapkannya di sisi server tanpa dukungan JavaScript. Dari sisi lain, properti ini juga berfungsi dengan baik dalam kerangka kerja React tetapi tidak membutuhkannya.
sumber
Berikut adalah versi yang lebih lengkap dari pemfokusan pada elemen berikutnya. Ini mengikuti pedoman spesifikasi dan mengurutkan daftar elemen dengan benar menggunakan tabindex. Juga variabel terbalik didefinisikan jika Anda ingin mendapatkan elemen sebelumnya.
sumber
Ini adalah perangkat tambahan potensi untuk solusi besar yang @Kano dan @Mx ditawarkan. Jika Anda ingin mempertahankan pengurutan TabIndex, tambahkan urutan ini di tengah:
sumber
Anda bisa menyebutnya:
Tab:
Shift + Tab:
Saya memodifikasi PlugIn jquery.tabbable hingga selesai.
sumber
Necromancing.
Saya memiliki 0-tabIndexes, yang ingin saya navigasikan dengan keyboard.
Karena dalam kasus itu, hanya ORDER elemen yang penting, saya melakukannya dengan menggunakan
document.createTreeWalker
Jadi pertama-tama Anda membuat filter (Anda hanya menginginkan elemen [terlihat], yang memiliki atribut "tabIndex" dengan nilai NUMERIK.
Kemudian Anda mengatur simpul akar, yang di luar itu Anda tidak ingin mencari. Dalam kasus saya,
this.m_tree
adalah ul-elemen yang mengandung pohon toggable. Jika Anda menginginkan seluruh dokumen, cukup gantithis.m_tree
dengandocument.documentElement
.Kemudian Anda mengatur node saat ini ke elemen aktif saat ini:
Kemudian Anda kembali
ni.nextNode()
atauni.previousNode()
.Catatan:
ini TIDAK akan mengembalikan tab dalam urutan yang benar jika Anda memiliki tabIndices! = 0 dan urutan elemen BUKAN urutan tabIndex. Dalam kasus tabIndex = 0, tabOrder selalu merupakan urutan elemen, itulah mengapa ini berfungsi (dalam kasus itu).
Perhatikan bahwa while-loop
hanya ada jika Anda ingin jika Anda memiliki kriteria tambahan yang tidak dapat Anda filter di filter yang diteruskan ke createTreeWalker.
Perhatikan bahwa ini adalah TypeScript, Anda perlu menghapus semua token di belakang titik dua (:), dan di antara tanda kurung sudut (<>), misalnya,
<Element>
atau:(node: Node) => number
untuk mendapatkan JavaScript yang valid.Di sini sebagai layanan, JS yang ditranslasikan:
sumber
Apakah Anda menentukan nilai tabIndex Anda sendiri untuk setiap elemen yang ingin Anda telusuri? jika demikian, Anda dapat mencoba ini:
Anda menggunakan jquery, bukan?
sumber
Saya memeriksa solusi di atas dan menemukan mereka cukup panjang. Itu dapat dicapai hanya dengan satu baris kode:
atau
di sini currentElement dapat berupa document.activeElement apa pun atau ini jika elemen saat ini ada dalam konteks fungsi.
Saya melacak acara tab dan shift-tab dengan acara keydown
setelah Anda memiliki arah kursor maka Anda dapat menggunakan
nextElementSibling.focus
ataupreviousElementSibling.focus
metodesumber