Показать сообщение отдельно
  #17 (permalink)  
Старый 04.11.2018, 08:30
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Если использовать стандартное сочетание Command-Z, то оно откатит вас к состоянию, когда вы сфокусировались на элементе. Command-Shift-Z возвратит к исходному. Чтобы это происходило по одному символу, нужно потерять и сразу возвратить фокус. Но действительно ли это нужно? Я считаю, что это усложнение. Мне показалось, что по словам лучше, наверное для разных целей подойдёт разный откат.

<button onclick="document.execCommand('undo')">Отменить</button>
<button onclick="document.execCommand('redo')">Возвратить</button>
<p>
  <textarea oninput="" placeholder="Стандартный откат"></textarea>
  <textarea oninput="this.blur();this.focus();" placeholder="по одному символу"></textarea>
  <textarea oninput="if(/[\s,.!?]/.test(event.data)) { this.blur();this.focus(); }" placeholder="по слову"></textarea>
</p>


Кнопки должны быть рядом с текстовым полем, или более точней они должны быть в поле видимости, ведь во время отката, фокус может переместиться с кнопки на элемент, а на планшете или телефоне нет возможности нажать Command-Z. Я к тому, что на сенсорных устройствах может не быть возможности совершить такой откат, кроме того, чтобы нажать на нашу придуманную кнопку.

Сообщение от MC-XOBAHCK
часто здесь и в учебнике вижу в коде как дом-элементы по id пишут в короткой форме
В стандарте HTML 5.2 о поимённом доступе к элементам сказано:

Цитата:
Возвращает указанный элемент или коллекцию элементов.
Как правило, полагаясь на это, вы получите ломающийся код. То, какие идентификаторы перестанут подходить к этому API, может меняться со временем, так как, например, новые функции добавляются к веб-платформе. Вместо этого используйте document.getElementById() или document.querySelector ().
Например, если у вашего элемента идентификатор alert, то он не может быть получен при помощи этого API, поскольку функция с соответствующим именем уже определена в глобальном контексте. (alert-у присвоена именно функция)

Важно понимать, что это происходит именно из-за того, что идентификаторы в глобальном контексте используются, где может произойти конфликт с другими, уже назначенными свойствами объекта window.

Конечно это можно исправить...
for(const element of document.querySelectorAll("[id]")) {
	window[element.id] = element;
}

Но лучше поимённый доступ к элементам сделать не через глобальный объект, а через свой. И даже гарантированно будет работать
Сообщение от j0hnik
в боевом коде
const $ = {};

for(const element of document.querySelectorAll("[id]")) {
	$[element.id] = element;
}

// пример
$.zzz.onclick = e => document.execCommand('undo');
$.yyy.onclick = e => document.execCommand('redo');
Правда, классно?

Или даже так...
const $ = new Proxy({}, { get(_, id) { return document.getElementById(id) } });

// пример
$.zzz.onclick = e => document.execCommand('undo');
$.yyy.onclick = e => document.execCommand('redo');

Вообще супер, правда?

Последний раз редактировалось Malleys, 04.11.2018 в 10:03. Причина: 1. Кнопки должны быть в поле видимости 2. Поимённый доступ к элементам
Ответить с цитированием