2012-03-30 26 views
7

Sto tentando di verificare se un div contenteditabile ha il focus, ma ho qualche problema. Ecco il mio codice finora:Vedere se ContentEditable div ha lo stato attivo

if ($("#journal-content:focus")) { 
    alert("Has Focus"); 
} else { 
    alert("Doesn't Have Focus"); 
} 

Il problema è, è sempre tornando "ha il focus", anche quando non è così. Qual è il modo migliore per farlo?

Update: Il motivo per fare questo è quello di vedere se il cursore si trova nella posizione desiderata prima di inserire il nuovo elemento. Altrimenti, se l'ultimo posto che l'utente ha fatto clic era nell'intestazione, quando ripristino la selezione con Rangy e lo sostituisco con un nuovo elemento, finisce nell'intestazione. Ho bisogno di un modo per scoprire se il div contenteditable è focalizzato/ha il cursore in esso, quindi se no, aggiungerò semplicemente l'elemento che sto inserendo alla fine.

Aggiornamento 2: Ecco una JSFiddle che illustra il mio problema: http://jsfiddle.net/2NHrM/

+0

Guarda il mio aggiornamento sotto Oppure: – iambriansreed

+0

Hai mai trovato una soluzione? – iambriansreed

+0

Ho aggiornato il Fiddle usando la risposta di @ iambriansreed qui sotto in modo che funzioni. – Irwin

risposta

9

Prova:

if ($("#journal-content").is(":focus")) { 
    alert("Has Focus"); 
} else { 
    alert("Doesn't Have Focus"); 
} 

Oppure:

window.contenteditable_focused = false; 

$("#journal-content").focus(function() { 
    //alert("Has Focus"); 
    contenteditable_focused = true; 
}); 
$("#journal-content").blur(function() { 
    //alert("Doesn't Have Focus");   
    contenteditable_focused = false; 
}); 

Controllare contenteditable_focused prima di eseguire lo script.

Oppure:

if ($(document.activeElement).is("#journal-content")) { 
    alert("Has Focus"); 
} else { 
    alert("Doesn't Have Focus"); 
} 
+2

Hmm che fa l'opposto, restituisce sempre "non ha il focus" ... – Adam

+0

Quindi non ha il focus. – iambriansreed

+0

... ma lo fa. Subito dopo sto usando Rangy per salvare la selezione, che funziona bene. – Adam

0

Si può provare questo

if ($("#journal-content").is(":focus")) { 
... 

Forse se ci dirai che cosa stai cercando di raggiungere saremo di più aiuto. Nel frattempo, puoi leggere qui: http://api.jquery.com/focus-selector/.

+0

Alrighty, aggiornato il mio post originale con una spiegazione di ciò che sto tentando di fare. (Ho provato il tuo e non sembra funzionare). – Adam

+0

Se segui il link che ho postato vedrai questo: _Se stai cercando l'elemento attualmente focalizzato, $ (document.activeElement) lo recupererà senza dover cercare l'intero albero DOM._ –

2

Che dire di questo ?:

if (document.activeElement.isContentEditable) { 
... 
} 

non so quanto bene del browser il supporto per questo è, ma almeno Chrome e Firefox supportano.

+1

Non lo farebbe funziona affatto con più contenuti. Elementi editabili. – diegoreymendez

3

Per puro JavaScript quando si dispone di più elementi: contentEditable

Il CSS e Markup è puramente per il frammento di

Provare a eseguire il frammento e premendo uno dei due elementi.

function isFocused() { 
 
    if (document.activeElement.id == "journal-content") { 
 
    alert("Focused!"); 
 
    } else { 
 
    alert("Not focused :("); 
 
    } 
 
}
#journal-content { 
 
    background-color: #eee; 
 
} 
 
#not-journal-content { 
 
    background-color: #ccc; 
 
}
<div id="journal-content" contenteditable="true" onclick="isFocused()">Journal Content</div> 
 
<div id="not-journal-content" contenteditable="true" onclick="isFocused()">Not Journal Content</div>

Problemi correlati