DOM - вопрос
Привет!
Возникла вот такая проблема. Уже второй день бьюсь над её решением. Суть: Есть текст, заключеный в тег span. Например: <span id="MainText">Ночь, улица, фонарь, аптека,<br>Бессмысленный и тусклый свет.<br>Живи еще хоть четверть века -<br>Все будет так. Исхода нет.<br><br>Умрешь - начнешь опять сначала<br>И повторится все, как встарь:<br>Ночь, ледяная рябь канала,<br>Аптека, улица, фонарь.<br></span> Есть кнопка. Пользователь выделяет кусок текста и нажимает на эту кнопку. В результате выполняется скрипт: var selection = window.getSelection(); anchorOffset = selection.anchorOffset; //Начало выделения focusOffset = selection.focusOffset; //Конец выделения anchorNode = selection.anchorNode; //Контейнер, в котором находится выделенный фрагмент if( selection.length != 0 ) { alert( anchorOffset + ',' + (focusOffset - anchorOffset) ); alert( anchorNode.data ); } Все работает, но... anchorNode = selection.anchorNode; //Контейнер, в котором находится выделенный фрагмент Как контейнер он выведет строку, в которой находится выделенный фрагмент, т.е. то, что находится между тегами <br>..<br> в моем случае. Следовательно отсчитывать начало и конец выделения он будет от начала этого контейнера. Мне же нужно, чтобы за контейнер он принимал все, что находится внутри span и отчитывал начало и конец выделения от начала текста, а не от начала строки. Помогите, пожалуйста. :help: |
Привет.
//нужно определить тип узла - для текстовых идем вверх по дереву к родителю if(selection.anchorNode.nodeType === 3){ anchorNode = selection.anchorNode.parentNode; } я не знаю что ты хочешь сделать, но если выделять текст - то я бы избрал иной путь |
Fronnt, мне нужно узнать начало и конец выделения в тексте.
Спасибо. |
В смысле помог или я все таки недопонял вопрос? :)
|
Fronnt, получилось достать весь текст с тегами из родителя.
С этим понятно. Но не получается узнать границы выделения относительно всего текста, т.е. родителя. В режиме отладки поискал свойства у window.getSelection(), но ничего толкового не нашел. Возможно плохо искал, но там слишком много вложений. Ты говорил про другой способ... Еще раз объясню: мне нужно получить границы выделения относительно всего текста (который находится в <span>...</span>). Заранее спасибо. Пойду дальше искать. |
Придется вручную считать.
Сначала взять range: if( selection.rangeCount ) { var range = selection.getRangeAt(0); ... } потом выяснить, является ли range.commonAncestorContainer твоим спаном или его потомком (если нет, то выделение выскочило за границы спана). ну и далее разбираться со свойствами range (startContainer, endContainer, startOffset, endOffset). а именно, посчитать суммарную длину текста всех текстовых узлов до startContainer, добавить туда же все <br> (их считаем как один символ), то же самое между startContainer и endContainer и т.д. может оказаться, что startContainer и/или endContainer окажутся спаном, тогда оффсеты соответствуют позиции чилда. короче, тут много всяких деталей. Тут все расписано. Если тебе ещё и для IE надо делать, то вообще "везунчик" :) |
скучно не будет - это я гарантирую :D
|
Слушай, я бы на твоем месте поковырял исходники MashaJS они есть на гитхабе, на память, вроде русскими написана или украинцами. Там мало кода, но сделано качественно, кроссбраузерно, без багов.
http://mashajs.com/ на странице указаны подробные контакты разработчиков;) |
Решил таки сесть за ноут.
Я вообще туповат, и соотв мог неверно понять вопрос, но если тебе нужно получить начало и конец текста в span (на самом деле вообще пофиг откуда), то можно выполнить простой поиск по тексту (через innerText или innerHTML - надо смотреть что подходит). Вот мой прототип, не претендую на качество, объясняю лишь суть, но работает. anchorNode.innerText.search(selection.toString()) //потом мычислим длину выделенного и прибавим к числу сверху и получим конец //+ selection.toString().length |
Fronnt, проблема в том, что в тексте может несколько раз встречаться одно и тоже предложение.
MaSha - хорошая идея. Будет время. Посмотрю. |
Часовой пояс GMT +3, время: 01:42. |