- From: Yoshifumi Inoue <yosin@chromium.org>
- Date: Wed, 18 Jun 2014 11:31:08 +0900
- To: Ben Peters <Ben.Peters@microsoft.com>
- Cc: "public-webapps@w3.org" <public-webapps@w3.org>
- Message-ID: <CABJ-EHPqwY0dgu6WeXY6g3Ryy-d-kH2UJmHU27etzco9Fnnx7g@mail.gmail.com>
For overriding keyboard shortcut, how about exposing browser's key binding map as API rather than handling keyboard event? Example: window.keymap['Ctrl+B'] = function() { document.execCommand('backcolor'); } window.keymap also contains "accesskey". So, editor library can notify or avoid overriding page defined shortcut // This can be done by document.querySelectorAll(*[accesskey]) though. -yosi On Wed, Jun 18, 2014 at 10:08 AM, Ben Peters <Ben.Peters@microsoft.com> wrote: > I think the issue of using execCommand and the issue of re-entrant > Command events can be solved at the same time. To that end I have updated > the image [1] in the commands explainer document to better facilitate > conversation, and presented some new ideas below. > > > > > > Previous Design (for context): > > We had said that in order to change a default behavior for a keyboard > shortcut, a site would intercept that shortcut’s keyboard event, call > preventDefault, and then call execCommand() with the new intention. For > instance, to change control+b from bold to back-color, a site or framework > could do this: > > > > function handleKeydown(evt) { > > if (evt.key == “b” && evt.ctrlKey) { > > document.execCommand(‘backcolor’, false, ‘blue’); // > causes command event type backcolor > > evt.preventDefault; //stops default command event type bold > > } > > > > Declaring user intentions: > > Instead of execCommand, we could find another way to declare user > intentions (shown in the image [1] upper right). To change a keyboard > shortcut we could have a new property, say KeyboardEvent.intention. It > could be initialized if a CommandEvent would normally fire, like bold on > control+b. And it could be modified like this: > > > > function handleKeydown(evt) { > > if (evt.key == “b” && evt.ctrlKey) { > > evt.intention=‘backcolor’; // causes command event type > backcolor and stops default command event type bold > > > > } > > > > For buttons we could do the following, which would cause a CommandEvent to > fire when the button is activated. > > > > <input type=”button” command=”bold” value=”b”> > > > > Another option would be a series of methods like those suggested > previously [2], such as window.clipboard.copy causing a copy IntentionEvent > (ClipboardEvent) and document.getSelection().modify causing a > BeforeSelectionChange Intention event. > > > > > > Using execCommand to actually execute a command: > > This means execCommand is available for other uses. Since it’s a legacy > API that doesn’t have the best shape, perhaps it is best to tie it to the > legacy behavior. So the image [1] now shows that execCommand (lower right) > would cause the browser to actually perform the command, not fire a > CommandEvent. In effect, execCommand(‘bold’) is the default behavior for > CommandEvent type bold in contentEditable=”true”. In > contentEditable=”minimal” or equivalent, CommandEvent type bold has no > default. If a site wishes to use the built-in bold, they can call > execCommand(‘bold’) in the CommandEvent, thereby restoring > contentEditable=”true” behavior for that specific command. > > > > This further solves the problem of re-entrant commands. execCommand > doesn’t fire CommandEvents, so calling execCommand inside CommandEvent is > fine. > > > > Thoughts? > > > > [1] > http://w3c.github.io/editing-explainer/commands-explainer.html#overview > > [2] > http://lists.w3.org/Archives/Public/public-webapps/2014AprJun/0601.html > > > > Ben >
Received on Wednesday, 18 June 2014 02:31:36 UTC