Auto merge of #78876 - GuillaumeGomez:better-setting-keyboard-ux, r=jyn514
Make keyboard interactions in the settings menu more pleasant #78868 improved the keyboard interactions with the settings page. This PR goes a bit further by allowing more than just "space" to toggle the checkboxes. r? `@jyn514`
This commit is contained in:
commit
0fa9d31c41
2 changed files with 63 additions and 56 deletions
|
@ -40,6 +40,29 @@ if (!DOMTokenList.prototype.remove) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Gets the human-readable string for the virtual-key code of the
|
||||||
|
// given KeyboardEvent, ev.
|
||||||
|
//
|
||||||
|
// This function is meant as a polyfill for KeyboardEvent#key,
|
||||||
|
// since it is not supported in IE 11 or Chrome for Android. We also test for
|
||||||
|
// KeyboardEvent#keyCode because the handleShortcut handler is
|
||||||
|
// also registered for the keydown event, because Blink doesn't fire
|
||||||
|
// keypress on hitting the Escape key.
|
||||||
|
//
|
||||||
|
// So I guess you could say things are getting pretty interoperable.
|
||||||
|
function getVirtualKey(ev) {
|
||||||
|
if ("key" in ev && typeof ev.key != "undefined") {
|
||||||
|
return ev.key;
|
||||||
|
}
|
||||||
|
|
||||||
|
var c = ev.charCode || ev.keyCode;
|
||||||
|
if (c == 27) {
|
||||||
|
return "Escape";
|
||||||
|
}
|
||||||
|
return String.fromCharCode(c);
|
||||||
|
}
|
||||||
|
|
||||||
function getSearchInput() {
|
function getSearchInput() {
|
||||||
return document.getElementsByClassName("search-input")[0];
|
return document.getElementsByClassName("search-input")[0];
|
||||||
}
|
}
|
||||||
|
@ -326,28 +349,6 @@ function defocusSearchBar() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gets the human-readable string for the virtual-key code of the
|
|
||||||
// given KeyboardEvent, ev.
|
|
||||||
//
|
|
||||||
// This function is meant as a polyfill for KeyboardEvent#key,
|
|
||||||
// since it is not supported in Trident. We also test for
|
|
||||||
// KeyboardEvent#keyCode because the handleShortcut handler is
|
|
||||||
// also registered for the keydown event, because Blink doesn't fire
|
|
||||||
// keypress on hitting the Escape key.
|
|
||||||
//
|
|
||||||
// So I guess you could say things are getting pretty interoperable.
|
|
||||||
function getVirtualKey(ev) {
|
|
||||||
if ("key" in ev && typeof ev.key != "undefined") {
|
|
||||||
return ev.key;
|
|
||||||
}
|
|
||||||
|
|
||||||
var c = ev.charCode || ev.keyCode;
|
|
||||||
if (c == 27) {
|
|
||||||
return "Escape";
|
|
||||||
}
|
|
||||||
return String.fromCharCode(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getHelpElement() {
|
function getHelpElement() {
|
||||||
buildHelperPopup();
|
buildHelperPopup();
|
||||||
return document.getElementById("help");
|
return document.getElementById("help");
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// Local js definitions:
|
// Local js definitions:
|
||||||
/* global getCurrentValue, updateLocalStorage, updateSystemTheme */
|
/* global getCurrentValue, getVirtualKey, updateLocalStorage, updateSystemTheme */
|
||||||
|
|
||||||
(function () {
|
(function () {
|
||||||
function changeSetting(settingName, value) {
|
function changeSetting(settingName, value) {
|
||||||
|
@ -14,16 +14,24 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setEvents() {
|
function handleKey(ev) {
|
||||||
var elems = {
|
// Don't interfere with browser shortcuts
|
||||||
toggles: document.getElementsByClassName("slider"),
|
if (ev.ctrlKey || ev.altKey || ev.metaKey) {
|
||||||
selects: document.getElementsByClassName("select-wrapper")
|
return;
|
||||||
};
|
}
|
||||||
var i;
|
switch (getVirtualKey(ev)) {
|
||||||
|
case "Enter":
|
||||||
|
case "Return":
|
||||||
|
case "Space":
|
||||||
|
ev.target.checked = !ev.target.checked;
|
||||||
|
ev.preventDefault();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (elems.toggles && elems.toggles.length > 0) {
|
function setEvents() {
|
||||||
for (i = 0; i < elems.toggles.length; ++i) {
|
onEachLazy(document.getElementsByClassName("slider"), function(elem) {
|
||||||
var toggle = elems.toggles[i].previousElementSibling;
|
var toggle = elem.previousElementSibling;
|
||||||
var settingId = toggle.id;
|
var settingId = toggle.id;
|
||||||
var settingValue = getSettingValue(settingId);
|
var settingValue = getSettingValue(settingId);
|
||||||
if (settingValue !== null) {
|
if (settingValue !== null) {
|
||||||
|
@ -32,12 +40,11 @@
|
||||||
toggle.onchange = function() {
|
toggle.onchange = function() {
|
||||||
changeSetting(this.id, this.checked);
|
changeSetting(this.id, this.checked);
|
||||||
};
|
};
|
||||||
}
|
toggle.onkeyup = handleKey;
|
||||||
}
|
toggle.onkeyrelease = handleKey;
|
||||||
|
});
|
||||||
if (elems.selects && elems.selects.length > 0) {
|
onEachLazy(document.getElementsByClassName("select-wrapper"), function(elem) {
|
||||||
for (i = 0; i < elems.selects.length; ++i) {
|
var select = elem.getElementsByTagName("select")[0];
|
||||||
var select = elems.selects[i].getElementsByTagName("select")[0];
|
|
||||||
var settingId = select.id;
|
var settingId = select.id;
|
||||||
var settingValue = getSettingValue(settingId);
|
var settingValue = getSettingValue(settingId);
|
||||||
if (settingValue !== null) {
|
if (settingValue !== null) {
|
||||||
|
@ -46,9 +53,8 @@
|
||||||
select.onchange = function() {
|
select.onchange = function() {
|
||||||
changeSetting(this.id, this.value);
|
changeSetting(this.id, this.value);
|
||||||
};
|
};
|
||||||
}
|
});
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setEvents();
|
window.addEventListener("DOMContentLoaded", setEvents);
|
||||||
})();
|
})();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue