Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.09.2013, 00:12
Новичок на форуме
Отправить личное сообщение для Cruperman Посмотреть профиль Найти все сообщения от Cruperman
 
Регистрация: 23.09.2013
Сообщений: 6

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 и отчитывал начало и конец выделения от начала текста, а не от начала строки.

Помогите, пожалуйста.
Ответить с цитированием
  #2 (permalink)  
Старый 24.09.2013, 09:58
Интересующийся
Отправить личное сообщение для Fronnt Посмотреть профиль Найти все сообщения от Fronnt
 
Регистрация: 24.09.2013
Сообщений: 24

Привет.
//нужно определить тип узла - для текстовых идем вверх по дереву к родителю
if(selection.anchorNode.nodeType === 3){
anchorNode = selection.anchorNode.parentNode;
}

я не знаю что ты хочешь сделать, но если выделять текст - то я бы избрал иной путь

Последний раз редактировалось Fronnt, 24.09.2013 в 10:04.
Ответить с цитированием
  #3 (permalink)  
Старый 24.09.2013, 22:46
Новичок на форуме
Отправить личное сообщение для Cruperman Посмотреть профиль Найти все сообщения от Cruperman
 
Регистрация: 23.09.2013
Сообщений: 6

Fronnt, мне нужно узнать начало и конец выделения в тексте.

Спасибо.
Ответить с цитированием
  #4 (permalink)  
Старый 24.09.2013, 23:36
Интересующийся
Отправить личное сообщение для Fronnt Посмотреть профиль Найти все сообщения от Fronnt
 
Регистрация: 24.09.2013
Сообщений: 24

В смысле помог или я все таки недопонял вопрос?
Ответить с цитированием
  #5 (permalink)  
Старый 24.09.2013, 23:51
Новичок на форуме
Отправить личное сообщение для Cruperman Посмотреть профиль Найти все сообщения от Cruperman
 
Регистрация: 23.09.2013
Сообщений: 6

Fronnt, получилось достать весь текст с тегами из родителя.
С этим понятно.
Но не получается узнать границы выделения относительно всего текста, т.е. родителя.
В режиме отладки поискал свойства у window.getSelection(), но ничего толкового не нашел.
Возможно плохо искал, но там слишком много вложений.

Ты говорил про другой способ...

Еще раз объясню: мне нужно получить границы выделения относительно всего текста (который находится в <span>...</span>).

Заранее спасибо. Пойду дальше искать.
Ответить с цитированием
  #6 (permalink)  
Старый 25.09.2013, 00:13
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

Придется вручную считать.

Сначала взять range:
if( selection.rangeCount ) {
   var range = selection.getRangeAt(0);
   ...
}


потом выяснить, является ли range.commonAncestorContainer твоим спаном или его потомком (если нет, то выделение выскочило за границы спана).

ну и далее разбираться со свойствами range (startContainer, endContainer, startOffset, endOffset). а именно, посчитать суммарную длину текста всех текстовых узлов до startContainer, добавить туда же все <br> (их считаем как один символ), то же самое между startContainer и endContainer и т.д.
может оказаться, что startContainer и/или endContainer окажутся спаном, тогда оффсеты соответствуют позиции чилда.

короче, тут много всяких деталей.

Тут все расписано. Если тебе ещё и для IE надо делать, то вообще "везунчик"
Ответить с цитированием
  #7 (permalink)  
Старый 25.09.2013, 00:14
Профессор
Отправить личное сообщение для Яростный Меч Посмотреть профиль Найти все сообщения от Яростный Меч
 
Регистрация: 12.04.2010
Сообщений: 557

скучно не будет - это я гарантирую
Ответить с цитированием
  #8 (permalink)  
Старый 25.09.2013, 12:39
Интересующийся
Отправить личное сообщение для Fronnt Посмотреть профиль Найти все сообщения от Fronnt
 
Регистрация: 24.09.2013
Сообщений: 24

Слушай, я бы на твоем месте поковырял исходники MashaJS они есть на гитхабе, на память, вроде русскими написана или украинцами. Там мало кода, но сделано качественно, кроссбраузерно, без багов.
http://mashajs.com/ на странице указаны подробные контакты разработчиков

Последний раз редактировалось Fronnt, 25.09.2013 в 12:49.
Ответить с цитированием
  #9 (permalink)  
Старый 25.09.2013, 13:24
Интересующийся
Отправить личное сообщение для Fronnt Посмотреть профиль Найти все сообщения от Fronnt
 
Регистрация: 24.09.2013
Сообщений: 24

Решил таки сесть за ноут.
Я вообще туповат, и соотв мог неверно понять вопрос, но если тебе нужно получить начало и конец текста в span (на самом деле вообще пофиг откуда), то можно выполнить простой поиск по тексту (через innerText или innerHTML - надо смотреть что подходит).
Вот мой прототип, не претендую на качество, объясняю лишь суть, но работает.
anchorNode.innerText.search(selection.toString())
//потом мычислим длину выделенного и прибавим к числу сверху и получим конец
//+ selection.toString().length

Последний раз редактировалось Fronnt, 25.09.2013 в 13:33.
Ответить с цитированием
  #10 (permalink)  
Старый 25.09.2013, 19:41
Новичок на форуме
Отправить личное сообщение для Cruperman Посмотреть профиль Найти все сообщения от Cruperman
 
Регистрация: 23.09.2013
Сообщений: 6

Fronnt, проблема в том, что в тексте может несколько раз встречаться одно и тоже предложение.

MaSha - хорошая идея. Будет время. Посмотрю.

Последний раз редактировалось Cruperman, 25.09.2013 в 19:48.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Всплытие событий или что то не так... Кирюха =) jQuery 6 30.03.2013 12:56
Легкий вопрос по объекту DOM FRAGnat Events/DOM/Window 2 15.12.2012 21:09
вопрос по DOM Bogdan808 Общие вопросы Javascript 2 21.08.2010 18:54
Вопрос о циклических ссылках (JavaScript -> Dom -> JavaScipt) BlueIce Events/DOM/Window 10 17.02.2010 21:58
Вопрос по объектам и DOM Hawk Events/DOM/Window 3 14.05.2008 15:04