阅读:3942回复:9
UndoCloseTabBtn.uc.js和KeyChanger.uc.js问题
@lonely_8
1、UndoCloseTabBtn.uc.js 65时候你有改过,后来68又有小变化,我简单改了下也能凑活用。但是我一直想问,为什么第二个窗口列表就是空的?能不能改成显示当前窗口已关闭的标签? // ==UserScript== // @Name UndoCloseTabBtn.uc.js // @namespace UndoCloseTab@gmail.com // @description 可移动恢复已关闭标签按钮 // @author defpt // @charset UTF-8 // @Compatibility FF69+ // @version v2018.12.05 更新兼容65+ by lonely_8 // @version v2018.04.04 更新兼容57+ by runningcheese // @version v2014.09.15 // ==/UserScript== (function() { if(document.getElementById('undoclosetab-button')) return; CustomizableUI.createWidget({ id: 'undoclosetab-button', label: '恢复最后关闭的标签', tooltiptext: '左键:恢复最后关闭的标签\n右键:显示关闭标签菜单', defaultArea : CustomizableUI.AREA_NAVBAR, onCreated: (uCTBtn) => { uCTBtn.setAttribute('context', '_child'); //点击按钮恢复最后一次关闭的标签 //如果想左键恢复最后一次关闭的标签,右键打开已关闭标签列表,那么改为(context: "_child",) //如果想改成菜单形式的,那么改为(type: "menu-button",) uCTBtn.setAttribute('command', 'History:UndoCloseTab'); uCTBtn.appendChild($C('menupopup', { oncommand: 'event.stopPropagation();', onpopupshowing: 'this.parentNode.populateUndoSubmenu();', context: '', tooltip: 'bhTooltip', popupsinherittooltip: 'true' })); uCTBtn._getClosedTabCount = HistoryMenu.prototype._getClosedTabCount; uCTBtn.populateUndoSubmenu = eval('(' + HistoryMenu.prototype.populateUndoSubmenu.toString().replace(/\.undoTabMenu/g, '').replace(/\.menupopup/g, '.firstChild') + ')'); } }); document.insertBefore(document.createProcessingInstruction( 'xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent('\ #undoclosetab-button menuitem {max-width: 240px;}\ #undoclosetab-button .toolbarbutton-icon {list-style-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABuUlEQVRIib2VL08DQRDFKxANqahErijJte/N5pI2oQlNuA+AqEBUkHAJAkMIAhJERYNBICr4ABUIFKlEIBA4DAJRgUBUIJpgKioqitkry8H9CxcmmeQutzu/eTO5mULhP4xkA0Ar6ruIOCR3SZ4A6JrnRhaAR3JqQ5RSRQDHJMckFxE+JtlzXbccCwDQMRemAFpaa5J8jQkc9ncRaccBfOvw1HjwPhORvjnTAFAB0BGRfkjdXEQOo2rs/5YZgIGIbEUlJiKOAc3MnQ8Ae0kKlvUFsBZb2y9Qm+Tc3Jv86AnJo4ja3lar1fU0EJKXlvLz8MdeTAOHnuetJAFc1y1bPZlkASwAXKVU0bPuuN/ojuOoOE+jAsCOBfDTJJXJarXahqX8NHeA+UEDBd3cASJyYCnYzx0AYBAAtNbNvINvknwxgKd6vb6aK4DkfZB95EyysimJyBmAUprgZkcEwe+SDq8FUgG8kfSizppF9Gg1dpI4vwBUSI7sMUzy2YzsjvELkkNrwAVjfjuN4mCu3GRYOCOtNVMFD6lpkbwOLaDlIiL5AMBPM0ZiTSlVNPX2SHpa66ZSqvinoHnZJ3jLDwknYoRNAAAAAElFTkSuQmCC")}\ ') + '"'), document.documentElement); function $C(name, attr) { var el = document.createXULElement(name); if (attr) Object.keys(attr).forEach(function(n) { return el.setAttribute(n, attr[n]);}); return el; } })(); 2、KeyChanger.uc.js经过多人修改和我自己瞎改后74还能凑活用,但是71开始无法覆盖浏览器默认快捷键了,比如F5/F6/CTRL+E之类的快捷键,怎么解决? _keychanger.js keys['Alt+E'] = "undoCloseTab();"修复后脚本: KeyChanger74+.uc.rar |
|
1楼#
发布于:2020-03-13 15:41
// ==UserScript== // @Name UndoCloseTabBtn.uc.js // @namespace UndoCloseTab@gmail.com // @description 可移动恢复已关闭标签按钮 // @author defpt // @charset UTF-8 // @Compatibility FF69+ // @version v2018.12.05 更新兼容65+ by lonely_8 // @version v2018.04.04 更新兼容57+ by runningcheese // @version v2014.09.15 // ==/UserScript== (function() { if(!document.getElementById('undoclosetab-button')) { CustomizableUI.createWidget({ id: 'undoclosetab-button', label: '恢复最后关闭的标签', tooltiptext: '左键:恢复最后关闭的标签\n右键:显示关闭标签菜单', defaultArea : CustomizableUI.AREA_NAVBAR, onCreated: (uCTBtn) => { uCTBtn.setAttribute('context', '_child'); //点击按钮恢复最后一次关闭的标签 //如果想左键恢复最后一次关闭的标签,右键打开已关闭标签列表,那么改为(context: "_child",) //如果想改成菜单形式的,那么改为(type: "menu-button",) uCTBtn.setAttribute('command', 'History:UndoCloseTab'); uCTBtn.appendChild($C('menupopup', { oncommand: 'event.stopPropagation();', onpopupshowing: 'this.parentNode.populateUndoSubmenu();', context: '', tooltip: 'bhTooltip', popupsinherittooltip: 'true' }, uCTBtn.ownerDocument)); uCTBtn._getClosedTabCount = HistoryMenu.prototype._getClosedTabCount; uCTBtn.populateUndoSubmenu = eval('(' + HistoryMenu.prototype.populateUndoSubmenu.toString().replace('window', 'this.ownerGlobal').replace(/\.undoTabMenu/g, '').replace(/\.menupopup/g, '.firstChild') + ')'); } }); } document.insertBefore(document.createProcessingInstruction( 'xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent('\ #undoclosetab-button menuitem {max-width: 240px;}\ #undoclosetab-button .toolbarbutton-icon {list-style-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAABuUlEQVRIib2VL08DQRDFKxANqahErijJte/N5pI2oQlNuA+AqEBUkHAJAkMIAhJERYNBICr4ABUIFKlEIBA4DAJRgUBUIJpgKioqitkry8H9CxcmmeQutzu/eTO5mULhP4xkA0Ar6ruIOCR3SZ4A6JrnRhaAR3JqQ5RSRQDHJMckFxE+JtlzXbccCwDQMRemAFpaa5J8jQkc9ncRaccBfOvw1HjwPhORvjnTAFAB0BGRfkjdXEQOo2rs/5YZgIGIbEUlJiKOAc3MnQ8Ae0kKlvUFsBZb2y9Qm+Tc3Jv86AnJo4ja3lar1fU0EJKXlvLz8MdeTAOHnuetJAFc1y1bPZlkASwAXKVU0bPuuN/ojuOoOE+jAsCOBfDTJJXJarXahqX8NHeA+UEDBd3cASJyYCnYzx0AYBAAtNbNvINvknwxgKd6vb6aK4DkfZB95EyysimJyBmAUprgZkcEwe+SDq8FUgG8kfSizppF9Gg1dpI4vwBUSI7sMUzy2YzsjvELkkNrwAVjfjuN4mCu3GRYOCOtNVMFD6lpkbwOLaDlIiL5AMBPM0ZiTSlVNPX2SHpa66ZSqvinoHnZJ3jLDwknYoRNAAAAAElFTkSuQmCC")}\ ') + '"'), document.documentElement); function $C(name, attr, doc) { var el = (doc || document).createXULElement(name); if (attr) Object.keys(attr).forEach(function(n) { return el.setAttribute(n, attr[n]);}); return el; } })(); KeyChanger.uc.js 脚本 Array.prototype.slice 改为 Array.prototype.slice.call 至于有些快捷键无法覆盖的原因是,这些快捷键是通过 js 动态侦听按键事件实现的,自由度比较高,但很难控制。 而 KeyChanger 通过添加 dom 节点,再由浏览器调用某一接口间接实现,通用性较强,但优先度也比较低。 |
|
2楼#
发布于:2020-03-13 22:14
|
|
3楼#
发布于:2020-03-14 01:03
|
|
4楼#
发布于:2020-03-15 02:29
这个可以正常使用。
// ==UserScript== // @name KeyChanger.uc.js // @author Griever // @namespace http://d.hatena.ne.jp/Griever/ // @include main // @description 为火狐添额外的快捷键 // @license MIT License // @charset UTF-8 // @version 2019.09.18.1 // @note 0.0.2 メニューを右クリックで設定ファイルを開けるようにした // @note 0.0.2 Meta キーを装飾キーに使えるようになったかもしれない(未テスト) // @note 0.0.2 Windows キーを装飾キーに使えるようになったかもしれない(未テスト Firefox 17 以降) // @note 2018.1.25.2 Firefox59+ 修复 // ==/UserScript== location.href.startsWith('chrome://browser/content/browser.x') && (function () { var useScraptchpad = true; // 如果不存在编辑器,则使用代码片段速记器,否则设置编辑器路径 //let {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components; window.KeyChanger = { get file() { var aFile = FileUtils.getFile("UChrm", ["local", "_keychanger.js"], false); if (!aFile.exists()) { saveFile(aFile, ''); alert('_keychanger配置为空,该文件在local目录下'); } delete this.file; return this.file = aFile; }, get FILE() { return this.file; }, isBuilding: false, makeKeyset: function (isAlert) { KeyChanger.isBuilding = true; var s = new Date(); var keys = this.makeKeys(); if (!keys) { isBuilding = false; return this.alert('KeyChanger', 'Load error.'); } var keyset = document.getElementById('keychanger-keyset'); if (keyset) keyset.parentNode.removeChild(keyset); keyset = document.createXULElement('keyset'); keyset.setAttribute('id', 'keychanger-keyset'); keyset.appendChild(keys); var df = document.createDocumentFragment(); Array.prototype.slice(document.getElementsByTagName('keyset')).forEach(function (elem) { df.appendChild(elem); }); var insPos = document.getElementById('mainPopupSet'); insPos.parentNode.insertBefore(keyset, insPos); insPos.parentNode.insertBefore(df, insPos); var e = new Date() - s; if (isAlert) { this.alert('KeyChanger: Loaded', e + 'ms'); } setTimeout(function () { KeyChanger.isBuilding = false; }, 100); }, makeKeys: function () { var str = this.loadText(this.file); if (!str) return null; var sandbox = new Components.utils.Sandbox(new XPCNativeWrapper(window)); var keys = Components.utils.evalInSandbox('var keys = {};\n' + str + ';\nkeys;', sandbox); if (!keys) return null; var dFrag = document.createDocumentFragment(); Object.keys(keys).forEach(function (n) { let keyString = n.toUpperCase().split("+"); let modifiers = "", key, keycode, k; for (let i = 0, l = keyString.length; i < l; i++) { k = keyString[i]; switch (k) { case "CTRL": case "CONTROL": case "ACCEL": modifiers += "accel,"; break; case "SHIFT": modifiers += "shift,"; break; case "ALT": case "OPTION": modifiers += "alt,"; break; case "META": case "COMMAND": modifiers += "meta,"; break; case "OS": case "WIN": case "WINDOWS": case "HYPER": case "SUPER": modifiers += "os,"; break; case "": key = "+"; break; case "BACKSPACE": case "BKSP": case "BS": keycode = "VK_BACK"; break; case "RET": case "ENTER": keycode = "VK_RETURN"; break; case "ESC": keycode = "VK_ESCAPE"; break; case "PAGEUP": case "PAGE UP": case "PGUP": case "PUP": keycode = "VK_PAGE_UP"; break; case "PAGEDOWN": case "PAGE DOWN": case "PGDN": case "PDN": keycode = "VK_PAGE_DOWN"; break; case "TOP": keycode = "VK_UP"; break; case "BOTTOM": keycode = "VK_DOWN"; break; case "INS": keycode = "VK_INSERT"; break; case "DEL": keycode = "VK_DELETE"; break; default: if (k.length === 1) { key = k; } else if (k.indexOf("VK_") === -1) { keycode = "VK_" + k; } else { keycode = k; } break; } } let elem = document.createXULElement('key'); if (modifiers !== '') elem.setAttribute('modifiers', modifiers.slice(0, -1)); if (key) elem.setAttribute('key', key); else if (keycode) elem.setAttribute('keycode', keycode); let cmd = keys[n]; switch (typeof cmd) { case 'function': elem.setAttribute('oncommand', '(' + cmd.toString() + ').call(this, event);'); break; case 'object': Object.keys(cmd).forEach(function (a) { elem.setAttribute(a, cmd[a]); }, this); break; default: elem.setAttribute('oncommand', cmd); } dFrag.appendChild(elem); }, this); return dFrag; }, createMenuitem: function () { var menuitem = document.createXULElement('menuitem'); menuitem.setAttribute('id', 'toolsbar_KeyChanger_rebuild'); menuitem.setAttribute('label', 'KeyChanger'); menuitem.setAttribute('tooltiptext', '左键:重载配置\n右键:编辑配置'); menuitem.setAttribute('oncommand', 'setTimeout(function(){ KeyChanger.makeKeyset(true); }, 10);'); menuitem.setAttribute('onclick', 'if (event.button == 2) { event.preventDefault();KeyChanger.edit(KeyChanger.file); }'); var insPos = document.getElementById('devToolsSeparator'); insPos.parentNode.insertBefore(menuitem, insPos); }, loadText: function (aFile) { var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); fstream.init(aFile, -1, 0, 0); sstream.init(fstream); var data = sstream.read(sstream.available()); try { data = decodeURIComponent(escape(data)); } catch (e) { } sstream.close(); fstream.close(); return data; }, alert: function (aMsg, aTitle, aCallback) { var callback = aCallback ? { observe: function (subject, topic, data) { if ("alertclickcallback" != topic) return; aCallback.call(null); } } : null; var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); alertsService.showAlertNotification( "chrome://global/skin/icons/information-32.png", aTitle || "addMenu", aMsg + "", !!callback, "", callback); }, edit: function (aFile, aLineNumber) { if (KeyChanger.isBuilding) return; if (!aFile || !aFile.exists() || !aFile.isFile()) return; var editor; try { editor = Services.prefs.getComplexValue("view_source.editor.path", Ci.nsIFile); } catch (e) { } if (!editor || !editor.exists()) { if (useScraptchpad) { this.openScriptInScratchpad(window, aFile); return; } else { alert("请先设置编辑器的路径!!!"); var fp = Cc['@mozilla.org/filepicker;1'].createInstance(Ci.nsIFilePicker); fp.init(window, "设置全局脚本编辑器", fp.modeOpen); fp.appendFilter("执行文件", "*.exe"); if (fp.show() == fp.returnCancel || !fp.file) return; else { editor = fp.file; Services.prefs.setCharPref("view_source.editor.path", editor.path); } } } // 调用自带的 if(typeof(userChrome) == 'undefined') { this.openScriptInScratchpad(window, aFile); return; } else { var aURL = userChrome.getURLSpecFromFile(aFile); var aDocument = null; var aCallBack = null; var aPageDescriptor = null; gViewSourceUtils.openInExternalEditor({ URL: aURL, lineNumber: aLineNumber }, aPageDescriptor, aDocument, aLineNumber, aCallBack); } }, openScriptInScratchpad: function (parentWindow, file) { let spWin = window.openDialog("chrome://devtools/content/scratchpad/index.xul", "Toolkit:Scratchpad", "chrome,resizable=yes,centerscreen,dependent"); spWin.addEventListener("load", function spWinLoaded() { spWin.removeEventListener("load", spWinLoaded, false); let Scratchpad = spWin.Scratchpad; Scratchpad.setFilename(file.path); Scratchpad.addObserver({ onReady: function () { Scratchpad.removeObserver(this); Scratchpad.importFromFile.call(Scratchpad, file); } }); }, false); }, exec: function (path, arg) { var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); try { var a = (typeof arg == 'string' || arg instanceof String) ? arg.split(/\s+/) : [arg]; file.initWithPath(path); process.init(file); process.run(false, a, a.length); } catch (e) { this.log(e); } }, log: function () { Services.console.logStringMessage("[KeyChanger] " + Array.prototype.slice(arguments)); }, }; window.KeyChanger.createMenuitem(); window.KeyChanger.makeKeyset(); })(); |
|
5楼#
发布于:2020-03-15 21:41
|
|
6楼#
发布于:2020-03-15 22:40
确实顶楼不知道怎么把i识别成斜体了 用rar重新打包了
|
|
7楼#
发布于:2022-11-10 10:37
UndoCloseTabBtn.uc.js 在107又不能用了,求修复。
|
|
|
8楼#
发布于:2022-11-12 21:29
withero:UndoCloseTabBtn.uc.js 在107又不能用了,求修复。回到原帖https://github.com/benzBrake/FirefoxCustomize/blob/master/userChromeJS/UndoCloseTabButtonN.uc.js |
|
9楼#
发布于:2023-06-07 16:37
|
|
|