2015-01-16 3 views
1

У меня есть текст в следующем формате:Текст подсветка в Javascript

<div id="text"> 
    <div>Hello world</div> 
    <div>How are you</div> 
</div> 

Пользователь выбирает «ш» в мире:

Так я получаю выбор и может вставить продолжительность:

var selection = window.getSelection(); 
var startNode = $(selection.anchorNode.parentElement); 
var endNode = $(selection.focusNode.parentElement); 
var startIndex = startNode.index(); 
var endIndex = endNode.index(); 
var startOffset = selection.anchorOffset; 
var endOffset = selection.focusOffset; 

Результат:

<div id="test"> 
    <div>Hello <span class="id1">w</span>orld</div> 
    <div>How are you</div> 
</div> 

id1.startNode = 0 
id1.endNode = 0 
id1.startOffset = 6 
id1.endOffset = 7 

Пользователь теперь выбирает текст «d Ho». Вот как это должно выглядеть следующим образом:

<div id="test"> 
    <div>Hello <span class="id1">w</span>orl<span class="id2">d</span></div> 
    <div><span class="id2">Ho</span>w are you</div> 
</div> 

id2.startNode = 0 
id2.endNode = 1 
id2.startOffset = 9 
id2.endOffset = 2 

Но используя метод из, прежде чем selection.anchorOffset дает мне указательный относительно новых созданных текстовых узлов, которые теперь «Hello», «ш» и «Всемирная», что означает, что я получить индекс 3 вместо 10.

Я использую следующий код, чтобы получить смещение, которое было создано:

var offs = 0; 
if(startNode.context.innerHTML.length > startNode.context.innerText.length) { 
    var n = startNode.context.childNodes; 
    for (var i = 0; i < n.length; i++) { 
     if(n[i].textContent === selection.anchorNode.textContent) { 
      break; 
     } 
     else { 
      offs += n[i].textContent.length; 
     } 
    } 
} 
console.log(offs); 

теперь я могу добавить смещение на начало и конец, но такого рода перерывы, когда выбор проходит по различным узлам или содержит выбор внутри Это. Я также не знаю, как создать пролеты с этими смещениями. Есть также способ для многих случаев, которые я должен учитывать как startNode === endNode, или если выбор содержит полный или частично диапазон.

Есть ли общие подходы или рамки для таких вещей? Я бы скорее просто работал с чистыми текстовыми индексами вместо html-тегов внутри и позволял чему-то другому обрабатывать правильное форматирование.

ответ

Смежные вопросы