Знания заключаются в накоплении, чем больше наступишь на яму, тем сильнее станешь😎
предисловие
использовать большеJQuery, используемый для использования операций JQuery APIDOM,чуть не забыл нативную JS работу над DOM.Сегодня столкнулся с ситуацией когда в проекте перемешаны текст и картинки.Первый способ который приходит на ум это использоватьtextareaЯ понял, что не могу реализовать ввод изображений, и тогда я подумал о том, чтобы найти плагин для редактора форматированного текста. плагин.Наггетсфункцию точки кипения релиза, а затем имитировали ее практику, так что есть обмен этой статьей. Позвольте мне сначала показать вам окончательный результат 😋
Реализовать идеи
- использоватьdivизcontenteditableатрибут, чтобы сделать div редактируемым
- связыватьrefАтрибут для управления элементами поля ввода
- Когда изображение нажато, получите адрес изображения и используйте его для преобразования адреса изображения.
- Создайте тег img и назначьте адрес конвертированного изображения.
- отrefsЭлемент поля ввода получается из объекта, а созданному тегу img присваивается
Процесс реализации
- Объявите div редактируемым, прослушайте событие клавиши Enter, отключите проверку орфографии и привяжите ref, чтобы получить текущий элемент
<div class="input-panel" ref="msgInputContainer" @keydown.enter.exact="sendMessage($event)" contenteditable="true" spellcheck="false"></div> - Привязать соответствующее событие к полю ввода выражения
<div class="item-panel" v-for="item in this.emojiList" :key="item.info"> <img :src="require(`../assets/img/emoji/${item.src}`)" :alt="item.info" @mouseover="emojiConversion($event,'over',item.src,item.hover,item.info)" @mouseleave="emojiConversion($event,'leave',item.src,item.hover,item.info)" @click="emojiConversion($event,'click',item.src,item.hover,item.info)"> </div> - Реализовать событие щелчка изображения коробки смайликов
emojiConversion: function (event, status, path, hoverPath, info) { if (status === "over") { event.target.src = require(`../assets/img/emoji/${hoverPath}`); } else if (status === "click") { // 表情输入 const imgSrc = require(`../assets/img/emoji/${hoverPath}`); /** * 不推荐的写法: * 无法获取焦点 * 无法在当前焦点的位置插入元素 */ // const imgTag = document.createElement("img"); // imgTag.src = imgSrc; // imgTag.alt = info; // this.$refs.msgInputContainer.appendChild(imgTag); /** * 推荐使用document暴露的execCommand 方法来操作此处 * 可以在当前焦点处插入元素 * 感谢评论区掘友的建议 */ const imgTag = `<img src="${imgSrc}" width="28" height="28" alt="${info}">`; document.execCommand("insertHTML", false, imgTag); } else { event.target.src = require(`../assets/img/emoji/${path}`); } }
Побить пит-рекорд
-
Использовать напрямуюметод добавления()
В проекте компании используется JQuery, и аналогичные требования добавляются напрямую, думая, что это метод, предоставляемый js, но здесь напрямую используется результат, ответ очевиден, а строка DOM вставляется непосредственно в поле ввода 🤣
-
Вручную внедрить строку в dom
Я вручную реализую это сам. Я не знаю, если я написал это неправильно, и это не работает. Если вы найдете ошибку, пожалуйста, оставьте сообщение в области комментариев.
-
Правильный способ реализации
Чтобы создать строку DOM, используйте метод execCommand, предоставляемый документом, для вставки созданной строки DOM.инструкции
- Однако совместимость execCommand оставляет желать лучшего, и если вы не получите ответа, ваш браузер не поддерживает этот API. (картинка с мдн)
- Если вы рассматриваете вопросы совместимости, вы можете использовать другой метод записи, упомянутый в тексте.
// const imgTag = document.createElement("img"); // imgTag.src = imgSrc; // imgTag.alt = info; // this.$refs.msgInputContainer.appendChild(imgTag);
адрес проекта
Эффект, достигнутый в этой статье, в моем open source проекте:chat-system-githubЕсли он используется, онлайн-адрес проекта:chat-system
напиши в конце
- Если в статье есть ошибки, исправьте их в комментариях, если статья вам поможет, ставьте лайк и подписывайтесь 😊
- Эта статья впервые появилась в Наггетс, если нужно перепечатать, укажите источник 💌