Manter posição do range/position inicial
Boa tarde, eu resolvi colocar num form (div editável) a opção de incluir links de imagens (sem upload) e emoticons. Com as imagens beleza, pois todas ficam numa linha nova, quanto aos emoticons eu queria sempre pegar a posição do cursor dentro do campo onde está o texto.
O HTML abaixo tem o div editável, bem simples... não coloquei o codigo inteiro da div que abre os emoticons, mas basicamente tem um onclick em cada figura que leva o parametro editor (que tem o id da div que estou editando) e emoti (o src da imagem).
>
HTML
<div id="comentar" class="comentar">
<div contenteditable="true" id="comentario" ></div>
</div>
Emoticon
<img title=":)" onclick="colaEmoticon('comentario',this.src)" alt=":)" src="http://www.........com/emoticons/smile.png">
A função abaixo que uso para colocar eles dentro do editor eu sempre tenho de clicar dentro da div antes (claro que o usuário não fará isso) para indicar onde deve ser inserido o primeiro img, depois ele mantém a ultima posição, eu gostaria de definir a div editavel como alvo, caso o curso esteja fora da div (assim não insere a imagem do emoticon fora do div)...
Parece simples como dar um focus(), mas isso sempre vai colocar o cursor no inicio, e os emoticons sempre ficarão no começo... isto é, apenas se estiver fora da div editável (pelo que vi isso é obtido com o getSelecton e range - que fucei um monte e nao consegui posicionar e acabei retirando).
Não estou usando jquery, pois é para uso apenas em mensagens dentro de um versão apenas para celular, e quero usar o mínimo de código..
Obrigado.
>
FUNÇÃO
function colaEmoticon(editor,emoti) {
var emoti = '<img src="'+emoti+'"> ';
var sel, range;
if (window.getSelection) {
sel = window.getSelection();
if (sel.getRangeAt && sel.rangeCount) {
range = sel.getRangeAt(0);
range.deleteContents();
var el = document.createElement("div");
el.innerHTML = emoti;
var frag = document.createDocumentFragment(), node, lastNode;
while ( (node = el.firstChild) ) {
lastNode = frag.appendChild(node);
}
range.insertNode(frag);
if (lastNode) {
range = range.cloneRange();
range.setStartAfter(lastNode);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
}
}Discussão (2)
Carregando comentários...