Сделал вот такой маленький пример:
var div = document.querySelector('div');
var button = document.querySelector('button');
button.addEventListener('click', changeFontColor);
function changeFontColor() {
document.execCommand('foreColor', false, "green");
}
div.addEventListener('keydown', setDefaultFontColor);
function setDefaultFontColor() {
document.execCommand('foreColor', false, "red");
}
div {
font-size: 2rem;
color: red;
font-family: sans-serif;
}
<div contenteditable="true">Lorem, ipsum dolor</div>
<button>CLICK</button>
Так как тема для меня новая, мне совсем непонятно, это удачный пример или нет (сомнения с событием keydown
)?
Ещё заметил, что если в setDefaultFontColor
цвет меняется на такой же, как и в css, то новый текст не оборачивается в тег <font></font>
... что мне собственно и нужно, но непонятно почему...это какие-то оптимизации со стороны браузера?
Потом стало интересно, как это сделать "вручную", написал вот такое:
var div = document.querySelector('div');
var button = document.querySelector('button');
button.addEventListener('click', changeText);
function changeText() {
var selected = window.getSelection().toString();
var currentText = div.innerHTML;
currentText = currentText.replace(new RegExp(selected, 'g'), `<span>${selected}</span>`);
div.innerHTML = currentText;
}
div {
font-size: 2rem;
color: red;
font-family: sans-serif;
}
span {
color: green;
}
<div contenteditable="true">Lorem, ipsum dolor</div>
<button>CLICK</button>
но теперь новая проблема: как "выйти" из тега span
после изменения цвета и продолжить писать в div
?
Сделал на данный момент вот так:
var div = document.querySelector('div');
var button = document.querySelector('button');
button.addEventListener('click', changeText);
function changeText() {
var selected = window.getSelection().toString().replace(/[^a-zA-Zа-яА-Я0-9-\s]/g, "");
if (selected.length <= 1) return;
var currentText = div.innerHTML;
var newText = currentText.replace(new RegExp(selected, 'g'), `<span>${selected}</span>`);
div.innerHTML = newText;
}
div.addEventListener('keypress', appendChar);
function appendChar(e) {
e.preventDefault();
var char;
var key = e.keyCode;
switch (key) {
case 32:
char = ' ';
break;
case 13:
char = '\n'; // ?????????????
break;
default:
char = String.fromCharCode(key);
}
document.execCommand("insertHTML", null, char);
}
div {
font-size: 2rem;
color: red;
font-family: sans-serif;
}
span {
color: green;
}
<div contenteditable="true">Lorem, ipsum dolor</div>
<button>CLICK</button>
Может кому-нибудь пригодится.
Но это какой-то мега-костыль и c переносом строки я так и не разобрался.
А, и если вам нужно изменять только выбранное слово, а не выбранное + все его копии, то вот пример https://ru.stackoverflow.com/a/947505/355286
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Имеется js код такого типа, который делает запрос к апи и получает от него ответ