javascript - Zaměřit další prvek v pořadí tabulátoru
Snažím se přesunout fokus na další prvek v pořadí tabulátoru na základě aktuálního prvku, který má fokus. Zatím jsem při svých hledáních nic nenašel.
function OnFocusOut()
{
var currentElement = $get(currentElementId); // ID set by OnFocusIn
currentElementId = "";
currentElement.nextElementByTabIndex.focus();
}
Samozřejmě, klíčovou částí je nextElementByTabIndex, aby to fungovalo. Jak najdu další prvek v sekvenci tabulátorů? Řešení by muselo být založené na JScript, ne na něčem jako JQuery.
Odpověď #1
Nikdy jsem to neimplementoval, ale podíval jsem se na podobný problém a tady je, co bych zkusil.
Odkazujíc se na implementaci jQuery, musíte:
- Poslouchejte Tab a Shift+Tab
- Vědět, které prvky lze převádět tabulátorem
- Pochopit, jak funguje pořadí záložek
1. Poslouchejte klávesu Tab a Shift+Tab
Poslouchání pro Tab a Shift+Tab je pravděpodobně jinde na webu dobře pokryto, takže tu část vynechám.
2. Vědět, které prvky lze přepínat pomocí tabulátoru
Zjistit, které prvky jsou možné tabulovat, je složitější. V podstatě je prvek tabulovatelný, pokud je zaměřitelný a nemá nastavený atribut tabindex="-1". Musíme se tedy ptát, které prvky jsou zaměřitelné. Následující prvky jsou zaměřitelné:
input,select,textarea,buttonaobjectelementy, které nejsou deaktivované.- Elementy
aaarea, které mají atributhrefnebo mají nastavenou číselnou hodnotu atribututabindex. - jakýkoli prvek, který má nastavenou číselnou hodnotu pro
tabindex.
Dále je prvek zaměřitelný pouze tehdy, pokud:
- Žádný z jeho předků nemá
display: none. - Vypočítaná hodnota
visibilityjevisible. To znamená, že nejbližší předek, který má nastavenovisibility, musí mít hodnotuvisible. Pokud žádný předek nemá nastavenovisibility, pak je vypočítaná hodnotavisible.
Další podrobnosti jsou v jiné odpovědi na Stack Overflow.
3. Pochopte, jak funguje pořadí karet
Pořadí tabulátoru prvků v dokumentu je řízeno atributem tabindex. Pokud není nastavena žádná hodnota, má tabindex efektivně hodnotu 0.
Pořadí tabulátorů dokumentu je: 1, 2, 3, ..., 0.
Zpočátku, když má body prvek (nebo žádný prvek) fokus, je prvním prvkem v pořadí tabulace prvek s nejnižším nenulovým tabindex. Pokud má několik prvků stejný tabindex, pokračujete v pořadí dokumentu, dokud nedosáhnete posledního prvku s tímto tabindex. Poté přejdete na další nejnižší tabindex a proces pokračuje. Nakonec dokončete s těmi prvky, které mají nulový (nebo prázdný) tabindex.
Odpověď č. 2
Tady je něco, co jsem pro tento účel postavil:
function focusNextElement() {
//add all elements we want to include in our selection
var focussableElements =
'a:not([disabled]), button:not([disabled]), input[type=text]:not([disabled]), [tabindex]:not([disabled]):not([tabindex="-1"])';
if (document.activeElement && document.activeElement.form) {
var focussable = Array.prototype.filter.call(
document.activeElement.form.querySelectorAll(focussableElements),
function (element) {
//check for visibility while always include the current activeElement
return (
element.offsetWidth > 0 ||
element.offsetHeight > 0 ||
element === document.activeElement
);
}
);
var index = focussable.indexOf(document.activeElement);
if (index > -1) {
var nextElement = focussable[index + 1] || focussable[0];
nextElement.focus();
}
}
}
Funkce:
- konfigurovatelná sada zaměřitelných prvků
- není potřeba jQuery
- funguje ve všech moderních prohlížečích
- rychlý a lehký
Odpověď č. 3
Bez jQuery: Především přidejte na své prvky, mezi které se dá přepínat, class="tabable", to nám později umožní je vybrat. (Nezapomeňte na prefix selektoru třídy "." v následujícím kódu)
var lastTabIndex = 10;
function OnFocusOut()
{
var currentElement = $get(currentElementId); // ID set by OnFOcusIn
var curIndex = currentElement.tabIndex; //get current elements tab index
if(curIndex == lastTabIndex) { //if we are on the last tabindex, go back to the beginning
curIndex = 0;
}
var tabbables = document.querySelectorAll(".tabable"); //get all tabable elements
for(var i=0; i<tabbables.length; i++) { //loop through each element
if(tabbables[i].tabIndex == (curIndex+1)) { //check the tabindex to see if it's the element we want
tabbables[i].focus(); //if it's the one we want, focus it and exit the loop
break;
}
}
}
Odpověď č. 4
Vytvořil jsem jednoduchý jQuery plugin, který právě toto dělá. Používá selektor ':tabbable' z jQuery UI k nalezení dalšího 'tabbable' prvku a jeho výběru.
Příklad použití:
// Simulate tab key when element is clicked
$('.myElement').bind('click', function(event){
$.tabNext();
return false;
});
Odpověď č. 5
Jádro odpovědi spočívá v nalezení dalšího prvku:
function findNextTabStop(el) {
var universe = document.querySelectorAll('input, button, select, textarea, a[href]');
var list = Array.prototype.filter.call(universe, function(item) {return item.tabIndex >= "0"});
var index = list.indexOf(el);
return list[index + 1] || list[0];
}
Použití :
var nextEl = findNextTabStop(element);
nextEl.focus();
Všimněte si, že mi nezáleží na upřednostňování tabIndex.
