Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629

Нужен совет по юзабилити текстового редактора

25.12.2017, 08:35. Показов 674. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
поставлена задача создать текстовое поле, в которое можно будет вводить только определённые символы, например, только цифры, а при попытке ввести что-то другое, например, букву, точку или пробел, программа должна:
1) сообщить юзеру, что он попытался ввести конкретный недопустимый символ (-ы)
2) удалить этот недопустимый символ (-ы)

* отследить ввод символов и проверить их на "допустимость" -- задача тривиальная, заключающаяся в обработке события oninput (вводить же можно не только с клавиатуры, но и способом "копи-пасте")

* удалить недопустимые символы -- тоже не проблема, метод replace () с этим легко справится

* но вот как оформить "сообщение юзеру" о том, что он пытался ввести эти самые конкретные недопустимые символы, ума не приложу -- юзер же может выделить часть уже введённого текста и заменить эту часть на находящуюся в буфере любой длины последовательность любых символов (в т.ч. и большое количество недопустимых, как идущих подряд, так и "вразнобой").

есть идеи, как это оформить "красиво"?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.12.2017, 08:35
Ответы с готовыми решениями:

Создание простого текстового редактора
Здравствуйте. Задание у меня такое: нужно создать самый простенький текстовый редактор, но есть одно условие: текстовый редактор нужно...

Переработка текстового редактора на JQUERY?
Доброго всем времени суток. Признаю честно, в работе с jquery более чем новичок. Сейчас разрабатываю форум, в котором понадобилось...

Нужен исходник текстового редактора
Собственно сабж. Спасибо!

14
566 / 465 / 183
Регистрация: 14.10.2017
Сообщений: 1,259
25.12.2017, 12:56
может так?
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var inp = document.getElementById('inp');
inp.onkeypress = (event) => {
    if(!/[\d.,]/i.test(event.key)){
        alert(event.key + ' - недопустимый символ!');
        return false;
    }
}
inp.onblur = (event) => {
    var str = inp.value;
    var mistake = '';
    var correctly = '';
    for(var i = 0; i < str.length; i++){
        if((/[\d.,]/i.test(str[i])))
            correctly += str[i];
        else
            mistake += str[i];
    }
    correctly = correctly.match(/\d+[.|,]?\d?/);
    alert('Вы ввели недопустимые символы: ' +  mistake);
    inp.value = correctly[0];
}
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
25.12.2017, 13:21  [ТС]
klopp, спасибо за предложение, однако это, во-первых, не решает задачу об указании юзеру конкретных недопустимых символов, кои он попытался ввести, и, во-вторых, вряд ли это можно назвать "красивым" решением... вот попробуйте сами вводить хоть что-нить в поле, когда ежесекундно будет выскакивать окошко алерта... гарантирую -- громко материться начнёте уже через минуту
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
25.12.2017, 13:44
К сожалению, синтаксиса JavaScript не знаю, но вот на java - настольный редактор я конструктивно решал так: пока мы вводим символы в поле, после каждого ввода идет проверка на корректность. если символ недопустимый, окрашиваем его в красный цвет (в библиотеке Swing так можно сделать). когда мы покидаем поле редактирования (уводим курсор, нажимаем какое-нибудь далее и т.д.) вывожу месседж бокс с надписью: "вы ввели не корректные символы перечисляем все красные, они будут удалены" пользователь закрывает окно, символы удаляются, в редакторе остается чистый текст.
0
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
25.12.2017, 16:37
https://codepen.io/anon/pen/zpoeqd
HTML5
1
<input id="input" placeholder="Только латинские буквы и цифры, а также символы .,!"></input>
JavaScript
1
2
3
4
5
6
7
8
input.oninput = function() {
  var arr = [];
  this.value = this.value.replace(/[^a-z0-9\.,!]/gi, function(char) {
    arr.push(char);
    return '';
  });
  if (arr.length) alert('Недопустимые символы: ' + arr.join(', '));
}
Добавлено через 7 минут
По поводу красоты - уж как-нибудь сами. Красота у каждого своя.

Добавлено через 20 минут
Лично мне пока хватает обычного span'а красного цвета под инпутом, который проявляется в случае ошибки с её текстом.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
25.12.2017, 18:00  [ТС]
Цитата Сообщение от minore Посмотреть сообщение
если символ недопустимый, окрашиваем его в красный цвет
спасибо, дельное предложение,
только есть вопрос: как "покрасить", к примеру, пробел, перевод строки или табуляцию -- все эти символы по условию задачи недопустимые

Цитата Сообщение от Balanaar Посмотреть сообщение
Лично мне пока хватает обычного span'а красного цвета под инпутом, который проявляется в случае ошибки с её текстом.
да мне тоже как бы хватает, но тут, увы, требуется иначе.
0
Эксперт JS
2463 / 1769 / 625
Регистрация: 11.07.2016
Сообщений: 4,067
25.12.2017, 18:08
Ну мы, к сожалению, не можем знать, что в вашем понимании или в понимании заказчика является красивым.
0
370 / 133 / 44
Регистрация: 05.02.2015
Сообщений: 901
25.12.2017, 19:33
"""только есть вопрос: как "покрасить", к примеру, пробел, """ не очень понимаю, чем пробел от других символов отличается. заливку как на место буквы а так и на место пробела сделать можно. будет пустое место на красном фоне и все. посмотрите, как заливка в обычном word работает.
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
25.12.2017, 21:19  [ТС]
символ красного цвета - это <font color="red">символ</font>
пробельные символы, кои я перечислил, тем и отличаются, что будь они любого цвета, они не видны
предлагаете выделять их фоном ("заливкой")? типа <span style="background-color: red"> </span>?
Хмм, это было неочевидно, потому и спросил...
0
566 / 465 / 183
Регистрация: 14.10.2017
Сообщений: 1,259
26.12.2017, 04:26
kalabuni, вроде похоже на то как вы хотите,и даже пробел и Enter обозначаются))
P.S.На всякий случай напоминаю-после ввода копипаста щелнуть в любом месте вне инпута.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
var inp = document.getElementById('inp');
var hint = document.getElementById('hint');
 
inp.onkeypress = (event) => {
    if(!/[\d.,]/i.test(event.key)){
        showHint(event.key);
        return false;
    }
}
inp.onblur = (event) => {
    var str = inp.value;
    var mistake = '';
    var correctly = '';
    for(var i = 0; i < str.length; i++){
        if((/[\d.,]/i.test(str[i])))
            correctly += str[i];
        else
            mistake += str[i];
    }
    correctly = correctly.match(/\d+[.|,]?\d?/);
    showHint(mistake);
    console.log(correctly[0]);
    inp.value = correctly[0];
}
function showHint(str) {
    hint.style.display = 'inline-block';
    if(str == ' ')
        str = 'space';
    hint.innerHTML = 'Недопустимые символы: <span class="ch">' + str + '</span><br>будут удалены';
    setTimeout(hideHint, 3000);
}
function hideHint() {
    hint.style.display = 'none';
}
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#hint {
    background: #FFE4E1;
    border-radius: 5px;
    padding: 20px;
    box-shadow: 4px 6px 8px rgba(0,0,0,.75); 
    display: none;
}
.ch {
    color: red;
    font-size: 1.5em;
    background: #AFEEEE;
    padding-left: 10px;
    padding-right: 10px;
}
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="script.js" defer></script>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <p><input type="text" id="inp" placeholder="только цифры и точка"></p>
    <p id="hint"></p>
</body>
</html>
песочница
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
26.12.2017, 22:00  [ТС]
klopp, благодарю за потраченное время, но простое перечисление недопустимых символов, особливо, если их копипастнуто много -- оно как бы не очень "красиво"
вариант, предложенный выше коллегой minore, с учётом выделения пробельных символов не цветом, а фоном -- он как бы "самое то", буду реализовывать именно его
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
27.12.2017, 01:14
На всякий случай, еще один вариант. До ума не доводил, а только постарался передать суть.
HTML+CSS
HTML5
1
2
3
4
<label>
    <input type="text" class="input"><br>
    <div class="notice"></div>
</label>
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
.notice {
    display: inline-block;
    padding: 5px;
    margin-top: 5px;
    box-shadow: 0 1px 2px 1px rgba(0, 0, 0, .3);
    font-size: 1.2rem;
    opacity: 0;
    transition: opacity .5s ease-in-out .5s;
}
 
.notice > span {
    background-color: #ddd;
    color: #f00;
}
 
.notice > span > i {
    font-size: 1.5rem;
    font-style: normal;
}
 
.notice > span > i::after {
    content: '\200B';
}
 
.show {
    opacity: 1;
    transition: opacity .5s ease-in-out 0s;
}

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const mask = /([^\d.,]+)/g,
    notice = document.querySelector('.notice');
 
document.querySelector('.input').addEventListener('input', function() {
    let str = this.value,
        match = str.match(mask);
    if (match) {
        let message = str
            .substring(
                str.indexOf(match[0]),
                str.lastIndexOf(match[match.length - 1]) + match[match.length - 1].length)
            .replace(mask, '<span>$&</span>').replace(/\s/g, "<i>␣</i>");
 
        notice.innerHTML = message;
        notice.classList.add('show');
        this.value = str.replace(mask, '');
    } else {
        notice.classList.remove('show');
    }
});
В данной реализации, я не вывожу весь текст, который мог бы быть вставлен из буфера, а только с первой позиции, где встречаются недопустимые символы, до последнего такого символа. Были бы силы, я бы немного развил тему - из найденных групп (match), захватить N символов (или слово/фразу/etc) перед и после каждой группы и вывел бы только их. Хотя, может это и лишнее.

Добавлено через 1 минуту
P.S. Парсер кода скушал символ "zero width space" в теге <i>, но в песочнице он виден.

Добавлено через 7 минут
Цитата Сообщение от Lazy_Den Посмотреть сообщение
Парсер кода скушал символ "zero width space"
Символ а-ля "spacebar", пробел я через ::after добавлял в css. Усталость сказывается.

Добавлено через 10 минут
Сейчас заметил, что в отличии от FF, Хром не переносит длинную строку. Пока идея одна - ограничить длину блока вывода, например, max-width
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 12:58  [ТС]
фантазии начальства наконец-то приобрели хоть какую-то форму, к примеру, разъяснено понятие "красота" -- необходимо сделать что-то типа "проверки правописания" в word-e: все введённые недопустимые символы должны по мере редактирования содержимого постоянно присутствовать в поле редактора, но сразу же, как только они введены, должны быть заметно выделены -- подчёркиванием или фоном

где-то под редактором должен быть чекбокс с лейблом "не отправлять с ошибками", и, если он отмечен, то по нажатию кнопки "Отправить" все выделенные ранее символы должны быть удалены; если не отмечен, то текстовое содержимое редактора должно отправляться as is

в общем, это явно должен быть контейнер с contenEditable=true (или ифрейм с document.designMode = true)

срок мне установили "к 23 февраля", результатом, если он будет, похвастаюсь
0
 Аватар для Lazy_Den
3325 / 2845 / 1423
Регистрация: 15.01.2014
Сообщений: 6,170
27.12.2017, 13:01
Цитата Сообщение от kalabuni Посмотреть сообщение
в поле редактора ... должны быть заметно выделены
Если в самом поле ввода, то задача сводится к решению, которое используется большинством WUCIWUG-редакторов - некий элемент с атрибутом contenteditable="true" и стилизованный под <textarea>. В остальном, после уточнений начальства, я думаю, что сторонняя помощь вам уже не потребуется.

Добавлено через 1 минуту
Упс... Пока писал, вы уже сами расставили точки над "I"
0
супермизантроп
Эксперт JS
3941 / 2979 / 692
Регистрация: 18.04.2012
Сообщений: 8,629
27.12.2017, 13:47  [ТС]
Цитата Сообщение от Lazy_Den Посмотреть сообщение
уже сами расставили точки над "I"
ага, только напутал с designMode, его значение должно быть "on", работал с этим делом раз в жизни, потому забыл
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.12.2017, 13:47
Помогаю со студенческими работами здесь

Нужен совет-какой язык програмирования лучше использовать для написания программы-редактора?
Привет всем! Мне нужен совет в следующем вопросе:Я занимаюсь моддингом игры Mafia The City of Lost Heaven. Данная игра имеет свой язык...

Заполнение БД из текстового файла. Нужен совет!!!
Привет! Столкнулась с проблемкой: Имеется приложение на Builder, БД - Access, связь через ADO. Не могу сделать заполнение таблицы...

Совет по созданию графического редактора
Доброго времени суток! Я создаю графический редактор. Говоря конкретно мини-САПР. Я бы очень хотел узнать, а что Вы посоветуете...

Разработка текстового редактора
Для того чтобы изучить основы синтаксиса С# хочу разработать текстовый редактор пок. Расскажите как разработать данный текстовый редактор,...

Создание текстового редактора
Требуется создать текстовый редактор в паскале. Меню есть, но при попытке открыть текстовый файл или создать его вылетает exitcode 201....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru