2010-06-03 2 views
2

Я получил несколько <p contenteditable="true"></p> элементов на странице. Я ищу решение использовать клавиши со стрелками для навигации по этим непересекающимся элементам, как если бы они были одним единственным редактируемым элементом.несколько элементов контента, используя клавиши со стрелками для навигации

Так, например, если каретка находится на 10-м символе в последней строке 1-го абзаца, и пользователь нажимает клавишу со стрелкой вниз, карет должен перейти к второму абзацу и поместить каретку на 10-й символ (если есть) на первой строке.

Цените любые комментарии.

ответ

1

Что делать, если вы сделаете элемент контейнера редактируемым, а не каждый отдельный абзац? Например:

<div contenteditable="true"> 
    <p>Lorem ipsum</p> 
    <p>dolor sit</p> 
</div> 
+0

имеет общий смысл, но это сделает абзацы удаляемыми среди других нежелательных побочных эффектов контентного контейнера div. Вместо этого мне нужно придерживаться многих абзацев. – Alex

+1

@Alex, вместо того чтобы пытаться поддерживать неопределенные абзацы, возможно, вы должны поддерживать родителя и заменять дочерние абзацы пустыми, если они удалены. – eyelidlessness

1

Пересмотренный ответ

Вы можете обнаружить, что каретка находится в начале или в конце текущего редактируемого элемента, используя что-то вроде следующего (например, для вниз матрицы на последняя строка):

  • обнаружить стрелку вниз keydown событие
  • Проверьте, если курсор находится в конце фасова ragraph, выполнив одно из следующих действий:
  • Создайте Range (или TextRange в IE) из объекта выбора и сравнив его с другим диапазоном, который охватывает весь абзац. Это немного сложнее, но более плавный вариант. OR:
  • Сохраните выбор и установите короткий таймер (скажем, 1 миллисекунду), чтобы позволить нажатию клавиши вступить в силу. Функция, переданная на вызовы таймера, сравнивает текущий выбор с ранее сохраненным выбором. Если они одинаковы, карет не двигался и, должно быть, находился в конце абзаца.
  • Если каретка находится в конце параграфа, переместите его в начало следующего редактируемого абзаца.

Это не обычное поведение каретки, но достаточно легко достичь и может быть разумным компромиссом. Проблема в том, что нет надежного кросс-браузерного способа разработки координат каретки.

+0

Фактически, когда вы нажимаете клавишу со стрелкой вниз на последней строке, карет не останется в том же положении, но переместится к самому концу абзаца. Таким образом, решение может потенциально работать, если можно определить, что каретка находится в конечной позиции редактируемого элемента. Есть идеи по этому поводу? – Alex

+0

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

+0

Я обновил свой ответ. –