Странное поведение с range.toString()

Я хочу вернуть текст, который я выбираю в элементе, используя объект Range, предоставленный разновидностью javascript от Mozilla.

Итак, я делаю это:

//assume that I'm only using Firefox, and there is just one selection
var range = window.getSelection().getRangeAt(0);
var rangeText = range.toString();

Это работает нормально, когда html выделенного текста не содержит новых строк. Другими словами, если у меня есть следующий html:

<div>One. Two. Three. Four. Five.</div>

и я выбираю Два. Три. Четыре., значит все нормально.

С другой стороны, если у меня есть

<div>
One.
Two.
Three.
Four.
Five.
</div>

и я выбираю Два. Три. Четыре. как и раньше, в результат, возвращаемый функцией Range.toString(), вводятся новые строки; новые строки идут после двух, трех и четырех.

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


person Tola Odejayi    schedule 18.10.2009    source источник


Ответы (2)


Это должно сделать это:

range.toString().replace(/\s+/g, ' ').replace(/^\s+|\s+$/g, '')
person brianpeiris    schedule 18.10.2009
comment
\s достаточно, так как он соответствует [\f\n\r\t\v\u00A0\u2028\u2029]. См. javascriptkit.com/javatutors/redev2.shtml. - person Justin Johnson; 19.10.2009
comment
Это почти сработало, но я обнаружил, что между «‹div›» и «One» вставлялись пробелы, от которых он не мог избавиться, поскольку мог сократить их только до одного пробела. Другими словами, я все еще не получал точный текст между тегами div. - person Tola Odejayi; 19.10.2009
comment
Я отредактировал ответ, чтобы обрезать пробелы с концов строки. - person brianpeiris; 19.10.2009

ОК, в конце я использовал часть ответа Тима Дауна:

  var sel = window.getSelection();
  var range = sel.getRangeAt(0);
  var range2 = range.cloneRange();

  //do some stuff with range2...

  var rangeText, range2Text;

  sel.removeAllRanges();
  sel.addRange(range);
  rangeText = sel.toString();

  sel.removeAllRanges();
  sel.addRange(range2);
  range2Text = sel.toString();
person Tola Odejayi    schedule 19.10.2009
comment
Это будет делать то, что вы хотите, но вы должны убедиться, что вы восстановили выбор до того, что он начал, как в конце, чтобы не запутать пользователя. - person Tim Down; 19.10.2009