2016-07-28 2 views
0

JavaScript GetSelection вопрос

if (!window.x) { 
 
    x = {}; 
 
} 
 

 
x.Selector = {}; 
 

 
x.Selector.getSelected = function() { 
 
    if (window.getSelection) { 
 
    t = window.getSelection(); 
 
    } else if (document.getSelection) { 
 
    t = document.getSelection(); 
 
    } else if (document.selection) { 
 
    t = document.selection.createRange().text; 
 
    } 
 
    return t; 
 
} 
 

 
function htmlSpanHlt() { 
 
    element = document.createElement("span"); 
 
    element.setAttribute('class', 'hlt'); 
 
    return element; 
 
} 
 

 
function highlight_text(sel) { 
 
    span = htmlSpanHlt(); 
 
    if (sel.getRangeAt) { 
 
    range = sel.getRangeAt(0); 
 
    } 
 
    span.appendChild(range.extractContents()); 
 
    range.insertNode(span); 
 
}
<div class="highlight"> 
 
    <p> 
 
    Lorem ipsum dolor sit amet, eu ius autem labitur complectitur, eos aliquip nostrud ei, ludus erroribus vel ex. Sea ex erat quaeque intellegam, et diam iusto deterruisset sea. Summo minimum periculis pro ea, diam soleat id pro. Cu putent inimicus eum, 
 
    hinc comprehensam ex qui. Delectus appetere interesset ad mel. 
 
    <br> 
 
    <br>Ius ut quis summo utroque, in sea numquam percipit eloquentiam. Vidit mucius iudicabit ius id. Id mel vero dolorem. Sale lorem tempor ius ex, commodo reprehendunt pro cu. Mel ea accumsan mentitum liberavisse, labores fabellas per te. 
 
    </p> 
 
</div>

Когда я выделяю текст, как правило, как перетаскивание мыши все будет хорошо. Проблема заключается в следующем: пример, когда я дважды нажимаю текст много раз или даже один раз, конечно, все будет выбрано, но текст, который уже выделен, вернется в нормальное состояние. Можете ли помочь мне решить эту проблему? большое спасибо.

+0

Он должен работать так, как ожидалось; что происходит? Я не вижу проблемы из того, что вы сейчас дали. Хорошо, что вы включили код, но могли бы вы привести его в рабочий пример с помощью jsfiddle или подобного? Это поможет нам понять, что происходит не так. – Whothehellisthat

+0

, если вы действительно понимаете код, если вы знаете, как код u будет отслеживать его. Как-то это проблема. это не нормально, когда дважды щелкните текст, а затем вернитесь в нормальное состояние. Я все равно понимаю вашу сторону. –

+0

«Как-то это проблема». Но в чем проблема? Либо: вы дважды щелкаете, что выделяет текст, но какой-то текст, который должен быть выделен, не выделяется, и это проблема. Или: вы дважды щелкаете, выделяете текст, код не фиксирует весь выделенный текст правильно, делая его _seem_, как часть текста на самом деле не выделяется. Или: дважды щелкните, выделите какой-то текст, какой-то текст не подсвечивается (по какой-либо причине), но в этих случаях ваш код каким-то образом запутывается. Это помогло бы иметь больше специфики или рабочий пример для _see_, в чем проблема. – Whothehellisthat

ответ

0

вещи думать о:

Range.extractContents не может быть функция, которую вы хотите использовать. Он удаляет содержимое со страницы и помещает его во временный DocumentFragment (в памяти, а не на странице вообще).

... Хотя, похоже, это может быть намеренно, в функции highlight_text(). Без какого-либо контекста я не могу быть уверен.

Выполнение этого фрагмента кода, похоже, не помешает выделению в браузере, будь то щелчок и перетаскивание, или двойное нажатие или иное. При первом нажатии текущий выделенный текст будет неактуальным - может быть, это то, что вы имеете в виду?

+0

Очень трудно приблизиться к чему-либо полезному, не понимая сначала проблему, которую вы пытаетесь решить. Но вот некоторые вещи, которые могут или не могут быть полезными. Не совсем «ответ», но, возможно, это все равно поможет. – Whothehellisthat

+0

highlight_text() функция есть это. да, возможно, Range extractContents - неправильный метод для этого, но это единственный способ переопределить основные моменты. –

+0

Если это просто стиль подчеркивания, вы можете использовать CSS, чтобы сделать что-то вроде этого. Если вам нужно просто получить ссылку на текст, чтобы показывать всплывающее окно или манипулировать текстом, что-то вроде этого, тогда вы можете просто использовать ссылку вместо ее удаления и добавления ее обратно. Что вы пытаетесь сделать с помощью переопределяя основные моменты? Может быть, я могу больше помочь. – Whothehellisthat