È possibile concentrarsi su una <div> utilizzando la funzione JavaScript focus ()?


227

È possibile concentrarsi su una funzione <div>JavaScript utilizzando focus()?

Ho un <div>tag

<div id="tries">You have 3 tries left</div>

Sto cercando di concentrarmi su quanto sopra <div>usando:

document.getElementById('tries').focus();

Ma non funziona Qualcuno potrebbe suggerire qualcosa ....?


3
Cosa vuoi che accada quando lo "focalizzi"? I div non accettano input, quindi vuoi far lampeggiare il bordo o evidenziare uno sfondo in evidenza ecc?
Michael Shimmins,

@Michael, sì, ho bisogno di <div> per attirare l'attenzione dell'utente ...
OM The Eternity,


1
@MichaelShimmins e chiunque altro, gli elementi <div> possono accettare input se contenteditable è impostato su true. (Motivo per cui ho chiesto)
MattOlivos

1
@MichaelShimmins divs può accettare input se traboccano e mostrano una barra di scorrimento. Quando un divcon una barra di scorrimento è focalizzato, i tasti freccia faranno scorrere il suo contenuto (anziché il contenuto di altri elementi come body).
Rory O'Kane,

Risposte:


101
window.location.hash = '#tries';

Questo scorrerà fino all'elemento in questione, essenzialmente "focalizzandolo" su di esso.


2
@Casey Chu: Funziona bene in ie, ma non in Firefox, ne hai idea?
Haseeb Akhtar,

Non funziona in alcune versioni di Chrome ... Tuttavia, la soluzione @vinoths lo fa
Charliemops

1
Funziona ma ... con Angular avresti problemi !!
Carlos Verdes,

@CarlosVerdes; C'è una soluzione per Angular?
Mac Vicious,

3
non rispondendo alla domanda "focalizzata", questa non dovrebbe essere la risposta corretta. nel mio caso, voglio concentrarmi su un div "contentEditable", e il tuo trucco non aiuta.
Arnaudambro,

453

Sì, questo è possibile. Per farlo, devi assegnare un tabindex ...

<div tabindex="0">Hello World</div>

Un tabindex di 0 inserirà il tag "nell'ordine di tabulazione naturale della pagina". Un numero più alto gli darà un ordine specifico di priorità, dove 1 sarà il primo, 2 secondi e così via.

Puoi anche dare un tabindex di -1, il che renderà il div focalizzabile solo dallo script, non dall'utente.

document.getElementById('test').onclick = function () {
    document.getElementById('scripted').focus();
};
div:focus {
    background-color: Aqua;
}
<div>Element X (not focusable)</div>
<div tabindex="0">Element Y (user or script focusable)</div>
<div tabindex="-1" id="scripted">Element Z (script-only focusable)</div>
<div id="test">Set Focus To Element Z</div>

Ovviamente, è un peccato avere un elemento che puoi focalizzare con uno script che non puoi focalizzare con altri metodi di input (specialmente se un utente è solo tastiera o vincolato in modo simile). Ci sono anche un sacco di elementi standard che sono focalizzabili di default e hanno informazioni semantiche integrate per aiutare gli utenti. Usa saggiamente questa conoscenza.


6
@Michael Shimmins, Questo permette all'elemento di essere focalizzabile (in un modo non standard!) Con focus().
Strager

2
@Olical - Sono abbastanza sicuro che sia esattamente quello che dice l'ultima riga di maggio. Fammi sapere se pensi che ci sia un problema che necessita di una modifica.
Fenton,

2
Se non fosse chiaro, l'aggiunta tabindexdi un elemento renderà Focusable, che permette alle focus()e blur()metodi, e quindi si può innescare un fuoco in questo modo:document.getElementById('tries').focus();
Pilau

4
Ciao @SteveOwen - sembra funzionare ancora in Firefox v42. Ho aggiunto uno snippet a questa risposta in modo da poterlo eseguire e testare.
Fenton,

9
L'utilizzo di @SteveOwen window.location.hash = ...è il modo per farlo. focus non significa "mettere in vista", significa solo porre letteralmente il focus su quell'elemento.
Fenton,

76

document.getElementById('tries').scrollIntoView()lavori. Funziona meglio di window.location.hash quando hai un posizionamento fisso.


2
Nota che questa soluzione non funzionerà in IE, Opera o Safari.
AlecRust,

1
Ho appena provato questo in Chrome 65 e non funziona. Il div della sovrapposizione scorre in vista, ma il focus è ancora nel div dello sfondo. L'unico modo sicuro che conosco è di avere un elemento tabbable (usando l' tabindexattributo) nel div overlay e usare invece focus()su quell'elemento.
entro il

@ om-the-eternity ha già affermato che vuole che il div richiami l'attenzione dell'utente, quindi ciò di cui ha bisogno non è di focalizzare effettivamente (anche quando lavora non è corretto farlo) il div, ma portandolo sullo schermo , questo risolve questo
Omar Vazquez il

Se lo faccio in Chrome, continua a scorrere indietro nel campo di input ancora focalizzato. Soprattutto se il caricamento della pagina non è ancora terminato.
Roger Krueger,

37

Puoi usare tabindex

<div tabindex="-1"  id="tries"></div>

Il valore tabindex può consentire alcuni comportamenti interessanti.

  • Se viene assegnato un valore "-1", l'elemento non può essere tabulato ma lo stato attivo può essere assegnato all'elemento a livello di codice (usando element.focus ()).
  • Se viene assegnato un valore pari a 0, l'elemento può essere focalizzato tramite la tastiera e rientra nel flusso di tabulazione del documento. I valori maggiori di 0 creano un livello di priorità con 1 è il più importante.

1
Wow, grazie, bel trucco. Grazie! Non lo avrei capito altrimenti.
AVProgrammer

Salvavita, grazie. In Edge un div può essere focalizzato ma non in Chrome senza questo trucco. La risposta accettata è ottima ma non voglio una parte aggiuntiva nell'URL.
Cal

salva la vita. Funziona bene con Chrome e Firefox
Susampath,

14
<div id="inner" tabindex="0">
    this div can now have focus and receive keyboard events
</div>

Questo funziona per me in Chromium / Chrome 46 solo combinato con$('#inner').focus();
TNT

2

Volevo suggerire qualcosa come quello di Michael Shimmin, ma senza codificare cose come l'elemento o il CSS ad esso applicato.

Sto solo usando jQuery per aggiungere / rimuovere la classe, se non vuoi usare jquery, hai solo bisogno di un sostituto per add / removeClass

--Javascript

function highlight(el, durationMs) { 
  el = $(el);
  el.addClass('highlighted');
  setTimeout(function() {
    el.removeClass('highlighted')
  }, durationMs || 1000);
}

highlight(document.getElementById('tries'));

--CSS

#tries {
    border: 1px solid gray;
}

#tries.highlighted {
    border: 3px solid red;
}

1

document.getElementById('test').onclick = function () {
    document.getElementById('scripted').focus();
};
div:focus {
    background-color: Aqua;
}
<div>Element X (not focusable)</div>
<div tabindex="0">Element Y (user or script focusable)</div>
<div tabindex="-1" id="scripted">Element Z (script-only focusable)</div>
<div id="test">Set Focus To Element Z</div>


0

Per far lampeggiare il bordo puoi farlo:

function focusTries() {
    document.getElementById('tries').style.border = 'solid 1px #ff0000;'
    setTimeout ( clearBorder(), 1000 );
}

function clearBorder() {
    document.getElementById('tries').style.border = '';
}

Ciò renderà il bordo rosso fisso per 1 secondo, quindi rimuoverlo di nuovo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.