bunda1
Не, в старом варианте я что-то ковырял, но там почти ничего не работало и понять что на что влияет - не представлялось возможным. А щас мне гемороя со своей хватает. Пока даже не смотрел ничего, кроме опций в менюшке.
Отсутствует
Dumby
И почему
mItem.setAttribute('oncommand', 'if (event.shiftKey) {event.preventDefault(); event.stopPropagation(); custombuttons.clearPrefs("' + m.pref + '")};' + browserRestart);
- на menu не срабатывает? Первое нажатие комбинации клавиш все-равно субменю открывает...
Отредактировано turbot (26-04-2016 03:54:16)
Отсутствует
Dumby
Всем устраивает, кроме того, что я о нем не знал. Спасибо.
И главное, как быть со вторым вопросом? Что первая команда на пункте типа menu - открывает его субменю? и preventDefault не помогает. Может есть еще какой волшебный атрибут?
Dumby
Если я вас уже этой ерундой и своей тупостью утомил, вы прямо скажите. Я не обижусь. Честно. Буду сам ковырять, потихоньку.
Отсутствует
Если я вас уже этой ерундой и своей тупостью утомил
Вовсе нет. Нисколько.
И главное, как быть со вторым вопросом? Что первая команда на пункте типа menu - открывает его субменю? и preventDefault не помогает.
Так у <menu>, как такового, вроде же нет события command.
А, кстати, почему ты не хочешь чтобы некая «первая команда» открывала субменю?
Если я меняю листенер на command, то не обрабатывается contextmenu
Ага, предлагаешь опять угадать что, как и где ты меняешь?
И вообще, - будь ты проще. Оставь пока в покое свою кнопку.
Сделай себе другую, какую-нибудь максимально простую болванку.
Закодируй в ней что требуется по принципу «как слышица, так и пишица».
И возись уже с ней, до полной ясности.
Вот, например, попробуй понажимать такую.
И если у тебя на клавиатуре есть клавиша,
(не знаю как её назвать, но эта та, которая 93 KeyboardEvent.DOM_VK_CONTEXT_MENU)
то и её тоже понажимай.
var data = [ "foo", , {"bar": [ "sub1", "sub2", "sub3" ]}, "baz" ]; var popup = this.appendChild(document.createElement("menupopup")); popup.setAttribute("position", "after_start"); popup.setAttribute("oncommand", "parentNode.bla(event);"); popup.setAttribute("oncontextmenu", "event.preventDefault(); parentNode.bla(event);"); for(var item of data) { if (!item) popup.appendChild(document.createElement("menuseparator")); else if (typeof item == "string") { var menuitem = popup.appendChild(document.createElement("menuitem")); menuitem.setAttribute("closemenu", "none"); menuitem.setAttribute("label", item); } else { var [str] = Object.keys(item); var menu = popup.appendChild(document.createElement("menu")); menu.setAttribute("label", str); var subPopup = menu.appendChild(document.createElement("menupopup")); for(var subitem of item[str]) { var menuitem = subPopup.appendChild(document.createElement("menuitem")); menuitem.setAttribute("closemenu", "none"); menuitem.setAttribute("label", subitem); } } } this._handleClick = () => popup.openPopup(this); this.bla = e => { if ("busy" in this) return; this.busy = true; var {target} = e, {label} = target; target.label = label + " " + e.type; target.style.cssText = "color: red !important; font-weight: bold !important;"; setTimeout(() => { target.label = label; target.removeAttribute("style"); delete this.busy; }, 700); }
Отредактировано Dumby (26-04-2016 15:04:39)
Отсутствует
Dumby
Оставь пока в покое свою кнопку.
Мне бы только домучать работу с клавиатуры, а дальше уже сам буду, потихоньку, в человеческий вид ее переписывать.
Ага, предлагаешь опять угадать что, как и где ты меняешь?
Виноват. Я про то, что добавил сброс значений с модификатором shift, но если с менюитемами нет проблем, то первый shift+enter на меню - всегда раскрывает их субменю. Т.е., я понял почему там preventDefault на oncommand не работает, спасибо, но может можно для этих меню вообще отрубить открытие субменю по enter'у, а лучше по shift+enter? Благо, стрелками открыть можно. Или это можно сделать, только если еще один листенер вешать? Да и какой? Я пробовал и keydown и keyup и keypress...
то и её тоже понажимай.
Угу, спасибо. Не подумал об этом. Это, конечно, вариант, вот только
если у тебя на клавиатуре есть клавиша
... Если уж делать, хотелось бы найти вариант без "если".
Черт, как же мой, в мучения выношенный, выкидыш жутко смотрится рядом твоей "напобаловаця"... Но я своего все равно люблю!
P.S.: Да, я смотрю, KeyboardEvent.keyCode как deprecated помечен? А в остальных нет независящих от платформы кодов для клавиш? Или плохо смотрел?
Отсутствует
может можно для этих меню вообще отрубить открытие субменю по enter'у, а лучше по shift+enter? Благо, стрелками открыть можно. Или это можно сделать, только если еще один листенер вешать? Да и какой? Я пробовал и keydown и keyup и keypress...
Что-то мне это тоже на башку не налазит. Может так попробуй .
var data = [ "foo", , {"bar": [ "sub1", "sub2", "sub3" ]}, "baz" ]; var popup = this.appendChild(document.createElement("menupopup")); popup.setAttribute("position", "after_start"); popup.setAttribute("oncommand", "parentNode.bla(event);"); popup.setAttribute("oncontextmenu", "event.preventDefault(); parentNode.bla(event);"); for(var item of data) { if (!item) popup.appendChild(document.createElement("menuseparator")); else if (typeof item == "string") { var menuitem = popup.appendChild(document.createElement("menuitem")); menuitem.setAttribute("closemenu", "none"); menuitem.setAttribute("label", item); } else { var [str] = Object.keys(item); var menu = popup.appendChild(document.createElement("menu")); menu.setAttribute("label", str); var subPopup = menu.appendChild(document.createElement("menupopup")); for(var subitem of item[str]) { var menuitem = subPopup.appendChild(document.createElement("menuitem")); menuitem.setAttribute("closemenu", "none"); menuitem.setAttribute("label", subitem); } } } this._handleClick = () => popup.openPopup(this); this.bla = e => { if ("busy" in this) return; this.busy = true; var {target} = e, {label} = target; var action = e.type == "contextmenu" || e.shiftKey ? "RESET" : "set"; target.label = label + " " + action; target.style.cssText = "color: red !important; font-weight: bold !important;"; setTimeout(() => { target.label = label; target.removeAttribute("style"); delete this.busy; }, 700); } var keyListener = { get data() { delete this.data; return this.data = "code" in KeyboardEvent.prototype ? {key: "code", val: "Enter"} : {key: "keyCode", val: KeyboardEvent.DOM_VK_RETURN}; }, handleEvent: function(e) { this[e.type](e); }, popupshown: function(e) { if (e.target != popup) return; popup.addEventListener("popuphidden", this, false); window.addEventListener("keydown", this, true); }, popuphidden: function(e) { if (e.target != popup) return; popup.removeEventListener("popuphidden", this, false); window.removeEventListener("keydown", this, true); }, keydown: function(e) { if (e.shiftKey && !e.ctrlKey && !e.altKey && e[this.data.key] == this.data.val) { var target = popup.querySelector("menu[_moz-menuactive]:not([open])"); if (!target) return; var {firstChild} = target; firstChild.remove(); setTimeout(() => target.appendChild(firstChild), 0); self.bla({target: target, type: "command", shiftKey: true}); } } }; addEventListener("popupshown", keyListener, false, popup);
Отредактировано Dumby (27-04-2016 07:37:01)
Отсутствует
Dumby
Хех, спасибо, впечатляет. Вот только я не потяну такое в свою кнопку запихнуть.
В общем, решил пока обойтись тем, что есть. Последняя просьба (клянусь): не подскажешь, как клавиша DOM_VK_CONTEXT_MENU по правильному называется, чтобы в описании указать. Не могу нагуглить.
Отсутствует
не подскажешь, как клавиша DOM_VK_CONTEXT_MENU по правильному называется
Нет, к сожалению, не смогу подсказать, не знаю как правильно её назвать.
В общем, решил пока обойтись тем, что есть.
Что-то не могу сообразить, а как собственно сам #quick-aboutconfig-menupopup
у тебя с клавиатуры открывается. В Инициализации, вроде, нет для этого специального кода.
И во вкладке Код нет строки для поддержки стандартного CB сочетания клавиш.
Вот только я не потяну такое в свою кнопку запихнуть.
Это не так сложно, как кажется. Можно ничего в твоём коде не менять,
а просто попробовать добавить в конец что-нибудь типа
addEventListener("popupshown", { handleEvent: function(e) { this[e.type](e); }, popupshown: function(e) { if (e.target != menuPopup) return; menuPopup.addEventListener("popuphidden", this, false); window.addEventListener("keydown", this, true); }, popuphidden: function(e) { if (e.target != menuPopup) return; menuPopup.removeEventListener("popuphidden", this, false); window.removeEventListener("keydown", this, true); }, popupshowing: function(e) { e.target.parentNode.removeEventListener("popupshowing", this, false); e.preventDefault(); }, get old() { delete this.old; this.e = new MouseEvent("contextmenu", {}); return this.old = parseInt(Services.appinfo.platformVersion) < 25; }, get prop() { delete this.prop; if ("key" in KeyboardEvent.prototype) this.prop = "key", this.val = "Enter"; else this.prop = "keyCode", this.val = KeyboardEvent.DOM_VK_RETURN; return this.prop; }, keydown: function(e) { if (!e.shiftKey || e.ctrlKey || e.altKey || e[this.prop] != this.val) return; var target = menuPopup.querySelector("menu[_moz-menuactive]:not([open])"); if (!target) return; this.old ? target.addEventListener("popupshowing", this, false) : e.stopPropagation(); target.dispatchEvent(this.e); menuPopup.dispatchEvent(this.e); } }, false, menuPopup);
Отсутствует
Dumby
Спасибо.
а как собственно сам #quick-aboutconfig-menupopup
у тебя с клавиатуры открывается
Забыл вставить листенер. Добавил.
Фух, на этом успокоюсь пока. Не слишком монструозно получилось? Или не стоит успокаиваться и надо переделывать под обсерверы?
Отсутствует
Забыл вставить листенер. Добавил.
А чем обусловлен именно такой выбор EventTarget'а?
То есть, если фокус вне gBrowser'а (например, в адресной строке),
то листенер срабатывать не должен?
Отсутствует
Хотя, может так и лучше?
А вот прояви воображение, примерь ситуацию на себя.
Тебе бы так было лучше, или тебе так было бы не лучше.
А к чему тогда его присобачить?
Ну, предположу, что присобачить к window, и ещё, возможно,
на всякий случай, добавить проверку других модификаторов,
в том смысле, что именно Alt+M, а не какой-нибудь Ctrl+Alt+M.
Отсутствует
Примерил. Раз фокус со строки не убирается, при открытии менюшки, то хуже точно не станет. Сделаю.
в том смысле, что именно Alt+M, а не какой-нибудь Ctrl+Alt+M.
Понял. Сделаю. Спасибо. (Хотя у меня ж на keyup повешен - разве нужно?) хех, проверил, нужно.
Отредактировано turbot (02-05-2016 00:51:22)
Отсутствует
Не могу понять.
Вчера document.activeElement.tagName и document.activeElement.nodeName возвращали мне xul:browser (это если просто кликнуто на странице).
А сегодня в обоих случаях возвращает просто browser.
Вроде ничего не менял. В чем тут прикол?
Отсутствует
Dumby
Да, точно! Именно так и получилось
Отсутствует
// полноценная строка поиска function onFind() { gFindBar.onFindCommand(); setTimeout(()=> gFindBar._findField.selectionStart = 2, 0) }; messageManager.addMessageListener("Findbar:Keypress", onFind); addDestructor(()=> messageManager.removeMessageListener("Findbar:Keypress", onFind));
Как исправить код, чтобы он не реагировал на клавиши верх/вниз/влево/вправо, ентер и пробел?
Отредактировано KOT040188 (18-06-2016 16:32:30)
Вы думаете у котов лёгкая жизнь? А вы попробуйте целый день лизать меховую шапку!
Отсутствует
Подскажите,а не существует ли кнопки,которая может заменить Tab History Menu ?
Отсутствует
Отсутствует