JSFiddle - React, Tailwind, and code Playground

by petroveg

HTML

<form action="" name="chat">
	<textarea name="message" class="field" data-action="paste">На вставку текста вешаю событие и обрабатываю полученный текст, но как его потом вставить?</textarea>
	<ul class="smile-list">
		<li class="smile-item" data-action="smile" data-content="^)">Улибка</li>
		<li class="smile-item" data-action="smile" data-content=":\">Датыч0?</li>
	</ul>
</form>

CSS

.field,
.smile-list{
	vertical-align:top;
}
.field{
	width:300px;
	height:100px;
	padding:20px;
	height:200px;
	border:4px solid #369;
	border-radius:4px;
	font-size:1.5em;
}
.smile-list{
	list-style:none;
	display:inline-block;
	margin:20px 0 0 20px;
	padding:0;
}
.smile-item{
	margin:0 0 5px;
	padding:5px 10px;
	border-radius:4px;
	background:#f0f0f0;
	cursor:default;
}
.smile-item:hover{
	color:#fff;
	background:#69c;
}

JavaScript

$(function () {
	var target = document.chat.message;

	$(document).on('click', '[data-action="smile"]', function (e) {
		var content = $(this).data('content');

		insert(content);
	});

	function insert (text) {
		if (window.getSelection) {
			var start = target.selectionStart = target.selectionStart || target.value.length;

			target.value = target.value.slice(0, start) + text + target.value.slice(target.selectionEnd);
			target.selectionStart = target.selectionEnd = start + text.length;
		} else {
			target.select();
			var range = document.selection.createRange();

			range.collapse(false);
			range.text = text;
			range.collapse(false);
			range.select();
		}
	}
});