Я пришел к окончательному кросс-браузерному решению, чтобы установить позицию курсора / каретки в последнюю известную позицию, когда contentEditable = 'on' <div> восстанавливает фокус. Кажется, по умолчанию функциональность редактируемого содержимого div заключается в перемещении курсора / курсора в начало текста в div при каждом нажатии на него, что нежелательно.
Я полагаю, что мне пришлось бы хранить в переменной текущую позицию курсора, когда они покидают фокус div, и затем переустанавливать это, когда они снова фокусируются внутри, но я не смог собрать или найти рабочее Пример кода пока нет.
Если у кого-то есть мысли, рабочие фрагменты кода или примеры, я буду рад их видеть.
У меня пока нет кода, но вот что у меня есть:
<script type="text/javascript">
// jQuery
$(document).ready(function() {
$('#area').focus(function() { .. } // focus I would imagine I need.
}
</script>
<div id="area" contentEditable="true"></div>
PS. Я пробовал этот ресурс, но, похоже, он не работает для <div>. Возможно, только для текстовой области ( как переместить курсор в конец объекта contenteditable )
contentEditable
работал в браузерах не IE o_oОтветы:
Это совместимо со стандартными браузерами, но, вероятно, не удастся в IE. Я предоставляю это как отправную точку. IE не поддерживает DOM Range.
источник
cursorStart.appendChild(document.createTextNode('\u0002'));
мы считаем разумной заменой. для - символ Спасибо за кодЭто решение работает во всех основных браузерах:
saveSelection()
прикрепляются кonmouseup
иonkeyup
событиям DIV и сохраняет выбор в переменномsavedRange
.restoreSelection()
присоединяется кonfocus
событию div и повторно выбирает сохраненный вsavedRange
.Это работает отлично, если только вы не хотите, чтобы выбор был восстановлен, когда пользователь щелкает div также (что немного неинтуитивно, поскольку обычно вы ожидаете, что курсор будет идти туда, куда вы щелкаете, но код включен для полноты)
Для достижения этой цели
onclick
иonmousedown
мероприятия отменяются функции ,cancelEvent()
которая является кросс функция браузера , чтобы отменить событие.cancelEvent()
Функция также запускаетrestoreSelection()
функцию , так как событие щелчок отменило ДИВ не получает фокус , и поэтому ничего не выбрано вообще , если эта функция не будет работать.Переменная
isInFocus
хранит, находится ли она в фокусе и изменена на «ложь»onblur
и «истина»onfocus
. Это позволяет отменять события щелчка, только если div не находится в фокусе (в противном случае вы вообще не сможете изменить выделение).Если вы хотите к выбору быть изменения , когда DIV фокусировалось щелчком, а не восстановить выбор
onclick
(и только тогда , когда внимание уделяется элементу ими программным использованиемdocument.getElementById("area").focus();
или аналогичных затем просто удалитьonclick
иonmousedown
события. Вonblur
мероприятии иonDivBlur()
иcancelEvent()
функции также может быть безопасно удален в этих обстоятельствах.Этот код должен работать, если он помещен непосредственно в тело html-страницы, если вы хотите быстро его протестировать:
источник
if (window.getSelection)...
проверяться только поддержка браузеромgetSelection
, нет ли выбора?getSelection
API или устаревшийdocument.selection
API, используемый в более старых версиях IE. Более позднийgetRangeAt (0)
вызов вернется,null
если нет выбора, который проверяется в функции восстановления.else if (document.createRange)
) - это то, на что я смотрю. Он будет вызываться только в том случае, еслиwindow.getSelection
его не существует, но используетwindow.getSelection
window.getSelection
но неdocument.createRange
- значит, второй блок никогда не будет использован ...Обновить
Я написал кросс-браузерную библиотеку диапазонов и выбора под названием Rangy, которая включает улучшенную версию кода, который я разместил ниже. Вы можете использовать модуль выбора и сохранения для этого конкретного вопроса, хотя я бы соблазнился использовать что-то вроде ответа @Nico Burns, если вы ничего не делаете с выборами в своем проекте и вам не нужна основная часть библиотека.
Предыдущий ответ
Вы можете использовать IERange ( http://code.google.com/p/ierange/ ), чтобы преобразовать TextRange в IE во что-то вроде диапазона DOM и использовать его вместе с чем-то вроде отправной точки отсутствия век. Лично я бы использовал только алгоритмы от IERange, которые выполняют преобразования Range <-> TextRange, а не используют все это. И объект выбора IE не имеет свойств focusNode и anchorNode, но вы должны иметь возможность просто использовать Range / TextRange, полученный из выбора.Я мог бы что-то собрать, чтобы сделать это, отправлю сюда, если и когда я сделаю.
РЕДАКТИРОВАТЬ:
Я создал демо сценария, который делает это. Это работает во всем, что я пробовал до сих пор, за исключением ошибки в Opera 9, которую я еще не успел изучить. Браузеры, в которых он работает, - это IE 5.5, 6 и 7, Chrome 2, Firefox 2, 3 и 3.5 и Safari 4, все в Windows.
http://www.timdown.co.uk/code/selections/
Обратите внимание, что выбор может быть сделан в браузерах в обратном направлении, так что узел фокуса находится в начале выделения, а нажатие клавиши курсора вправо или влево переместит курсор в положение относительно начала выделения. Я не думаю, что это возможно повторить при восстановлении выделения, поэтому фокусный узел всегда находится в конце выделения.
Я напишу это полностью в какой-то момент в ближайшее время.источник
У меня была похожая ситуация, когда мне нужно было установить позицию курсора на КОНЕЦ contenteditable div. Я не хотел использовать полноценную библиотеку, такую как Rangy, и многие решения были слишком тяжелыми.
В конце концов, я придумал эту простую функцию jQuery, чтобы установить позицию в каратах до конца contenteditable div:
Теория проста: добавьте интервал в конец редактируемого, выберите его, а затем удалите интервал - оставив нам курсор в конце элемента div. Вы можете адаптировать это решение для вставки диапазона, где вы хотите, таким образом, поместив курсор в определенное место.
Использование простое:
Это оно!
источник
<span>
, что случайно сломает встроенный в браузер стек отмены. См. Stackoverflow.com/a/4238971/96100Я взял ответ Нико Бернса и сделал его с помощью jQuery:
div contentEditable="true"
Вам понадобится jQuery 1.6 или выше:
Показать фрагмент кода
источник
После игры я изменил ответ без век выше и сделал его плагином jQuery, чтобы вы могли просто сделать один из них:
Извините за длинный пост кода, но это может кому-то помочь:
источник
Вы можете использовать selectNodeContents, который поддерживается современными браузерами.
источник
В Firefox у вас может быть текст div в дочернем узле (
o_div.childNodes[0]
)источник