Вставка IMG в DIV contenteditable

282
11 сентября 2017, 06:35

Хочу вставить IMG смайлик в редактируемый DIV с учётом положения курсора, используя чистый JS (без jquery). В ходе полуторачасового поиска в интернете, так и не смог найти нормальный пример. Неужели это такая невыполнимая задача?

У меня есть в бэкапах рабочий пример, но он исключительно для TEXTAREA. К редактируемому блоку с атрибутом contenteditable он не подходит.

Answer 1
  • Получаем выделение с помощью метода Window::getSelection
  • Проверяем, выделено ли что-нибудь с помощью свойства Selection::rangeCount
  • Получаем первый диапазон выделения с помощью метода Selection::getRangeAt
  • Вставляем изображение в конец диапаозона с помощью метода Range::insertNode
  • Статья по теме на learn.javascript.ru

let editable = document.getElementById('editable'); 
document.querySelector('button').addEventListener('mousedown', onclick); 
 
function onclick(event) { 
  event.preventDefault(); // чтобы #editable не терял фокус 
  insertImage(); 
} 
 
function insertImage() { 
  let image = document.createElement('img'); 
  image.src = "http://placehold.it/20x20"; 
  selection = window.getSelection(); 
  if (selection.rangeCount === 0 /* нет выделения */ || 
    // выделение лежит не в #conteneditable 
    !editable.contains(selection.getRangeAt(0).commonAncestorContainer)) { 
    // вставляем в конец элемента #editable 
    editable.appendChild(image); 
  } else { 
    let range = selection.getRangeAt(0); 
    // сжимаем range в его правый конец 
    range.collapse(false); 
    // вставляем картинку 
    range.insertNode(image); 
 
    // делаем, чтобы курсор был после вставленной картинки 
    selection.removeAllRanges(); 
    range.setStartAfter(image); 
    selection.addRange(range); 
  } 
}
#editable { 
  background-color: cornsilk; 
}
<button>Добавить картинку</button> 
<div id="editable" contenteditable>Редактируемый элемент</div>

READ ALSO
Переместить метку Яндекс.Карты 2.1

Переместить метку Яндекс.Карты 2.1

ПриветствуюЕсть отличный пример по изменению координат

337
JQuery как написать функцию, которая будет срабатывать при выполнении другой (уже встроенной в JQuery) функции?

JQuery как написать функцию, которая будет срабатывать при выполнении другой (уже встроенной в JQuery) функции?

Если использовать val(), то on('change') не работаетЯ хочу написать функцию, которая вызывается после выполнения val(), в ней проверяется - у какого...

363
Многоразовый печатающийся текст. Как в VN

Многоразовый печатающийся текст. Как в VN

Читали визуальные новеллы? Текст появляется по одной букве и происходить это должно неограниченное кол-во разНапример

271
Кроссдоменный post запрос

Кроссдоменный post запрос

Подскажите пожалуйста, как с помощью ajax, jq отправить кроссдоменный пост запрос для логина? Как передать нужные header?

318