Показать сообщение отдельно
  #1 (permalink)  
Старый 30.09.2015, 22:01
Профессор
Отправить личное сообщение для ТОТ_САМЫЙ Посмотреть профиль Найти все сообщения от ТОТ_САМЫЙ
 
Регистрация: 10.09.2015
Сообщений: 184

Выделение в браузерах
Ребят это баг или у меня руки кривые?

Задача:

1) сохранить выделение.
2) изменить значение текстовой ноды(эта процедура заставляет браузер сбросить выделение).
3) восстановить выделение.


Вот класс отвечающий за сохранение и восстановление выделения:

class Selection

	constructor: ->
		@ranges = []


	clear: ->
		@ranges = []


	save: ->
		@clear()
		selection = window.getSelection()
		for i in [0...selection.rangeCount]
			range = selection.getRangeAt(i)
			@ranges.push
				'startContainer': range.startContainer
				'startOffset': range.startOffset
				'endContainer': range.endContainer
				'endOffset': range.endOffset
		return


	restore: ->
		selection = window.getSelection()
		selection.removeAllRanges()
		for rangeData in @ranges
			range = document.createRange()
			range.setStart(rangeData.startContainer, rangeData.startOffset)
			range.setEnd(rangeData.endContainer, rangeData.endOffset)
			selection.addRange(range)
		return


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

А тепрь пытаюсь делать вот что, начинаю делать выделение мышкой и не отпускаю кнопку, дожидаюсь пока значение ноды изменится, иииии... О ЧУДО, после рестора, в хроме и лисе все работает, а в ишаке процесс выделения прерывается, и при дальнейшем движении мышки выделение остается на том же месте где мы рестор сделали.

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

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

Последний раз редактировалось ТОТ_САМЫЙ, 30.09.2015 в 22:55.
Ответить с цитированием