Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.01.2020, 17:31
Аспирант
Отправить личное сообщение для Andrew K Посмотреть профиль Найти все сообщения от Andrew K
 
Регистрация: 15.11.2014
Сообщений: 50

Установка текстового курсора в определённое место в элементе
Добрый день. Есть такая разметка:
<div contenteditable="true"><span>PDF</span></div>

Так как стоит contenteditable, то можно сделать чтобы появился текстовый курсор для набора текста. Мне нужно поставить курсор до <span>-а. То есть при наборе слово должно быть слева.



Написал такой код:
let span = document.querySelector('span'),
    selection = document.getSelection(),
    range = new Range();
range.setStartBefore(span);
selection.addRange(range);

Метод setStartBefore должен поставить курсор до <span>-а. Но по факту он ставит внутрь <span>-а.



Если в обёрке не будет <span>-а, то текстовый курсор нормально встаёт внутрь <div>-а. Так же если есть текст, то курсор можно поставить до или после текста. А вот если есть только вложенный <span>, то курсор никак не хочет вставать ДО него.

Теоретически можно поместить внутрь еще один пустой <span> и в него будет добавляться текст, затем изъять текст, удалить <span> и поставить на его место, но это уже костыли. Может есть какой-то другой способ?
Ответить с цитированием
  #2 (permalink)  
Старый 03.01.2020, 17:49
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от Andrew K
Так как стоит contenteditable
Т. е. предполагается, что можно вставлять любое содержимое, включая части страницы? Или вы хотите вводить только текст?
Ответить с цитированием
  #3 (permalink)  
Старый 03.01.2020, 18:02
Аспирант
Отправить личное сообщение для Andrew K Посмотреть профиль Найти все сообщения от Andrew K
 
Регистрация: 15.11.2014
Сообщений: 50

Только текст.
Ответить с цитированием
  #4 (permalink)  
Старый 03.01.2020, 18:20
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от Andrew K
Только текст.
Если только текст то вы можете сделать при помощи <input>, т. е. расставить <input> там, где ожидается ввод текста.

Вот, как пример, хотя это может быть не совсем то, что вы делаете... https://javascript.ru/forum/events/7...tml#post505084

Сообщение от Andrew K
Может есть какой-то другой способ?
Что именно вы хотите сделать?
Ответить с цитированием
  #5 (permalink)  
Старый 03.01.2020, 18:53
Аспирант
Отправить личное сообщение для Andrew K Посмотреть профиль Найти все сообщения от Andrew K
 
Регистрация: 15.11.2014
Сообщений: 50

Я делаю текстовый редактор вроде CKEditor. Пользователь будет вводить только текст и менять место ввода. А уже редактор будет ставить теги. Но и самому редактору требуется менять место ввода. И вот у меня возник затык именно в том как поставить курсор <div contenteditable="true">ВОТ В ЭТО МЕСТО<span>pdf</span></div>. Поэтому поля ввода тут не совсем уместны.
Ответить с цитированием
  #6 (permalink)  
Старый 03.01.2020, 19:01
Аспирант
Отправить личное сообщение для Andrew K Посмотреть профиль Найти все сообщения от Andrew K
 
Регистрация: 15.11.2014
Сообщений: 50

Переформулирую. Пользователь ввёл текст в редактируемую область. Программа сгенерировала такой код:
<div contenteditable="true">pdf</div>

Затем выделил слово pdf, нажал на кнопочку и редактор обернул его в <span>.
<div contenteditable="true"><span>pdf</span></div>

И теперь пользователь хочет написать текст до <span>-а. Чтобы это сделать нужно поставить курсор <div contenteditable="true">ВОТ В ЭТО МЕСТО<span>pdf</span></div>. А это сделать не удаётся.
Ответить с цитированием
  #7 (permalink)  
Старый 03.01.2020, 19:13
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,587

Попробуй не start ставить, а end.

Вообще contenteditable - это ад. Причём в каждом конкретном браузере свой. Если очень хочется пилить что-то своё, то единственное решение(без вырывания волос и (лёгкого?) сумасшествия) - изучить через какие конструкции из костылей подобное сделано в давно развивающийся редакторах.
__________________
29375, 35

Последний раз редактировалось Aetae, 03.01.2020 в 19:19.
Ответить с цитированием
  #8 (permalink)  
Старый 03.01.2020, 19:18
Аспирант
Отправить личное сообщение для Andrew K Посмотреть профиль Найти все сообщения от Andrew K
 
Регистрация: 15.11.2014
Сообщений: 50

Сообщение от Aetae Посмотреть сообщение
Попробуй не start ставить, а end.
Аналогичный результат. Только ставит курсор в конце текста заключённого в <span>.
Ответить с цитированием
  #9 (permalink)  
Старый 03.01.2020, 19:53
Аспирант
Отправить личное сообщение для Andrew K Посмотреть профиль Найти все сообщения от Andrew K
 
Регистрация: 15.11.2014
Сообщений: 50

Сообщение от Aetae Посмотреть сообщение
...изучить через какие конструкции из костылей подобное сделано в давно развивающийся редакторах.
Вот, кстати, такого поведения там не предусмотрено. Попробуйте создать абзац с текстом и вне <p>...</p> ввести текст: редактор не даст это сделать. Текст будет внутри <p>...</p>.
Ответить с цитированием
  #10 (permalink)  
Старый 03.01.2020, 20:29
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Andrew K, можно перед <span> добавить пробел нулевой ширины... (Правда, когда уже есть текст, то курсор ставится перед текстом, а не элементом, но я думаю идея понятна)

<button id="btn">Поставить курсор до &lt;span&gt;</button>
<script>
const zws = document.createTextNode("\u200B");
btn.onclick = () => {
	let span = document.querySelector("span"),
		selection = document.getSelection(),
		range = new Range();
	span.before(zws);
	range.setStartBefore(zws);
	selection.removeAllRanges();
	selection.addRange(range);
};
</script>
<style>
span { background: orange; }
</style>
<div contenteditable="true"><span>PDF</span></div>
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать чтобы по картинке при нажатии на определенное место вылезала информация о KazZato Общие вопросы Javascript 1 16.05.2018 08:58
Калькулятор с вариантом значений. dzho Общие вопросы Javascript 45 06.08.2017 03:54
Установка каретки в определенное место input Upcoming Events/DOM/Window 2 16.02.2014 12:48
Установка курсора в текстареа tarya Общие вопросы Javascript 7 11.06.2012 19:10
установка позиции курсора или выделения в iframe mister_maxim Events/DOM/Window 5 18.04.2009 10:43