Я создал виртуальный каталог, в котором пользователи могут изменять имена файлов/каталогов.
Имена можно изменить только двойным щелчком мыши:
<input type = "text"
class = "form-control border-0 p-0 mb-1"
onblur = "this.readOnly='true';"
readonly = "true"
ondblclick = "handleDbClick(this)"
onkeydown = "handleEnter(event, this)"
value = "{{ dict.directory.current_name }}" />
но если я один раз нажму на поле ввода, вокруг ввода все равно будет свечение:
Я хочу добиться, чтобы синее свечение появлялось только при двойном щелчке по входу, когда оно доступно для редактирования.
Вы можете добавить класс, который отключает стиль (тень поля, когда ввод сфокусирован):
.nofocus:focus {
box-shadow:none;
}
а затем в обработчиках событий включите стиль, удалив класс и добавив его.
Например, добавьте его в обработчик двойного щелчка.
el.classList.remove('nofocus');
и удалите его при нажатии клавиши ввода в обработчике нажатия клавиш
if (evt.keyCode === 13) el.classList.add('nofocus');
и расширьте обработчик размытия, чтобы переключить его (вы также можете добавить переменную isEditing
, которая будет хранить состояние ввода и предотвращать скрытие, если ввод редактируется, в зависимости от логики вашего рабочего процесса).
if (!el.classList.contains('nofocus')) el.classList.add('nofocus');
демо:
.as-console-wrapper { max-height: 10% !important; bottom: 0; }
<!doctype html>
<html lang = "en">
<head>
<meta charset = "utf-8">
<meta name = "viewport" content = "width=device-width, initial-scale=1">
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet">
<title>Bootstrap Example</title>
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
<style>
.nofocus:focus {
box-shadow:none;
}
</style>
</head>
<body class = "p-3 m-0 border-0 bd-example m-0 border-0">
<input type = "text"
class = "form-control border-0 p-0 mb-1 nofocus"
onblur = "handleBlur(this)"
readonly = "true"
ondblclick = "handleDbClick(this)"
onkeydown = "handleEnter(event, this)"
value = "{{ dict.directory.current_name }}" />
<script>
let isEditing = false;
function handleBlur(el) {
console.info('handleBlur');
if (!isEditing) {
if (!el.classList.contains('nofocus')) {
el.classList.add('nofocus');
el.readOnly = 'true';
}
} else {
el.focus();
}
}
function handleEnter(evt, el) {
if (!isEditing) return;
console.info('handleEnter');
el.removeAttribute('readonly');
if (evt.keyCode === 13) {
el.classList.add('nofocus');
el.readOnly = 'true';
isEditing = false;
}
}
function handleDbClick(el) {
isEditing = true;
console.info('handleDbClick');
el.classList.remove('nofocus');
}
</script>
</body>
</html>
О, спасибо, это именно то, что я искал. Я думал, это какая-то приграничная собственность. Спасибо!