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

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

25.12.2017, 08:35. Показов 701. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru