Как сделать подобие подсветки синтаксиса?
На входе есть строка 1235aa2323aa
<span class="input_text" contenteditable="true">1235aa2323aa</span>
На выходе должно получится что-то вроде 1235aa2323aa, где цифры и буквы имеют разные css стили которые применяются при вводе символов.
Такой костыль придумался... поставить поверх вашего элемента прозрачный textarea (input), ровно с теми же размерами и шрифтом, а при вводе текста - обновлять его в span. Проблема в том, что caret-color плохо поддерживается браузерами.
let inp = document.querySelector('.input_text');
let invis = document.querySelector('.invis');
inp.innerHTML = color(inp.innerText);
invis.addEventListener('input', function() {
inp.innerHTML = color(this.value);
this.style.height = (this.scrollHeight + 2) + 'px';
});
function color(txt) {
return txt.replace(/(\d+)/g, '<span class="number">$1</span>')
}
.input_text {
display: inline-block;
width: 200px;
background-color: #22282b;
padding: 5px;
box-sizing: border-box;
color: #f7ed7e;
font-size: 18px;
font-family: 'Helvetica';
}
.number {
color: #ed593c;
}
.invis {
position: absolute;
left: 0;
width: 200px;
padding: 4px;
font-size: 18px;
font-family: 'Helvetica';
box-sizing: border-box;
background-color: transparent;
color: transparent;
caret-color: #f7ed7e;
outline: none;
border: 1px solid red;
resize: none;
overflow: hidden;
}
<div style="position: relative">
<span class="input_text" spellcheck="false" contenteditable>1235aa2323aa</span>
<textarea class="invis" spellcheck="false">1235aa2323aa</textarea>
</div>
Через replace искать что подсветить и делать обертку с нужными стилями https://jsfiddle.net/1jm2cfqz/
document.querySelector('.input_text').innerHTML = document.querySelector('.input_text').innerHTML.replace(/\d/g, '<b>$&</b>')
Обернул каждый символ в тэг
$(document).ready(function() {
$(".my-text").keydown(function(event) {
const parElem = $(".my-text")
event.preventDefault();
let newEl;
const kCode = event.keyCode;
if (kCode >= 48 && kCode <= 57) {
newEl = `<span class="num">${String.fromCharCode(kCode)}</span>`;
} else {
newEl =`<span class="str">${String.fromCharCode(kCode)}</span>`;
}
if(kCode === 8) {
$('span').last().remove();
} else {
parElem.html(parElem.html() + newEl)
}
});
});
.num {
color: red;
}
.str {
color: blue;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<p class="my-text" contenteditable="true">
text
</p>
Нужно доработать поведение для других keyCode-ов, но вроде-бы работает
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение
В коде не существует ничего под именнем _DXGI_DEBUG_ALL или в чего то в этом духе, существует только DXGI_DEBUG_ALL (без нижнего подчеркивания)При линковке...
Столкнулся с проблемой сборки библиотеки pcre2, с параметром PCRE2_CODE_UNIT_WIDTH 0, для UTF-8, UTF-16, UTF-32, сборка проходит без проблем, однако при сборке для...