Dal other SO answer referred to by the OP:
i browser di oggi definiamo messa a fuoco() su HTMLElement, ...
Quindi, questo significa che il test per focus
come membro del l'elemento è non efficace , perché tutti gli elementi lo avranno, indipendentemente dal fatto che accetti effettivamente lo stato attivo o meno.
... ma un elemento non sarà effettivamente prendere fuoco se non è uno dei seguenti:
- HTMLAnchorElement/HTMLAreaElement con una href * HTMLInputElement/HTMLSelectElement/HTMLTextAreaElement/HTMLButtonElement ma non con
disabled
(IE ti dà effettivamente un errore se lo provi), e gli upload di file hanno un comportamento insolito per motivi di sicurezza
- HTMLIFrameElement (sebbene la messa a fuoco non faccia nulla di utile). Anche altri elementi di inclusione, forse, non li ho testati tutti.
- Qualsiasi elemento con un
tabindex
Quindi, che dire di nominare tutti coloro che in modo esplicito in un jQuery Selector?
$('a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, *[tabindex], *[contenteditable]')
Update # 1:
I updated your jsFiddle here. Sembra funzionare.
Ho anche aggiunto elementi con l'attributo contenteditable
all'elenco precedente.
Update # 2:
Come @ jfriend00 ha sottolineato, "a seconda dell'uso, uno potrebbe voler filtrare gli elementi che non sono visibili". Per fare ciò, è sufficiente applicare .filter(':visible') all'insieme generato dal selettore precedente.
Update # 3:
Come Xavin pointed out: jQuery UI ora ha un selettore, :focusable, che svolge questa funzione. Se stai già utilizzando l'interfaccia utente di jQuery, questa potrebbe essere la soluzione. In caso contrario, è possibile che si desideri check out how jQuery UI does it. In ogni caso, la descrizione nella pagina di jQuery UI per :focusable
è utile:
Elementi del seguente tipo sono attivabile se non sono disabilitati: ingresso, selezionare, textarea, pulsante, e l'oggetto. Le ancore sono focalizzabili se hanno un attributo href o tabindex. gli elementi dell'area sono selezionabili se si trovano all'interno di una mappa denominata, hanno un attributo href e c'è un'immagine visibile utilizzando la mappa. Tutti gli altri elementi sono focalizzabili esclusivamente in base all'attributo e alla visibilità del tabindex.
Così, il selettore ho proposto sopra è vicino, ma non riesce a tenere conto di alcune sfumature.
Ecco la funzione strappata dall'interfaccia utente di jQuery, con piccoli adattamenti per renderla autonoma. (Gli adattamenti sono testati, ma dovrebbe funzionare):
function focusable(element) {
var map, mapName, img,
nodeName = element.nodeName.toLowerCase(),
isTabIndexNotNaN = !isNaN($.attr(element, "tabindex"));
if ("area" === nodeName) {
map = element.parentNode;
mapName = map.name;
if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") {
return false;
}
img = $("img[usemap=#" + mapName + "]")[0];
return !!img && visible(img);
}
return (/input|select|textarea|button|object/.test(nodeName) ?
!element.disabled :
"a" === nodeName ?
element.href || isTabIndexNotNaN :
isTabIndexNotNaN) &&
// the element and all of its ancestors must be visible
visible(element);
function visible(element) {
return $.expr.filters.visible(element) &&
!$(element).parents().addBack().filter(function() {
return $.css(this, "visibility") === "hidden";
}).length;
}
}
Nota: la funzione di cui sopra dipende ancora jQuery, ma non dovrebbe richiedere jQuery UI.
Probabilmente no. Forse prova il selettore [': input'] (http://api.jquery.com/input-selector/)? – Bojangles
Che cosa stai cercando di fare una volta che hai la lista degli elementi focalizzabili? – Dennis
@Dennis - scorri verso il basso per assicurarti che siano visibili quando sono a fuoco. http://stackoverflow.com/questions/7650892/how-to-scroll-down-the-page-when-a-covered-input-box-is-focused – ripper234