Ты совсем близко. Если вам нужен только идентификатор родительского элемента, тогда вы должны заменить paraElement.getAttribute
на paraElement.id
, например:
var paraID = paraElement.id;
Что касается параметра getRangeAt()
, он указывает индекс диапазона выбора, который нужно вернуть, и он действительно имеет отношение только к элементам управления, которые допускают прерывистый выбор. Например, поле select
, в котором пользователь может использовать ctrl + click
для одновременного выбора нескольких произвольных групп строк. В таком случае вы можете использовать параметр для перехода от одного выбранного региона к следующему. Но для выделения текста внутри абзаца у вас никогда не должно быть прерывистого выделения, и поэтому всегда можно пропустить 0
. По сути это означает, что вы запрашиваете «первый выбранный регион».
Также обратите внимание, что если ваш интерфейс позволяет выбору пользователя охватывать несколько абзацев, тогда ваш commonAncestorContainer
может не быть абзацем, это также может быть любой элемент, содержащий все ваши теги абзаца. Так что вы должны быть готовы разобраться с этим делом.
Edit:
Немного поиграв с этим, вот мое предложение: http://jsfiddle.net/vCsZH/
По сути, вместо того, чтобы полагаться на commonAncestorContainer
, этот код применяет mouseDown
и mouseUp
слушатель к каждому абзацу (в дополнение к тому, который уже применен к контейнеру верхнего уровня). По сути, слушатели будут записывать абзацы, в которых начинается и заканчивается диапазон выбора, что значительно упрощает надежную работу по выбору абзацев.
Если когда-либо был случай в пользу использования динамического связывания событий через фреймворк, такой как jQuery, вот оно.