Estou atrás de uma solução definitiva entre navegadores para definir a posição do cursor / cursor para a última posição conhecida quando um contentEditable = 'on' <div> recupera o foco. Parece que a funcionalidade padrão de uma div editável de conteúdo é mover o cursor / cursor para o início do texto na div toda vez que você clicar nele, o que é indesejável.
Eu acredito que teria que armazenar em uma variável a posição atual do cursor quando eles estiverem deixando o foco da div e reconfigurá-la quando eles tiverem o foco interno novamente, mas não consegui montar ou encontrar um trabalho amostra de código ainda.
Se alguém tiver alguma ideia, trechos de código de trabalho ou amostras, ficaria feliz em vê-los.
Eu realmente não tenho nenhum código ainda, mas aqui está o que eu tenho:
<script type="text/javascript">
// jQuery
$(document).ready(function() {
$('#area').focus(function() { .. } // focus I would imagine I need.
}
</script>
<div id="area" contentEditable="true"></div>
PS. Eu tentei esse recurso, mas parece que ele não funciona para um <div>. Talvez apenas para a área de texto ( Como mover o cursor para o final da entidade editável por conteúdo )
contentEditable
trabalhava em navegadores não-IE o_oRespostas:
Isso é compatível com os navegadores baseados em padrões, mas provavelmente falhará no IE. Estou fornecendo isso como ponto de partida. O IE não suporta a faixa DOM.
fonte
cursorStart.appendChild(document.createTextNode('\u0002'));
é um substituto razoável que pensamos. para o - char. Obrigado pelo códigoEsta solução funciona em todos os principais navegadores:
saveSelection()
é anexado aoonmouseup
eonkeyup
eventos da div e salva a seleção para a variávelsavedRange
.restoreSelection()
é anexado aoonfocus
evento da div e seleciona novamente a seleção salva emsavedRange
.Isso funciona perfeitamente, a menos que você queira que a seleção seja restaurada quando o usuário clicar na div também (o que é um pouco pouco intuitivo, pois normalmente você espera que o cursor vá para onde você clica, mas o código está incluso)
Para conseguir isso, os eventos
onclick
eonmousedown
são cancelados pela funçãocancelEvent()
que é uma função de navegador cruzado para cancelar o evento. AcancelEvent()
função também executa arestoreSelection()
função porque, como o evento click é cancelado, a div não recebe foco e, portanto, nada é selecionado, a menos que essas funções sejam executadas.A variável
isInFocus
armazena se está em foco e é alterada para "false"onblur
e "true"onfocus
. Isso permite que os eventos de clique sejam cancelados apenas se a div não estiver em foco (caso contrário, você não poderá alterar a seleção).Se você deseja a seleção para ser a mudança quando o div é focado através de um clique, e não restaurar a seleção
onclick
(e somente quando o foco é dado ao elemento programtically usandodocument.getElementById("area").focus();
ou similar, então simplesmente remover osonclick
eonmousedown
eventos. Oonblur
evento eoonDivBlur()
ecancelEvent()
funções também pode ser removido com segurança nessas circunstâncias.Esse código deve funcionar se cair diretamente no corpo de uma página html, se você quiser testá-lo rapidamente:
fonte
if (window.getSelection)...
testará apenas se o navegador suportagetSelection
, não se há ou não uma seleção?getSelection
API padrão ou adocument.selection
API herdada usada pelas versões mais antigas do IE. AgetRangeAt (0)
chamada posterior retornaránull
se não houver nenhuma seleção, que é verificada na função de restauração.else if (document.createRange)
) é o que estou vendo. Só será chamado sewindow.getSelection
não existir, mas usa #window.getSelection
window.getSelection
, mas nãodocument.createRange
- o que significa o segundo bloco nunca ser usado ...Atualizar
Eu escrevi uma biblioteca de seleção e intervalo entre navegadores chamada Rangy que incorpora uma versão aprimorada do código que publiquei abaixo. Você pode usar o módulo de seleção salvar e restaurar para esta pergunta em particular, embora eu fique tentado a usar algo como a resposta de @Nico Burns se você não estiver fazendo mais nada com seleções em seu projeto e não precisar da maior parte de um biblioteca.
Resposta anterior
Você pode usar o IERange ( http://code.google.com/p/ierange/ ) para converter o TextRange do IE em algo como um intervalo DOM e usá-lo em conjunto com algo como o ponto de partida da ausência de pálpebra. Pessoalmente, eu usaria apenas os algoritmos de IERange que fazem as conversões Range <-> TextRange em vez de usar a coisa toda. E o objeto de seleção do IE não possui as propriedades focusNode e anchorNode, mas você deve usar apenas o Range / TextRange obtido a partir da seleção.Eu posso montar algo para fazer isso, postarei aqui se e quando eu fizer.
EDITAR:
Eu criei uma demonstração de um script que faz isso. Funciona em tudo o que tentei até agora, exceto por um bug no Opera 9, que ainda não tive tempo de analisar. Os navegadores em que trabalha são IE 5.5, 6 e 7, Chrome 2, Firefox 2, 3 e 3.5 e Safari 4, todos no Windows.
http://www.timdown.co.uk/code/selections/
Observe que as seleções podem ser feitas ao contrário nos navegadores, para que o nó de foco esteja no início da seleção e pressionar a tecla do cursor para a direita ou para a esquerda moverá o cursor para uma posição relativa ao início da seleção. Eu não acho que é possível replicar isso ao restaurar uma seleção, portanto o nó de foco está sempre no final da seleção.
Escreverei isso completamente em algum momento em breve.fonte
Eu tive uma situação relacionada, onde especificamente precisei definir a posição do cursor para END de uma div editável por conteúdo. Eu não queria usar uma biblioteca completa como Rangy, e muitas soluções eram muito pesadas.
No final, criei essa função jQuery simples para definir a posição do quilate no final de uma div editável por conteúdo:
A teoria é simples: acrescente uma extensão ao final do editável, selecione-a e remova a extensão - deixando-nos com um cursor no final da div. Você pode adaptar esta solução para inserir a extensão onde quiser, colocando o cursor em um ponto específico.
O uso é simples:
É isso aí!
fonte
<span>
, o que acidentalmente quebrará a pilha de desfazer interna do navegador. Veja stackoverflow.com/a/4238971/96100Peguei a resposta de Nico Burns e usei o jQuery:
div contentEditable="true"
Você precisará do jQuery 1.6 ou superior:
Mostrar snippet de código
fonte
Depois de brincar, modifiquei a resposta da ausência de pálpebras acima e criei um plugin jQuery para que você possa fazer um destes:
Desculpe a publicação longa do código, mas isso pode ajudar alguém:
fonte
Você pode aproveitar o selectNodeContents que é suportado pelos navegadores modernos.
fonte
No Firefox, você pode ter o texto da div em um nó filho (
o_div.childNodes[0]
)fonte