Замена слова в textarea по клику мышки.
Всем привет,
Есть textarea с текстом. Нужно при клике мышкой по слову, сделать его замену. Например, кликнув по слову word, заменить его на [word] или *word*. А при повторном клике вернуть в исходное состояние. Толкните в нужном направлении, спасибо. |
Цитата:
https://developer.mozilla.org/en-US/...extAreaElement setSelectionRange() https://developer.mozilla.org/en-US/...SelectionRange setRangeText() https://developer.mozilla.org/en-US/...t/setRangeText и обычных операций с строками |
voraa,
Спасибо. Подумал про два варианта: Первый, юзер делает двойной клик по слову и браузер его выделяет, я же скриптом проверяю выделение, при необходимости меняю его, и обрабатываю. Второй, по одиночному клику, определяю позицию, выбираю слово и обрабатываю. По какому варианту лучше пойти? Спасибо |
Откуда же я знаю, что это за приложения и какая работа там предполагается?
Если по одинарному клику, то как другие какие то действия делать, например поставить курсор и редактировать текст? Предполагается ли вариант для мобильных? Предполагается ли вариант (как во всяком солидном, уважающем себя и пользователей) вариант работы без мыши - только с клавиатуры? |
Цитата:
Цитата:
|
Замена слова в textarea по клику мышки
savsoft,
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
let textarea = document.querySelector(".txt");
textarea.addEventListener("click", function() {
let text = this.value,
start = this.selectionStart,
end = this.selectionEnd;
if (/\S/.test(text[start]) && start == end) {
while (start) {
if (/\s/.test(text[start - 1])) break;
start--;
}
while (end < text.length) {
end++;
if (/\s/.test(text[end])) break;
}
this.setSelectionRange(start, end);
let selected = text.slice(start, end);
if (selected) {
selected = (/\*\S+\*/.test(selected)) ? selected.slice(1, -1) : `*${selected}*`;
this.setRangeText(selected, start, end, "end");
}
}
})
});
</script>
</head>
<body>
<textarea name="txt" class="txt">hello word red* </textarea>
</body>
</html>
|
Я бы сделал выделение и кнопку "изменить"
Выделять можно и двойным кликом и просто мышью. Слова бывают и с дефисом, а при двойном клике выделится только одна часть. Ну а кнопка от случайного изменения. Сначала выделил, потом изменил. А не просто выделил (а вдруг, случайно) и оно само изменилось. |
рони, по \s в регулярке будут хвататься запятые и точки в конце слова. Не думаю, что это надо.
|
Цитата:
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
let textarea = document.querySelector(".txt");
textarea.addEventListener("click", function() {
let text = this.value,
start = this.selectionStart,
end = this.selectionEnd;
if (/[a-zа-яё]/i.test(text[start]) && start == end) {
while (start) {
if (/[^a-zа-яё*]/i.test(text[start - 1])) break;
start--;
}
while (end < text.length) {
end++;
if (/[^a-zа-яё*]/i.test(text[end])) break;
}
this.setSelectionRange(start, end);
let selected = text.slice(start, end);
if (selected) {
selected = (/\*([a-zа-яё*]+)\*/i.test(selected)) ? selected.slice(1, -1) : `*${selected}*`;
this.setRangeText(selected, start, end, "end");
}
}
})
});
</script>
</head>
<body>
<textarea name="txt" class="txt">hello word. red* </textarea>
</body>
</html>
|
Меняет туда и обратно. Выделять как угодно
(на 100% не тестировал)
<!DOCTYPE html>
<html>
<head>
<title>Untitled</title>
<meta charset="utf-8">
<style type="text/css">
</style>
<script>
document.addEventListener("DOMContentLoaded", function() {
let bch = document.getElementById("bch");
txta = document.getElementById("txta")
bch.addEventListener("click", function() {
let text = txta.value,
start = txta.selectionStart-1,
end = txta.selectionEnd;
let rlet = /\p{General_Category=Letter}/u;
while (end > start && !rlet.test(text[end-1])) end --;
while (start < end && !rlet.test(text[start])) start ++;
if (start === end) return
let selected = text.slice(start, end);
if (selected) {
if (text[start-1] === '*' && text[end] === '*') {
txta.setRangeText(selected, start-1, end+1, "end");
} else {
selected = `*${selected}*`;
txta.setRangeText(selected, start, end, "end");
}
}
})
});
</script>
</head>
<body>
<textarea id=txta class="txt">Элемент HTML представляет собой многострочный элемент управления для редактирования обычного текста, который полезен, когда вы хотите разрешить пользователям вводить значительный объем текста в произвольной форме, например комментарий к отзыву или форму обратной связи.
</textarea>
<button id=bch> Change </button>
</body>
</html>
|
| Часовой пояс GMT +3, время: 17:17. |