├── Appmenu ├── Appmenu.png ├── Appmenufor29+.uc.js ├── ExternalAppBtn.uc.js ├── README.md └── rebuildAppmenu.uc.xul ├── AutoHideBar ├── 000-AutoHideBar.uc.js ├── README.md └── autohidden.gif ├── BackupProfile7z版29+.uc.js ├── ContextMenu.uc.js ├── Default Full Zoom Level ├── DefaultFullZoom.png ├── DefaultFullZoom.uc.js ├── DefaultFullZoomBtn.uc.js ├── DefaultFullZoomLevel.uc.js └── README.md ├── Example ├── BackupProfile29+_JS版.uc.js ├── ContextMenu.uc.js ├── CustomButton.uc.js ├── RemovableBtn.uc.js ├── RunwithFirefox.uc.js └── SimpleAppButton.uc.js ├── ExternalFuncBtn.uc.js ├── HistoryMenu ├── HistoryMenu.uc.js ├── HistoryMenu29+.uc.js └── undoCloseTabBtn.uc.js ├── InFormEnterLite.uc.js ├── JsToolsmenu.uc.js ├── KeyChanger ├── KeyChanger.png ├── KeyChanger.uc.js ├── README.md └── _keychanger.js ├── MemoryMonitor.uc.js ├── MouseGestures ├── EasyDrag.uc.js ├── Easydrag.png ├── MouseGestures.png ├── MouseGestures.uc.js ├── MouseGestures2.uc.js ├── README.md └── _mouseGestures.js ├── Picture ├── CSS+userjs.png ├── ExternalAppBtn.png ├── ExternalFuncBtn.png ├── FF29UI.png ├── README.md ├── mynewtab.png ├── rebuildAppmenu.png └── tqyb.png ├── README.md ├── ReadLater2.uc.js ├── Redirector ├── README.md ├── Redirector.uc.js └── _redirector.js ├── RefererChange ├── README.md ├── RefererChange.uc.js ├── RefererChange2.uc.js └── _refererChange.js ├── Sidebar ├── README.md ├── SidebarPlus.uc.js ├── Sidebar_S.uc.js ├── sidebar.gif └── sidebar.png ├── Stylish ├── README.md ├── Stylish.png ├── StylishCustom.uc.js └── stylish0.5_edit.uc.js ├── TabPlus.uc.js ├── Translator ├── JsTranslator.uc.js ├── README.md ├── gTranslator.png ├── gTranslator.uc.js └── gTranslator2.png ├── Updatebookmarklite.uc.js ├── addMenuPlus ├── FFmenu.png ├── README.md └── _addmenu.js ├── autoCopy ├── README.md ├── autoCopy.uc.js ├── autoCopyBtn.uc.js └── autoCopyMenu.uc.js ├── contextSearcher.uc.js ├── myNewTab.md ├── openImgRar.uc.js ├── quickProxyMod.uc.js └── userChrome ├── README.md ├── rebuild_userChrome.uc.xul └── userChrome.js /Appmenu/Appmenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Appmenu/Appmenu.png -------------------------------------------------------------------------------- /Appmenu/README.md: -------------------------------------------------------------------------------- 1 | ###说明文档: 2 | 3 | ##特别说明:以上两脚本都已弃用,以后不在维护更新,建议使用[anoBtn.uc.js](https://github.com/feiruo/userChromeJS/tree/master/anoBtn) 4 | 5 | **Appmenufor29+.uc.js** 为FF29+提供经典版橙色菜单,在脚本中可通过设置 6 | 7 | isUrlbar = 0; // 0:表示标签栏; 1:表示地址栏 8 | 来确定按钮位置。**如果设置在标签栏**,建议配合以下css完善一下位置调整,**数字自己调节,直到满意为止** 9 | 10 | #AppMenuButton{ 11 | padding:0 !important; 12 | margin:0 0 6px 0!important; 13 | } 14 | #AppMenuButton > dropmarker{display:none !important;} 15 | 16 | **rebuildAppmenu.uc.xul** 为经典版FF重建橙色菜单 17 | 18 | **ExternalAppBtn.uc.js** 这是我早期使用的适用于经典版FF的脚本,它是橙色菜单的替代品,整合了脚本 [MyMenu.uc.js](https://github.com/defpt/userChromeJs/blob/master/MyMenu.uc.js) 19 | 20 | ###橙色菜单 21 | 22 | ![橙色菜单](https://github.com/defpt/userChromeJs/blob/master/Appmenu/Appmenu.png?raw=true) 23 | 24 | ###ExternalAppBtn 25 | ![ExternalAppBtn](https://github.com/defpt/userChromeJs/blob/master/Picture/ExternalAppBtn.png?raw=true) -------------------------------------------------------------------------------- /Appmenu/rebuildAppmenu.uc.xul: -------------------------------------------------------------------------------- 1 |  2 | 4 | 14 | 15 | 21 | 26 | 32 | 38 | 44 | 50 | 56 | 62 | 67 | 68 | 73 | 74 | 79 | 84 | 88 | 92 | 96 | 97 | 98 | 103 | 104 | 107 | 110 | 113 | 116 | 117 | 118 | 120 | 125 | 126 | 169 | -------------------------------------------------------------------------------- /AutoHideBar/000-AutoHideBar.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name AidBar.uc.js 3 | // @description 标签栏辅助自定义工具栏 4 | // @include chrome://browser/content/browser.xul 5 | // @charset UTF-8 6 | // @author defpt 7 | // @homepageURL https://github.com/defpt/userChromeJs/tree/master/AidBar.uc.js 8 | // @reviewURL http://bbs.kafan.cn/thread-1727960-1-1.html 9 | (function() { 10 | var TabsToolbar = document.getElementById("TabsToolbar"); 11 | if(TabsToolbar) { 12 | var aidBar = document.createElement('hbox'); 13 | aidBar.setAttribute('id', 'TabsToolbar_aidBar'); 14 | aidBar.setAttribute("label", "辅助栏"); 15 | aidBar.setAttribute("class", "toolbar"); 16 | TabsToolbar.insertBefore(aidBar, document.getElementById("alltabs-button")); 17 | 18 | document.insertBefore(document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent('\ 19 | #TabsToolbar_aidBar{\ 20 | overflow:hidden; \ 21 | max-width:16px; \ 22 | opacity:0; \ 23 | transition: 0.8s; \ 24 | transition-delay:1s;\ 25 | }\ 26 | #TabsToolbar_aidBar:hover{\ 27 | max-width:300px;/*300px足够用了吧?*/\ 28 | opacity:1;\ 29 | transition-delay:.2s;\ 30 | }\ 31 | #TabsToolbar_aidBar > image, .statusbarpanel-iconic{\ 32 | padding:5px 2px;\ 33 | }\ 34 | ') + '"'), document.documentElement); 35 | } 36 | })(); -------------------------------------------------------------------------------- /AutoHideBar/README.md: -------------------------------------------------------------------------------- 1 | ##说明文档: 2 | 基于没有了状态栏,地址栏图标太多,所以才有了标签栏隐藏不常用按钮的想法~~~ 3 | 所以写了个单独脚本,姑且命名为000-AidBar.uc.js,把它当作一个按钮容器(位于标签栏)和000-windowhook.uc 一样最先加载(放chrome路径) 4 | 5 | - 容器 id为:TabsToolbar_aidBar 6 | 7 | - **带按钮的uc脚本**可以直接把按钮设置在此容器,常见的脚本基本默认把按钮设置在 urlbar-icons ,当然也有设置在 nav-bar 等,不过大多在地址栏,所以拿重定向脚本为例:打开脚本搜索 ***urlbar-icons*** 把这个改为 ***TabsToolbar_aidBar*** 重启FF即可,这里要注意一下的是,各种脚本使用image、statusbarpanel-iconic等,这样转移后可能有些图标放大或缩小(各脚本内部设置不统一)这时候可以自己用css调节一下padding、margin属性,我默认统一设置了padding:5px 2px !important;(见下面样式) 8 | 9 | - **至于扩展按钮,**需要先把按钮拖到FF默认的一些工具栏,比如,拖到隐藏的菜单栏, 这样在y大原版脚本 [movebutton](https://github.com/ywzhaiqi/userChromeJS/tree/master/moveButton) 中设置转移到此id即可,比如: 10 | 11 | buttons:[ 12 | { id: "scriptish-button", bar: "TabsToolbar_aidBar", pos: 1 },//scriptish扩展 13 | { id: "stylish-toolbar-button", bar: "TabsToolbar_aidBar", pos: 2 },//stylish 扩展 14 | { id: "masonTbButton", bar: "TabsToolbar_aidBar", pos: 3 },// Mason扩展 15 | { id: "abp-toolbarbutton", bar: "TabsToolbar_aidBar", pos: 4 },// ABP、ABE扩展 16 | { id: "lpt_lastpass-compact-btn", bar: "TabsToolbar_aidBar", pos: 5 },// Lastpass 扩展 17 | ], 18 | 19 | 20 | - 容器设置了最大宽度300px,可放置十几个按钮了,应该足够了,触发区设置了一个按钮图标大小16px 21 | 22 | 这样直接使用,有点小问题,启动FF的时候,会有一个按钮显示大概1秒才会隐藏,目前没有找到完美的在脚本直接解决的方法,可把样式用stylish加载达到完美效果,样式如下: 23 | 24 | #TabsToolbar_aidBar{ 25 | overflow:hidden !important; 26 | max-width:16px !important;/*设置触发区宽度*/ 27 | opacity:0 !important; 28 | transition: 0.8s !important; 29 | transition-delay:1s !important; 30 | } 31 | #TabsToolbar_aidBar:hover{ 32 | max-width:300px !important; 33 | opacity:1 !important; 34 | transition-delay:.2s !important; 35 | } 36 | #TabsToolbar_aidBar > image, .statusbarpanel-iconic{ 37 | padding:5px 2px !important; 38 | } 39 | 40 | ###autohidden 41 | ![autohidden](https://github.com/defpt/userChromeJs/blob/master/AidBar/autohidden.gif?raw=true) -------------------------------------------------------------------------------- /AutoHideBar/autohidden.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/AutoHideBar/autohidden.gif -------------------------------------------------------------------------------- /BackupProfile7z版29+.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name BackupProfile7z_29+.uc.js 3 | // @namespace BackupProfile7z_29+@github.com 4 | // @description 备份配置按钮, 5 | // @charset UTF-8 6 | // @author defpt 7 | // @Compatibility Firefox29+ 8 | // @version v2014.07.27 9 | // @note 2014-07-27 改为排除法打包 10 | // @reviewURL http://bbs.kafan.cn/thread-1758785-1-1.html 11 | /*******===相关说明===== 12 | 部分采用了绝对路径 13 | 请自己设置以下三个路径:ToolPath、ArchiveName、YourFF 14 | 分别对应:7z.exe路径、压缩包放置路径、火狐路径 15 | */ 16 | (function () { 17 | var ToolPath = 'C:\\"Program Files"\\7-Zip\\7z.exe'; //设置7z路径 18 | var ArchivePath = 'E:\\OneDrive\\Firefox\\'; // 设置备份存放的路径 19 | var YourFF = '"D:\\Program Files\\Mozilla Firefox\\firefox.exe"'; // 设置火狐程序路径 20 | 21 | CustomizableUI.createWidget({ 22 | id : "Backup-button", 23 | defaultArea : CustomizableUI.AREA_NAVBAR, 24 | label : "备份配置", 25 | tooltiptext : "备份当前配置", 26 | onClick : function () { 27 | var ProfilePath = FileUtils.getFile('ProfD',['']).path; 28 | var localnow = new Date().toLocaleFormat("%Y%m%d"); 29 | var ArchiveName = ArchivePath + 'Profiles_' + localnow + '.7z'; 30 | var BatText = '\ 31 | @echo off\n\ 32 | taskkill /im firefox.exe\n\ 33 | ping -n 3 127.1>nul\n\ 34 | cd /d %ProfilePath%\n\ 35 | %ToolPath% u -up1q3r2x2y2z2w2 %ArchiveName% * -x!bookmarkbackups -x!*cache* -x!crashes -x!fftmp -x!*healthreport* -x!minidumps -x!safebrowsing -x!*weave* -x!*webapps* -x!saved-telemetry-pings -x!*thumbnails* -x!*session* -x!*Telemetry* -x!*hotfix* -x!*.sqlite-shm -x!*.sqlite-wal -x!*.bak -x!parent.lock -x!blocklist.xml -x!*content* -x!directoryLinks.json -x!mimeTypes.rdf -x!compatibility.ini -x!formhistory.sqlite\n\ 36 | start "" %YourFF%\n\ 37 | '; 38 | 39 | BatText = BatText.replace('%ToolPath%', ToolPath) 40 | .replace('%ArchiveName%', ArchiveName) 41 | .replace('%YourFF%', YourFF) 42 | .replace('%ProfilePath%', ProfilePath); 43 | 44 | runNative(createTempFile(BatText, "BackupProfiles.bat"),[]); 45 | 46 | function runNative(exePath, args, blocking) { 47 | if (typeof blocking == 'undefined') blocking = false; 48 | var exeFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile); 49 | exeFile.initWithPath(exePath); 50 | if (exeFile.exists()) { 51 | var proc = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); 52 | proc.init(exeFile); 53 | proc["runw" in proc ? "runw" : "run"](blocking, args, args.length); 54 | return 0; 55 | } else { 56 | return -1; 57 | } 58 | } 59 | function createTempFile(data, filename, charset) { 60 | var file = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("TmpD", Ci.nsIFile); 61 | file.append(filename); 62 | file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE); 63 | 64 | var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); 65 | foStream.init(file, 0x02 | 0x08 | 0x20, 0700, 0); 66 | var converter = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream); 67 | converter.init(foStream, charset || "gbk", 0, "?".charCodeAt(0)); 68 | converter.writeString(data); 69 | converter.close(); 70 | 71 | return file.path; 72 | } 73 | } 74 | }); 75 | 76 | var cssStr = '@-moz-document url("chrome://browser/content/browser.xul"){' 77 | + '#Backup-button .toolbarbutton-icon {' 78 | + 'list-style-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHQSURBVFhH7VbhSsJgFPURgpCMZU2dojk1ExtGZdO2cqmrF+gNgv4F/nFB9iuxN7Yd/S5sy41900WBBw58997jvWfb3TCxhRfPr2/zOMnG+GM0+ZrHxf9hIA78PwOtjv4hHlfHWflknK/UrZvBYIr8TirVRqOiLGuIqTERuVWgemgDzqZE5PO1hoWzbpoLQ14NiLwXVON+BPRDRevNEOcqtYWBUr1pUb2lahM6gzh7QTUuA9f94czbVDWMKWKpejpGjHO33/+ks1PrBNVCG1D13tOqhkq7O0EOu4GYNKu0TlA90g4U7KtVjeUSSvZg5BqXbddtBxH7gTRrL2GuvNyBO/PRtYQ4B4F03Eu4KfwJAy+j93AGIMIzp+e8CXAboFvGUoHAXuC1LDWaFhlHjI8Wk8RngJbSj0wWnwGxKC9eSz8y2e/cAZb6gdRR1iDNxg3o9vcgSGsP71Ed3BWEDiv5g8dA0144P62QLbiG7x1m7lkpGDwG6NPs1SYPxFvKg0ImH244wGOA/h84tcm0qFMODH3lBB4DXqQlyTVcuVKHrBQeUQ3sZyTNObyunPMPB5wGorLSODNZO36sa6DUunhgraIBBqJSLNd01maLkEgkvgF6HhaHvcF79AAAAABJRU5ErkJggg==)' 79 | + '}}'; 80 | var sss = Cc["@mozilla.org/content/style-sheet-service;1"].getService(Ci.nsIStyleSheetService); 81 | var ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService); 82 | sss.loadAndRegisterSheet(ios.newURI("data:text/css;base64," + btoa(cssStr), null, null), sss.USER_SHEET); 83 | })(); 84 | -------------------------------------------------------------------------------- /ContextMenu.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name ContextConfig.uc.js 3 | // @namespace ContextConfig@gmail.com 4 | // @charset UTF-8 5 | // @description 右键菜单增加某些功能 6 | // @note 增加谷歌快照打开链接、简化隐私窗口打开右键菜单 by defpt 2013.11.10 7 | // @note 复制链接文本、复制链接文本+地址、网页标题+地址 8 | // ==/UserScript== 9 | var MyContext = { 10 | copy: function(aString) { 11 | var clipb = Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper); 12 | clipb.copyString(aString); 13 | dump(aString); 14 | }, 15 | webcache: function() { 16 | gBrowser.addTab('http://webcache.googleusercontent.com/search?q=cache:' + gContextMenu.linkURL); 17 | }, 18 | link: function() { 19 | this.copy(gContextMenu.linkText() + "\n" + gContextMenu.linkURL); 20 | }, 21 | linktext: function() { 22 | this.copy(gContextMenu.linkText()); 23 | }, 24 | page: function() { 25 | this.copy(window.content.document.title + "\n" + window.content.document.location.href); 26 | }, 27 | 28 | init: function() { 29 | this.mItem = document.createElement("menuitem"); 30 | this.mItem.setAttribute("id", "context-webcache"); 31 | this.mItem.setAttribute("label", "用快照打开链接"); 32 | 33 | this.mItem1 = document.createElement("menuitem"); 34 | this.mItem1.setAttribute("id", "context-copylinktext"); 35 | this.mItem1.setAttribute("label", "复制链接文本"); 36 | 37 | this.mItem2 = document.createElement("menuitem"); 38 | this.mItem2.setAttribute("id", "context-copylinkurl"); 39 | this.mItem2.setAttribute("label", "复制链接文本+URL"); 40 | 41 | this.mItem3 = document.createElement("menuitem"); 42 | this.mItem3.setAttribute("id", "context-copyPageTitle"); 43 | this.mItem3.setAttribute("label", "复制网页标题+URL"); 44 | 45 | this.mItem4 = document.createElement("menuitem"); 46 | this.mItem4.setAttribute("id", "context-sideopen"); 47 | this.mItem4.setAttribute("label", "在侧边栏打开当前页面"); 48 | 49 | document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", 50 | function() { 51 | MyContext.onPopupShowing(this); 52 | }, 53 | false); 54 | 55 | let menuitem = document.getElementById("context-openlinkprivate"); 56 | menuitem.setAttribute("label", "在隐私窗口打开此链接"); 57 | }, 58 | onPopupShowing: function(aPopup) { 59 | var contextmenu = document.getElementById("contentAreaContextMenu"); 60 | var copylink = document.getElementById("context-copylink"); 61 | aPopup.insertBefore(this.mItem, copylink); 62 | aPopup.insertBefore(this.mItem1, copylink); 63 | aPopup.insertBefore(this.mItem2, copylink); 64 | aPopup.appendChild(this.mItem3, contextmenu); 65 | aPopup.appendChild(this.mItem4, contextmenu); 66 | 67 | this.mItem.setAttribute("oncommand", "MyContext.webcache();"); 68 | this.mItem.hidden = !gContextMenu.onLink; 69 | this.mItem.setAttribute("class", "menuitem-iconic"); 70 | this.mItem.setAttribute("image","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJsSURBVDhPrVNLTxNRFJ4+KCHGnSaKaHDjRqMrExOXGiokGk3cKyG68ie4dedK/4A7RVpoqZRHiYAUUWt8ROzQdtqZvuh0lCJ9TOlM289zb1soaz3Jyb1z73e+e+ac7wj/xWzuCOweCdYJERZyx7QMYfwnHD4FtskorK5N2Cdj5FFY6FwY3+B37XAioIsebxxWIrJMhDmohxFSIA+ekvi9zc1wCVoj6O0msE/FcMwTwY1lGRcXFfRNJziwRSjybBiGrcw7xO1wQTjilfDoxw60OuBRdTwMZTH2VcO9jxmMhnJ48O037oe2MPZFw+jnHJzvUjg605XBiTcSlnNF1Go16A1ArZqQ/lTgzul4GlYRyJWwTee+9A6ebOTxMl3CqbnkAcGZ+SSUPexbjfzx9xwuLMg4O6/g2vs8XikFiCUD7mwJa1oZg4H0AcHATBxytYlGowHDMLCgVXHOL/Fi8iKS317fQkKvwyTyBGEHA5nDGYiFCn/dNE08E/Pon1XaHYjx9cpSCqvqLsdIZROnZ6nVHRvwJxDZraLZbHJf+aXjEnWj1yfzfrOu3A0mkdHZ++C/yx5thwvCSe8mz6BepzaQMdhzqYDr63mcn5NwJ5jC222jdUcZRot7hwmOkwZ82SIytSZiVH25bFBNGnAlC3iRrmCROsTOssQRL1bhVyvo7+6CwyXi8qKMW580OFcUjKxlMUSiuvlBxdCSjOHVNJz0PRLMYDiYxtWgij5SajucCOhf2SzYmN6paEy6TN4tBdKeJNwpKJ8Z2nNV7hsNB9M2ky8rGhsqBmaaZzPA2ml5HebDxM45jg3cv5sg/AXXmVB6oQ/sCwAAAABJRU5ErkJggg=="); 71 | 72 | this.mItem1.setAttribute("oncommand", "MyContext.linktext();"); 73 | this.mItem1.hidden = !gContextMenu.onLink; 74 | this.mItem1.setAttribute("class", "menuitem"); 75 | 76 | this.mItem2.setAttribute("oncommand", "MyContext.link();"); 77 | this.mItem2.hidden = !gContextMenu.onLink; 78 | this.mItem2.setAttribute("class", "menuitem-iconic"); 79 | this.mItem2.setAttribute("image","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB/SURBVDhPjY7RDYAgEENvRRdwAff/1qB9sSAn95ImUNqGaGz7cWa6AytmRZdiOQRHyiM+4KVRin8hsBpoUqWHRx8YwW9S7cVLfnbwkaoPmB4cwXepng9w5g54qtd+4JBRvfaDma/6O+D6g4zq+cDKV73HgxmlgYpU6ZkFM0VEXGM87FJCmlCsAAAAAElFTkSuQmCC"); 80 | 81 | this.mItem3.setAttribute("oncommand", "MyContext.page();"); 82 | this.mItem3.hidden = gContextMenu.onLink; 83 | this.mItem3.setAttribute("class", "menuitem-iconic"); 84 | this.mItem3.setAttribute("image","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAB/SURBVDhPjY7RDYAgEENvRRdwAff/1qB9sSAn95ImUNqGaGz7cWa6AytmRZdiOQRHyiM+4KVRin8hsBpoUqWHRx8YwW9S7cVLfnbwkaoPmB4cwXepng9w5g54qtd+4JBRvfaDma/6O+D6g4zq+cDKV73HgxmlgYpU6ZkFM0VEXGM87FJCmlCsAAAAAElFTkSuQmCC"); 85 | 86 | this.mItem4.setAttribute("oncommand", "openWebPanel(content.document.title, content.location);"); 87 | this.mItem4.hidden = gContextMenu.onLink; 88 | this.mItem4.setAttribute("class", "menuitem-iconic"); 89 | this.mItem4.setAttribute("image","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACSSURBVDhPrZPbDYAgDEUhuhcr6Ad/4gAyg6u5mqa1RZ5KhJM0sbdw0wKKbkzGHhCUlpCz2fZ5tSflDgkiFeQtBaDGaxIDpdTIBa31QDKTbIbACvNiEGzmMWsNsm1/GsA3ydmZ4xzxDUh62l7czQQdocJUGiDxOqTrCM2H2PMamaQTCKx4tD1lgNujtETxZ/qJEBdk+r9go7hxIgAAAABJRU5ErkJggg=="); 90 | 91 | } 92 | }; 93 | window.setTimeout(function() { 94 | MyContext.init(); 95 | }); -------------------------------------------------------------------------------- /Default Full Zoom Level/DefaultFullZoom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Default Full Zoom Level/DefaultFullZoom.png -------------------------------------------------------------------------------- /Default Full Zoom Level/README.md: -------------------------------------------------------------------------------- 1 | #Default Full Zoom Level 说明文档 2 | 3 | ###[DefaultFullZoomLevel.uc.js](https://github.com/defpt/userChromeJs/blob/master/Default%20Full%20Zoom%20Level/DefaultFullZoomLevel.uc.js) 是原版 4 | 5 | ###[DefaultFullZoomBtn.uc.js](https://github.com/defpt/userChromeJs/blob/master/Default%20Full%20Zoom%20Level/DefaultFullZoomBtn.uc.js) 是我应饭友改的按钮图标版,可设置显示按钮或者文字,现在L大版的已经把图标集成进去了,这里以后不在更新了 6 | 7 | ###[DefaultFullZoom.uc.js](https://github.com/defpt/userChromeJs/blob/master/Default%20Full%20Zoom%20Level/DefaultFullZoom.uc.js) 是自用文字加样式美化版 8 | 9 | ##效果图如下: 10 | 11 | ![DefaultFullZoom](https://github.com/defpt/userChromeJs/blob/master/Default%20Full%20Zoom%20Level/DefaultFullZoom.png?raw=true) -------------------------------------------------------------------------------- /Example/BackupProfile29+_JS版.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name BackupProfile29+_JS版.uc.js 3 | // @namespace BackupProfile29+_JS版@github.com 4 | // @description 备份配置按钮,更适合配置较小情况 5 | // @charset UTF-8 6 | // @author ywzhaiqi、defpt 7 | // @version v2014.07.26 8 | // @note 打包代码来自 ywzhaiqi 9 | // @reviewURL http://bbs.kafan.cn/thread-1758785-1-1.html 10 | (function () { 11 | CustomizableUI.createWidget({ 12 | id : "Backup-button", 13 | defaultArea : CustomizableUI.AREA_NAVBAR, 14 | label : "备份配置", 15 | tooltiptext : "备份当前配置", 16 | onClick: function(){ 17 | // 预设备份路径,否则出现选择框选择路径 18 | var path = "E:\\OneDrive\\Firefox"; 19 | // var path = ""; 20 | // 排除列表 21 | var excludes = 'bookmarkbackups *cache* crashes fftmp *healthreport* minidumps safebrowsing *webapps* saved-telemetry-pings *thumbnails* *session* *Telemetry* *hotfix* *.sqlite-shm *.sqlite-wal *.bak parent.lock blocklist.xml *content* directoryLinks.json mimeTypes.rdf compatibility.ini parent.lock formhistory.sqlite'; 22 | 23 | if (!path) { 24 | var nsIFilePicker = Ci.nsIFilePicker; 25 | var FP = Cc['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker); 26 | FP.init(window, '请选择备份保存路径', nsIFilePicker.modeGetFolder); 27 | 28 | if (FP.show() == nsIFilePicker.returnOK) { 29 | path = FP.file.path; 30 | } else { 31 | return false; 32 | } 33 | } 34 | 35 | excludes = excludes.replace(/\./g, '\\.').replace(/\*/g, '.*').replace(/\s+/g, '|'); 36 | excludes = new RegExp(excludes, 'i'); 37 | 38 | var zw = Cc['@mozilla.org/zipwriter;1'].createInstance(Ci.nsIZipWriter); 39 | var pr = {PR_RDONLY: 0x01, PR_WRONLY: 0x02, PR_RDWR: 0x04, PR_CREATE_FILE: 0x08, PR_APPEND: 0x10, PR_TRUNCATE: 0x20, PR_SYNC: 0x40, PR_EXCL: 0x80}; 40 | var fu = Cu.import('resource://gre/modules/FileUtils.jsm').FileUtils; 41 | var dir = fu.getFile('ProfD', []); 42 | var localnow = new Date().toLocaleFormat("%Y%m%d"); 43 | var archiveName = 'Profiles_' + localnow + '.zip'; 44 | var xpi = fu.File(path + '\\' + archiveName); 45 | 46 | zw.open(xpi, pr.PR_RDWR | pr.PR_CREATE_FILE | pr.PR_TRUNCATE); 47 | var dirArr = [dir]; 48 | for (var i=0; i= 0? "gbk": "UTF-8"; 201 | 202 | try { 203 | var path = UI.ConvertFromUnicode(aFile.path); 204 | var args = [path] 205 | 206 | file.initWithPath(editor); 207 | process.init(file); 208 | process.run(false, args, args.length); 209 | } catch (e) {} 210 | }, 211 | log: function() { 212 | Services.console.logStringMessage("[KeyChanger] " + Array.slice(arguments)); 213 | }, 214 | }; 215 | 216 | KeyChanger.createMenuitem(); 217 | KeyChanger.makeKeyset(); 218 | 219 | 220 | 221 | /* ********** KeyChanger について ********** 222 | 223 | ***** 使い方 ***** 224 | _keychanger.js ファイルを chrome フォルダにおいてください。 225 | .uc.js の方はどこでも構いません。 226 | 227 | 228 | ***** 書式について ***** 229 | keys["Ctrl+Shift+A"] = "alert(this)"; のように + で区切って記述。 230 | 不要なスペースは入れないでください。 231 | Ctrl 等を使用しない場合は keys.VK_F1 でも可。 232 | 233 | キーは大文字小文字区別せず、多少柔軟性を持たせてあります。 234 | 例: 235 | f1 → VK_F1 236 | Esc → VK_ESCAPE 237 | backspace, bksp → VK_BACK 238 | 239 | 正確に書くならこちらを参考に。 240 | ・https://developer.mozilla.org/ja/XUL_Tutorial/Keyboard_Shortcuts 241 | 242 | 243 | ***** 代入できるもの ***** 244 | string はそのまま oncommand 属性に。 245 | 246 | object は for in でそのまま属性に。 247 | 例:keys.f1 = { id : 'test', oncommand : 'alert(this.id)' }; 248 | 249 | function は "(" + func.toSource() + ").call(this, event);" で oncommand 属性に。 250 | 251 | 252 | スクリプトはこの辺を参考に調達してください。 253 | ・http://www.xuldev.org/blog/?p=76 254 | ・http://www.xuldev.org/firegestures/getscripts.php 255 | 256 | 257 | 258 | */ 259 | -------------------------------------------------------------------------------- /KeyChanger/README.md: -------------------------------------------------------------------------------- 1 | ###说明文档: 2 | 此脚本来自 [Griever/KeyChanger.uc.js](https://github.com/Griever/userChromeJS/blob/master/KeyChanger/KeyChanger.uc.js) 3 | 这是可定制 Firefox 快捷键的脚本,通过外置配置文件可添加、修改火狐的快捷键,修改后无需重启,重新载入配置文件即可生效。是我最喜欢的脚本之一!!! 4 | 5 | 6 | **KeyChanger.uc.js** 是脚本文件,为了统一管理自用配置,我把配置路径设为本地Firefox配置文件夹下的chrome\Local\ 7 | 8 | **[_keychanger.js.js](https://github.com/defpt/userChromeJs/blob/master/KeyChanger/_keychanger.js)** 是配置文件 9 | 使用 Griever 原脚本直接放chrome路径下即可,但如果你想使用此处这个改动版脚本,那么要把配置文件放到自己建立的chrome\Local\文件夹下 10 | 11 | ![KeyChanger](https://github.com/Griever/userChromeJS/blob/master/KeyChanger/KeyChanger.png?raw=true) 12 | 13 | -------------------------------------------------------------------------------- /KeyChanger/_keychanger.js: -------------------------------------------------------------------------------- 1 | keys['0'] = "Cc['@mozilla.org/browser/browserglue;1'].getService(Ci.nsIBrowserGlue).sanitize(window);"; //清理历史记录 2 | keys['1'] = function() {gBrowser.selectedTab = gBrowser.addTab('http://www.google.com/search?q=' + encodeURIComponent(getBrowserSelection()));};//Google搜索选中文字 3 | keys['2'] = function() {gBrowser.selectedTab = gBrowser.addTab('http://translate.google.de/#auto/zh-CN/' + encodeURIComponent(getBrowserSelection()));};//Google搜索选中文字 4 | keys['3'] = "gBrowser.selectedTab = gBrowser.addTab('http://bbs.kafan.cn/forum-215-1.html');"; 5 | keys['4'] = function() {if(getBrowserSelection()) gBrowser.selectedTab = gBrowser.addTab('http://www.google.com/search?q=site:booklink.me ' + encodeURIComponent(getBrowserSelection() + ' 最新章节')); else gBrowser.selectedTab = gBrowser.addTab('http://booklink.me/');};//BookLinkMe搜索选中文字 6 | keys['5'] = function() {var newtabs = ["http://www.zdfans.com/", "http://www.lite6.com/", "http://www.ccav1.com/","http://yun.baidu.com/share/link?uk=1781991321&shareid=648883838#dir/path=%2F%E8%85%BE%E8%AE%AFQQ"];var i=0;while(i<=newtabs.length-1){gBrowser.selectedTab=gBrowser.addTab(newtabs[i]);i=i+1;}};//打开一组标签页 7 | 8 | keys['a'] = function(){if(content.ap) 9 | uAutoPagerize.gotoprev();else if(uAutoPagerize && content.document.body.getAttribute("name") == "MyNovelReader") 10 | uAutoPagerize.gotoprev(content, ".title");else content.scrollByPages(-1);};//自动翻页上一页 11 | keys['b'] = "gBrowser.selectedTab = gBrowser.addTab('chrome://browser/content/places/places.xul');"; //打开我的足迹 12 | keys['c'] = "gBrowser.removeCurrentTab();"; //关闭当前页 13 | keys['d'] = function(){if(content.ap) 14 | uAutoPagerize.gotonext();else if(uAutoPagerize && content.document.body.getAttribute("name") == "MyNovelReader") 15 | uAutoPagerize.gotonext(content, ".title");else content.scrollByPages(1);};//自动翻页下一页 16 | // keys['e'] = "__readable_by_evernote.button__call(event);";//evernote clear 17 | keys['f'] = "gFindBar.onFindCommand();";//打开查找栏 18 | // keys['g'] = ""; 19 | keys['h'] = "gWHT.addWord();";//高亮脚本,添加高亮关键词 20 | keys['i'] = function() {try {var file = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties).get("ProgF", Components.interfaces.nsILocalFile);file.append("Internet Explorer");file.append("iexplore.exe");var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);process.init(file);process.run(false, [content.location.href], 1);} catch (ex) {alert("\u6253\u5f00IE\u5931\u8d25!")}};//用IE打开当前页 21 | keys['j'] = function(){var canvas=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");canvas.width=content.document.documentElement.scrollWidth;canvas.height=content.document.documentElement.scrollHeight;var ctx=canvas.getContext("2d");ctx.drawWindow(content,0,0,canvas.width,canvas.height,"rgb(255,255,255)");saveImageURL(canvas.toDataURL(),content.document.title+".png",null,null,null,null,document);};//整个页面截图 22 | // keys['k'] = ""; 23 | keys['l'] = "gWHT.destroyToolbar();";//取消高亮工具条 24 | // keys['m'] = ""; 25 | // keys['n'] = "";//已占用,高亮脚本的下一个功能 26 | keys['o'] = "openPreferences();";//选项 27 | keys['p'] = "OpenBrowserWindow({private: true});";//隐私窗口 28 | // keys['q'] = ""; 29 | keys['r'] = "undoCloseTab();";//恢复关闭的标签 30 | keys['s'] = "var s = prompt('站内搜索——请输入待搜索字符串', '');if (s.length > 0) gBrowser.addTab('http://www.google.de/search?q=site:' + encodeURIComponent(content.location.host) + ' ' + encodeURIComponent(s));";//站内搜索 31 | keys['t'] = "BrowserOpenTab();";//新建标签页 32 | keys['u'] = "var str = addMenu.convertText('[url=%u]%TITLE%[/url]');addMenu.copy(str);"; //复制当前页完整标题 33 | // keys['v'] = ""; 34 | // keys['w'] = ""; 35 | keys['x'] = "getWebNavigation().canGoForward && getWebNavigation().goForward();";//前进 36 | keys['y'] = "gTranslator.selectionTranslation();"; 37 | keys['z'] = "getWebNavigation().canGoBack && getWebNavigation().goBack();";//后退 38 | 39 | keys['F2'] = "gFindBar.onFindAgainCommand(true);";//查找栏上一个 40 | keys['F4'] = "gFindBar.toggleHighlight(true);";//全部高亮 41 | keys['F6'] = "gBrowser.selectedTab = gBrowser.addTab('about:config');";//参数设置 42 | keys['F8'] = "gBrowser.selectedTab = gBrowser.addTab('chrome://global/content/console.xul');";//错误控制台 43 | 44 | keys["Alt+C"] = "var str = addMenu.convertText('[code]%CLIPBOARD%[/code]');addMenu.copy(str);goDoCommand('cmd_paste');";//粘贴为code代码 45 | keys["Alt+Q"] = "var str = addMenu.convertText('[quote]%CLIPBOARD%[/quote]');addMenu.copy(str);goDoCommand('cmd_paste');";//粘贴为quote代码 46 | 47 | 48 | 49 | //keys["Ctrl+Alt+R"] = "Services.appinfo.invalidateCachesOnRestart() || Application.restart();"; //重启浏览器 50 | // keys['g'] = function (){gBrowser.loadURI("javascript:var%20AS_interval_pointer;AS_speed=4;AS_speed_temp=4;AS_speed_pairs=%5B%5B0,0%5D,%5B1,200.0%5D,%5B1,120.0%5D,%5B1,72.0%5D,%5B1,43.2%5D,%5B1,25.9%5D,%5B2,31.0%5D,%5B4,37.2%5D,%5B8,44.8%5D,%5B8,26.4%5D,%5B16,32.0%5D%5D;AS_last_onkeypress=document.onkeypress;AS_stop=function()%7BclearTimeout(AS_interval_pointer)%7D;AS_start=function()%7BAS_abs_speed=Math.abs(AS_speed);AS_direction=AS_speed/AS_abs_speed;AS_speed_pair=AS_speed_pairs%5BAS_abs_speed%5D;AS_interval_pointer=setInterval('scrollBy(0,'+AS_direction*AS_speed_pair%5B0%5D+');%20if((pageYOffset%3C=1)%7C%7C(pageYOffset==document.height-innerHeight))%20AS_speed=0;',AS_speed_pair%5B1%5D);%7D;AS_adj=function(q)%7BAS_speed+=q;if(Math.abs(AS_speed)%3E=AS_speed_pairs.length)%7BAS_speed=(AS_speed_pairs.length-1)*(AS_speed/Math.abs(AS_speed));%7D%7D;AS_pause=function()%7Bif(AS_speed!=0)%7BAS_speed_temp=AS_speed;AS_speed=0;%7Delse%7BAS_speed=AS_speed_temp;%7D%7D;document.onkeypress=function(e)%7Bif(e.charCode==113)%7BAS_stop();document.onkeypress=AS_last_onkeypress;return;%7Delse%7Bswitch(e.charCode)%7Bcase%2057:AS_speed=4;break;case%2048:AS_speed=0;break;case%2061:AS_adj(1);break;case%2045:AS_adj(-1);break;case%2032:AS_pause();break;default:break;%7D;%7D;AS_stop();AS_start();%7D;AS_stop();AS_start();");};//自动滚屏 -------------------------------------------------------------------------------- /MemoryMonitor.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name MemoryMonitorMod.uc.js 3 | // @description 简单的FF内存监视器 4 | // @include main 5 | // @charset UTF-8 6 | // @note 2014.09.18 设置其位置在地址栏地址前 7 | // @note 2014.05.09 修复内存超过1G时候的颜色显示错误问题 8 | // @note 2014.02.10 删除自动重启功能,修复分级颜色显示:正常显示为绿色,超过预警值的0.6倍为蓝色,超出预警值显示为红色 9 | // @note 2014.02.08 基于原MemoryMonitorMod.uc.js修改,兼容FF28+ 10 | // @homepageURL https://github.com/defpt/userChromeJs/blob/master/MemoryMonitor.uc.js 11 | // @reviewURL http://bbs.kafan.cn/thread-1685929-1-1.html 12 | // ==/UserScript== 13 | var ucjsMM = { 14 | _interval : 5000, 15 | //内存刷新周期, 单位 ms 16 | _Warningvalue : 1000, 17 | //内存预警值, 单位 MB 18 | _MemoryValue : 0, 19 | //内存初始值 20 | _prefix : 'MB', 21 | //内存单位 22 | 23 | interval : null, 24 | init : function () { 25 | var toolbar = document.getElementById('identity-box').parentNode; 26 | var memoryPanel = document.createElement('statusbarpanel'); 27 | memoryPanel.id = 'MemoryDisplay'; 28 | memoryPanel.setAttribute('label', ucjsMM._MemoryValue + ucjsMM._prefix); 29 | memoryPanel.setAttribute('tooltiptext', '内存监视器,点击打开about:memory'); 30 | toolbar.insertBefore(memoryPanel, toolbar.childNodes[3]); 31 | document.insertBefore(document.createProcessingInstruction('xml-stylesheet', 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent('\ 32 | #MemoryDisplay{\ 33 | padding-left:0;\ 34 | font-size:13px;\ 35 | margin-right:2px;\ 36 | }\ 37 | #MemoryDisplay .statusbarpanel-text{margin:0;}\ 38 | ') + '"'), document.documentElement); 39 | this.start(); 40 | this.interval = setInterval(this.start, this._interval); 41 | }, 42 | start : function () { 43 | try { 44 | const Cc = Components.classes; 45 | const Ci = Components.interfaces; 46 | var MemReporters = Cc['@mozilla.org/memory-reporter-manager;1'].getService(Ci.nsIMemoryReporterManager); 47 | var workingSet = MemReporters.resident; 48 | ucjsMM._MemoryValue = Math.round(workingSet / (1024 * 1024)); 49 | var displayValue = ucjsMM.addFigure(ucjsMM._MemoryValue); 50 | var memoryPanel = document.getElementById('MemoryDisplay'); 51 | memoryPanel.setAttribute('label', displayValue + ucjsMM._prefix); 52 | memoryPanel.setAttribute('onclick', "if(event.button==0)openUILinkIn('about:memory','tab');"); 53 | if (ucjsMM._MemoryValue <= ucjsMM._Warningvalue * 0.6){ 54 | memoryPanel.style.color = 'green'; 55 | } 56 | else if (ucjsMM._MemoryValue >= ucjsMM._Warningvalue) { 57 | memoryPanel.style.color = 'red'; 58 | } 59 | else { 60 | memoryPanel.style.color = 'blue'; 61 | } 62 | } catch (ex) { 63 | clearInterval(ucjsMM.interval); 64 | } 65 | }, 66 | addFigure : function (str) { 67 | var num = new String(str).replace(/,/g, ''); 68 | while (num != (num = num.replace(/^(-?\d+)(\d{3})/, '$1,$2'))); 69 | return num; 70 | } 71 | } 72 | ucjsMM.init(); 73 | -------------------------------------------------------------------------------- /MouseGestures/EasyDrag.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name EasyDrag.uc.js 3 | // @namespace EasyDrag@gmail.com 4 | // @author 紫云飞 5 | // @description 从紫大博客定制,修复了拖拽链接的一个小bug 6 | // @homepageURL http://www.cnblogs.com/ziyunfei/archive/2011/12/20/2293928.html 7 | // ==/UserScript== 8 | location == "chrome://browser/content/browser.xul" && (function(event) { 9 | var self = arguments.callee; 10 | if (!event) { 11 | ["dragstart", "dragover", "drop"].forEach(function(type) { 12 | gBrowser.mPanelContainer.addEventListener(type, self, false); 13 | }); 14 | window.addEventListener("unload", function() { 15 | ["dragstart", "dragover", "drop"].forEach(function(type) { 16 | gBrowser.mPanelContainer.removeEventListener(type, self, false); 17 | }); 18 | }, false); 19 | self.seemAsURL = function(url) { // 来自 Easy DragToGo+ 扩展,略作修正 20 | var DomainName = /(\w+(\-+\w+)*\.)+\w{2,7}/i; 21 | var HasSpace = /\S\s+\S/; 22 | var KnowNameOrSlash = /^(www|bbs|forum|blog)|\//i; 23 | var KnowTopDomain1 = /\.(com|net|org|gov|edu|info|mobi|mil|asia)$/i; 24 | var KnowTopDomain2 = /\.(de|uk|eu|nl|it|cn|be|us|br|jp|ch|fr|at|se|es|cz|pt|ca|ru|hk|tw|pl|me|tv|cc)$/i; 25 | var IsIpAddress = /^([1-2]?\d?\d\.){3}[1-2]?\d?\d/; 26 | var seemAsURL = !HasSpace.test(url) && DomainName.test(url) && (KnowNameOrSlash.test(url) || KnowTopDomain1.test(url) || KnowTopDomain2.test(url) || IsIpAddress.test(url)); 27 | return seemAsURL; 28 | }; 29 | return; 30 | } 31 | switch (event.type) { 32 | case "dragstart": 33 | { 34 | self.startPoint = [event.screenX, event.screenY]; 35 | self.sourceNode = event.target; 36 | event.target.localName == "img" && event.dataTransfer.setData("application/x-moz-file-promise-url", event.target.src); 37 | break; 38 | } 39 | case "dragover": 40 | { 41 | self.startPoint && (Components.classes["@mozilla.org/widget/dragservice;1"].getService(Components.interfaces.nsIDragService).getCurrentSession().canDrop = true); 42 | break; 43 | } 44 | case "drop": 45 | { 46 | if (self.startPoint && event.target.localName != "textarea" && (!(event.target.localName == "input" && (event.target.type == "text" || event.target.type == "password"))) && event.target.contentEditable != "true") { 47 | event.preventDefault(); 48 | event.stopPropagation(); 49 | var [subX, subY] = [event.screenX - self.startPoint[0], event.screenY - self.startPoint[1]]; 50 | var [distX, distY] = [(subX > 0 ? subX : (-subX)), (subY > 0 ? subY : (-subY))]; 51 | var direction; 52 | if (distX > distY) direction = subX < 0 ? "L" : "R"; 53 | else direction = subY < 0 ? "U" : "D"; 54 | if (event.dataTransfer.types.contains("application/x-moz-file-promise-url")) { 55 | var edgimg = event.dataTransfer.getData("application/x-moz-file-promise-url");//目标图片链接 56 | if (direction == "U") { 57 | //新标签打开图片(前台) 58 | gBrowser.selectedTab = gBrowser.addTab(edgimg); 59 | return; 60 | } 61 | if (direction == "D") { 62 | //搜索相似图片(Google) 63 | gBrowser.addTab('http://www.google.com/searchbyimage?image_url=' + encodeURIComponent(edgimg)); 64 | return; 65 | } 66 | if (direction == "L") { 67 | //复制图片地址 68 | Components.classes['@mozilla.org/widget/clipboardhelper;1'].createInstance(Components.interfaces.nsIClipboardHelper).copyString('[img]' + edgimg + '[/img]'); 69 | return; 70 | } 71 | if (direction == "R") { 72 | //下载图片(不弹窗) 73 | saveImageURL(event.dataTransfer.getData("application/x-moz-file-promise-url"), null, null, null, true, null, document); 74 | return; 75 | } 76 | } else if (event.dataTransfer.types.contains("text/x-moz-url")) { 77 | var edglink = event.dataTransfer.getData("text/x-moz-url").replace(/[\n\r]+/, "\n").split("\n");//目标链接 78 | if (direction == "U") { 79 | //新标签打开链接(后台) 80 | gBrowser.addTab(edglink[0]); 81 | return; 82 | } 83 | if (direction == "D") { 84 | if (event.ctrlKey){ 85 | //下载链接 86 | saveImageURL(event.dataTransfer.getData("text/x-moz-url").split("\n")[0], null, null, null, true, null, document); 87 | } else { 88 | //新标签打开链接(前台) 89 | gBrowser.selectedTab = gBrowser.addTab(edglink[0]); 90 | } 91 | return; 92 | } 93 | if (direction == "L") { 94 | //复制链接文本 95 | Components.classes['@mozilla.org/widget/clipboardhelper;1'].createInstance(Components.interfaces.nsIClipboardHelper).copyString(edglink[1]); 96 | return; 97 | } 98 | if (direction == "R") { 99 | //复制链接地址 100 | Components.classes['@mozilla.org/widget/clipboardhelper;1'].createInstance(Components.interfaces.nsIClipboardHelper).copyString(edglink[0]); 101 | return; 102 | } 103 | } else { 104 | var edgsel = event.dataTransfer.getData("text/unicode");//选中的文字 105 | if (direction == "U") { 106 | //搜索框搜索选中文字(站内)(前台) 107 | gBrowser.selectedTab = gBrowser.addTab(); 108 | BrowserSearch.loadSearch("site:" + content.location.host + " " + edgsel, false); 109 | return; 110 | } 111 | if (direction == "D") { 112 | //搜索框搜索选中文字(前台)[识别URL并打开] 113 | (self.seemAsURL(edgsel) && (gBrowser.selectedTab = gBrowser.addTab(edgsel))) || ((gBrowser.selectedTab = gBrowser.addTab()) & BrowserSearch.loadSearch(edgsel, false)); 114 | return; 115 | } 116 | if (direction == "L") { 117 | //复制所选文字 118 | Components.classes['@mozilla.org/widget/clipboardhelper;1'].createInstance(Components.interfaces.nsIClipboardHelper).copyString(edgsel); 119 | } 120 | if (direction == "R") { 121 | //页面内查找所选文字 122 | gFindBar.onFindCommand(); 123 | return; 124 | } 125 | } 126 | self.startPoint = 0; 127 | } 128 | } 129 | } 130 | })() -------------------------------------------------------------------------------- /MouseGestures/Easydrag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/MouseGestures/Easydrag.png -------------------------------------------------------------------------------- /MouseGestures/MouseGestures.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/MouseGestures/MouseGestures.png -------------------------------------------------------------------------------- /MouseGestures/MouseGestures.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Mousegestures.uc.js 3 | // @namespace Mousegestures@gmail.com 4 | // @description 自定义鼠标手持,订阅修改自紫云飞代码 5 | // @author defpt 6 | // @charset UTF-8 7 | location == "chrome://browser/content/browser.xul" && (function () { 8 | ucjsMouseGestures = { 9 | lastX: 0, 10 | lastY: 0, 11 | sourceNode: "", 12 | directionChain: "", 13 | isMouseDownL: false, 14 | isMouseDownR: false, 15 | hideFireContext: false, 16 | shouldFireContext: false, 17 | GESTURES: { 18 | //强制转到页首 19 | "U" : { 20 | name : "转到页首", 21 | cmd : function () { 22 | goDoCommand('cmd_scrollTop'); 23 | } 24 | }, 25 | //强制转到页尾 26 | "D" : { 27 | name : "转到页尾", 28 | cmd : function (gestures, event) { 29 | goDoCommand('cmd_scrollBottom'); 30 | } 31 | }, 32 | //后退 33 | "L" : { 34 | name : "后退", 35 | cmd : function () { 36 | getWebNavigation().canGoBack && getWebNavigation().goBack(); 37 | } 38 | }, 39 | //前进 40 | "R" : { 41 | name : "前进", 42 | cmd : function () { 43 | getWebNavigation().canGoForward && getWebNavigation().goForward(); 44 | } 45 | }, 46 | //刷新当前页面 47 | "UD" : { 48 | name : "刷新当前页面", 49 | cmd : function () { 50 | gBrowser.mCurrentBrowser.reload(); 51 | } 52 | }, 53 | //刷新当前页面,故意重复,这个容易误识别 54 | "URD" : { 55 | name : "刷新当前页面", 56 | cmd : function () { 57 | gBrowser.mCurrentBrowser.reload(); 58 | } 59 | }, 60 | //激活左边的标签页 61 | "UL" : { 62 | name : "激活左边的标签页", 63 | cmd : function () { 64 | gBrowser.tabContainer.advanceSelectedTab(-1, true); 65 | } 66 | }, 67 | //激活右边的标签页 68 | "UR" : { 69 | name : "激活右边的标签页", 70 | cmd : function () { 71 | gBrowser.tabContainer.advanceSelectedTab(1, true); 72 | } 73 | }, 74 | //跳过缓存刷新当前页面 75 | "DU" : { 76 | name : "跳过缓存刷新当前页面", 77 | cmd : function () { 78 | BrowserReloadSkipCache(); 79 | } 80 | }, 81 | //跳过缓存刷新当前页面,故意重复,这个容易误识别 82 | "DRU" : { 83 | name : "跳过缓存刷新当前页面", 84 | cmd : function () { 85 | BrowserReloadSkipCache(); 86 | } 87 | }, 88 | //关闭所有标签页(不关闭 Pinned 标签,且在pinned页面上可用) 89 | "DL" : { 90 | name : "关闭所有标签页", 91 | cmd : function () { 92 | var tab = gBrowser.mCurrentTab; 93 | if (tab.pinned) { 94 | var tabs = gBrowser.mCurrentTab.boxObject; 95 | do { 96 | tab = tabs.nextSibling; 97 | while (tab.pinned) 98 | tab = tab.nextSibling; 99 | gBrowser.removeTab(tab); 100 | } while (tab); 101 | } else { 102 | gBrowser.removeAllTabsBut(tab); 103 | } 104 | gBrowser.removeCurrentTab(); 105 | } 106 | }, 107 | //关闭当前标签 108 | "DR" : { 109 | name : "关闭当前标签", 110 | cmd : function () { 111 | gBrowser.removeCurrentTab(); 112 | } 113 | }, 114 | //谷歌站内搜索 115 | "LU" : { 116 | name : "谷歌站内搜索", 117 | cmd : function (self) { 118 | var s = prompt('站内搜索——请输入待搜索字符串', ''); 119 | if (s.length > 0) 120 | gBrowser.addTab('http://www.google.de/search?q=site:' + encodeURIComponent(content.location.host) + ' ' + encodeURIComponent(s)); 121 | } 122 | }, 123 | //最小化窗口 124 | "LD" : { 125 | name : "最小化窗口", 126 | cmd : function (self) { 127 | self.isMouseDownR = false; 128 | setTimeout("minimize()", 10); 129 | } 130 | }, 131 | //恢复关闭的标签页 132 | "RL" : { 133 | name : "恢复关闭的标签页", 134 | cmd : function () { 135 | undoCloseTab(); 136 | } 137 | }, 138 | //uAutoPagerize2自动翻页上一页 139 | "RU" : { 140 | name : "自动翻页上一页", 141 | cmd : function (gestures, event) { 142 | var doc = event.target.ownerDocument; 143 | var win = doc.defaultView; 144 | if (win.ap) 145 | uAutoPagerize.gotoprev(win); 146 | else if (uAutoPagerize && doc.body && doc.body.getAttribute("name") == "MyNovelReader") 147 | uAutoPagerize.gotoprev(win, ".title"); 148 | else 149 | win.scrollByPages(-1); 150 | } 151 | }, 152 | //uAutoPagerize2自动翻页下一页 153 | "RD" : { 154 | name : "自动翻页下一页", 155 | cmd : function (gestures, event) { 156 | var doc = event.target.ownerDocument; 157 | var win = doc.defaultView; 158 | if (win.ap) 159 | uAutoPagerize.gotonext(win); 160 | else if (uAutoPagerize && doc.body && doc.body.getAttribute("name") == "MyNovelReader") 161 | uAutoPagerize.gotonext(win, ".title"); 162 | else 163 | win.scrollByPages(1); 164 | } 165 | }, 166 | //清理浏览痕迹 167 | "LUR" : { 168 | name : "清理浏览痕迹", 169 | cmd : function () { 170 | Cc['@mozilla.org/browser/browserglue;1'].getService(Ci.nsIBrowserGlue).sanitize(window); 171 | } 172 | }, 173 | }, 174 | init: function () { 175 | var self = this; 176 | ["mousedown", "mousemove", "mouseup", "contextmenu", "DOMMouseScroll", "dragend"].forEach(function (type) { 177 | gBrowser.mPanelContainer.addEventListener(type, self, true); 178 | }); 179 | window.addEventListener("unload", function () { 180 | ["mousedown", "mousemove", "mouseup", "contextmenu", "DOMMouseScroll", "dragend"].forEach(function (type) { 181 | gBrowser.mPanelContainer.removeEventListener(type, self, true); 182 | }); 183 | }, false); 184 | }, 185 | handleEvent: function (event) { 186 | switch (event.type) { 187 | case "mousedown": 188 | if(/object|embed/i.test(event.target.localName)) return; 189 | if (event.button == 2) { 190 | this.sourceNode = event.target; 191 | this.isMouseDownR = true; 192 | this.hideFireContext = false; 193 | [this.lastX, this.lastY, this.directionChain] = [event.screenX, event.screenY, ""]; 194 | } 195 | if (event.button == 2 && this.isMouseDownL) { 196 | this.isMouseDownR = false; 197 | this.shouldFireContext = false; 198 | this.hideFireContext = true; 199 | this.directionChain = "L>R"; 200 | this.stopGesture(event); 201 | } else if (event.button == 0) { 202 | this.isMouseDownL = true; 203 | if (this.isMouseDownR) { 204 | this.isMouseDownL = false; 205 | this.shouldFireContext = false; 206 | this.hideFireContext = true; 207 | this.directionChain = "L 0 ? subX : (-subX)), (subY > 0 ? subY : (-subY))]; 217 | var direction; 218 | if (distX < 10 && distY < 10) return; 219 | if (distX > distY) direction = subX < 0 ? "L" : "R"; 220 | else direction = subY < 0 ? "U" : "D"; 221 | if (direction != this.directionChain.charAt(this.directionChain.length - 1)) { 222 | this.directionChain += direction; 223 | XULBrowserWindow.statusTextField.label = this.GESTURES[this.directionChain] ? "手势: " + this.directionChain + " " + this.GESTURES[this.directionChain].name : "未知手势:" + this.directionChain; 224 | } 225 | this.lastX = event.screenX; 226 | this.lastY = event.screenY; 227 | } 228 | break; 229 | case "mouseup": 230 | if (event.ctrlKey && event.button == 2) { 231 | this.isMouseDownL = false; 232 | this.isMouseDownR = false; 233 | this.shouldFireContext = false; 234 | this.hideFireContext = false; 235 | this.directionChain = ""; 236 | event.preventDefault(); 237 | XULBrowserWindow.statusTextField.label = "取消手势"; 238 | break; 239 | } 240 | if (this.isMouseDownR && event.button == 2) { 241 | if (this.directionChain) this.shouldFireContext = false; 242 | this.isMouseDownR = false; 243 | this.directionChain && this.stopGesture(event); 244 | } else if (event.button == 0 && this.isMouseDownL) { 245 | this.isMouseDownL = false; 246 | this.shouldFireContext = false; 247 | } 248 | break; 249 | case "contextmenu": 250 | if (this.isMouseDownL || this.isMouseDownR || this.hideFireContext) { 251 | var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService); 252 | var contextmenu = pref.getBoolPref("dom.event.contextmenu.enabled"); 253 | pref.setBoolPref("dom.event.contextmenu.enabled", true); 254 | setTimeout(function () { 255 | pref.setBoolPref("dom.event.contextmenu.enabled", contextmenu); 256 | }, 10); 257 | event.preventDefault(); 258 | event.stopPropagation(); 259 | this.shouldFireContext = true; 260 | this.hideFireContext = false; 261 | } 262 | break; 263 | case "DOMMouseScroll": 264 | if (this.isMouseDownR) { 265 | event.preventDefault(); 266 | event.stopPropagation(); 267 | this.shouldFireContext = false; 268 | this.hideFireContext = true; 269 | this.directionChain = "W" + (event.detail > 0 ? "+" : "-"); 270 | this.stopGesture(event); 271 | } 272 | break; 273 | case "dragend": 274 | this.isMouseDownL = false; 275 | } 276 | }, 277 | stopGesture: function (event) { 278 | (this.GESTURES[this.directionChain] ? this.GESTURES[this.directionChain].cmd(this, event) & (XULBrowserWindow.statusTextField.label = "") : (XULBrowserWindow.statusTextField.label = "未知手势:" + this.directionChain)) & (this.directionChain = ""); 279 | } 280 | }; 281 | ucjsMouseGestures.init() 282 | })() -------------------------------------------------------------------------------- /MouseGestures/MouseGestures2.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Mousegestures.uc.js 3 | // @namespace Mousegestures@gmail.com 4 | // @description 自定义鼠标手势,搜集修改自网络各种代码,配置外放,自用 DIY版 5 | // @charset UTF-8 6 | location == "chrome://browser/content/browser.xul" && (function () { 7 | ucjsMouseGestures = { 8 | lastX: 0, 9 | lastY: 0, 10 | sourceNode: "", 11 | directionChain: "", 12 | isMouseDownL: false, 13 | isMouseDownR: false, 14 | hideFireContext: false, 15 | shouldFireContext: false, 16 | GESTURES: {}, 17 | createMenuitem: function() { 18 | var menuitem = document.createElement('menuitem'); 19 | menuitem.setAttribute('id', 'ucjsMouseGestures'); 20 | menuitem.setAttribute('label', 'MouseGestures'); 21 | menuitem.setAttribute('tooltiptext', '左键:重载配置\n右键:编辑配置'); 22 | menuitem.setAttribute('oncommand', 'ucjsMouseGestures.reload(true);'); 23 | menuitem.setAttribute('onclick', 'if (event.button == 2) { event.preventDefault(); closeMenus(event.currentTarget); ucjsMouseGestures.edit(ucjsMouseGestures.file); }'); 24 | var insPos = document.getElementById('devToolsSeparator'); 25 | insPos.parentNode.insertBefore(menuitem, insPos); 26 | }, 27 | init: function () { 28 | this.reload(); 29 | var self = this; 30 | ["mousedown", "mousemove", "mouseup", "contextmenu", "DOMMouseScroll", "dragend"].forEach(function (type) { 31 | gBrowser.mPanelContainer.addEventListener(type, self, true); 32 | }); 33 | window.addEventListener("unload", function () { 34 | ["mousedown", "mousemove", "mouseup", "contextmenu", "DOMMouseScroll", "dragend"].forEach(function (type) { 35 | gBrowser.mPanelContainer.removeEventListener(type, self, true); 36 | }); 37 | }, false); 38 | }, 39 | reload: function(isAlert) { 40 | var file = this.getMouseGesturesFile(); 41 | if (!file.exists()) return this.alert('Load Error: 配置文件不存在'); 42 | try { 43 | this.importMouseGestures(file); 44 | } catch (e) { 45 | this.alert('Error: ' + e + '\n请重新检查配置文件'); 46 | return; 47 | } 48 | if (isAlert) this.alert('配置已经重新载入'); 49 | }, 50 | alert: function(aString, aTitle) { 51 | Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService).showAlertNotification("", aTitle || "MouseGestures", aString, false, "", null); 52 | }, 53 | getMouseGesturesFile: function() { 54 | var aFile = Services.dirsvc.get("UChrm", Ci.nsILocalFile); 55 | aFile.appendRelativePath("Local\\_mouseGestures.js"); 56 | if (!aFile.exists() || !aFile.isFile()) return null; 57 | delete this.file; 58 | return this.file = aFile; 59 | }, 60 | importMouseGestures: function(file) { 61 | var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); 62 | var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); 63 | fstream.init(file, -1, 0, 0); 64 | sstream.init(fstream); 65 | var data = sstream.read(sstream.available()); 66 | try { 67 | data = decodeURIComponent(escape(data)); 68 | } catch (e) {} 69 | sstream.close(); 70 | fstream.close(); 71 | this.GESTURES = new Function('', 'return ' + data)(); 72 | return; 73 | }, 74 | edit: function(aFile) { 75 | if (!aFile || !aFile.exists() || !aFile.isFile()) return; 76 | var editor; 77 | try { 78 | editor = Services.prefs.getComplexValue("view_source.editor.path", Ci.nsILocalFile); 79 | } catch (e) { 80 | this.alert("请设置编辑器的路径。\nview_source.editor.path"); 81 | toOpenWindowByType('pref:pref', 'about:config?filter=view_source.editor.path'); 82 | return; 83 | } 84 | var UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); 85 | UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0 ? "gbk" : "UTF-8"; 86 | var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); 87 | 88 | try { 89 | var path = UI.ConvertFromUnicode(aFile.path); 90 | var args = [path]; 91 | process.init(editor); 92 | process.run(false, args, args.length); 93 | } catch (e) { 94 | this.alert("编辑器不正确!") 95 | } 96 | }, 97 | handleEvent: function (event) { 98 | switch (event.type) { 99 | case "mousedown": 100 | if(/object|embed/i.test(event.target.localName)) return; 101 | if (event.button == 2) { 102 | this.sourceNode = event.target; 103 | this.isMouseDownR = true; 104 | this.hideFireContext = false; 105 | [this.lastX, this.lastY, this.directionChain] = [event.screenX, event.screenY, ""]; 106 | } 107 | if (event.button == 2 && this.isMouseDownL) { 108 | this.isMouseDownR = false; 109 | this.shouldFireContext = false; 110 | this.hideFireContext = true; 111 | this.directionChain = "L>R"; 112 | this.stopGesture(event); 113 | } else if (event.button == 0) { 114 | this.isMouseDownL = true; 115 | if (this.isMouseDownR) { 116 | this.isMouseDownL = false; 117 | this.shouldFireContext = false; 118 | this.hideFireContext = true; 119 | this.directionChain = "L 0 ? subX : (-subX)), (subY > 0 ? subY : (-subY))]; 129 | var direction; 130 | if (distX < 10 && distY < 10) return; 131 | if (distX > distY) direction = subX < 0 ? "L" : "R"; 132 | else direction = subY < 0 ? "U" : "D"; 133 | if (direction != this.directionChain.charAt(this.directionChain.length - 1)) { 134 | this.directionChain += direction; 135 | XULBrowserWindow.statusTextField.label = this.GESTURES[this.directionChain] ? "\u624b\u52bf: " + this.directionChain + " " + this.GESTURES[this.directionChain].name : "\u672a\u77e5\u624b\u52bf:" + this.directionChain; 136 | } 137 | this.lastX = event.screenX; 138 | this.lastY = event.screenY; 139 | } 140 | break; 141 | case "mouseup": 142 | if (event.ctrlKey && event.button == 2) { 143 | this.isMouseDownL = false; 144 | this.isMouseDownR = false; 145 | this.shouldFireContext = false; 146 | this.hideFireContext = false; 147 | this.directionChain = ""; 148 | event.preventDefault(); 149 | XULBrowserWindow.statusTextField.label = "\u53d6\u6d88\u624b\u52bf"; 150 | break; 151 | } 152 | if (this.isMouseDownR && event.button == 2) { 153 | if (this.directionChain) this.shouldFireContext = false; 154 | this.isMouseDownR = false; 155 | this.directionChain && this.stopGesture(event); 156 | } else if (event.button == 0 && this.isMouseDownL) { 157 | this.isMouseDownL = false; 158 | this.shouldFireContext = false; 159 | } 160 | break; 161 | case "contextmenu": 162 | if (this.isMouseDownL || this.isMouseDownR || this.hideFireContext) { 163 | var pref = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService); 164 | var contextmenu = pref.getBoolPref("dom.event.contextmenu.enabled"); 165 | pref.setBoolPref("dom.event.contextmenu.enabled", true); 166 | setTimeout(function () { 167 | pref.setBoolPref("dom.event.contextmenu.enabled", contextmenu); 168 | }, 10); 169 | event.preventDefault(); 170 | event.stopPropagation(); 171 | this.shouldFireContext = true; 172 | this.hideFireContext = false; 173 | } 174 | break; 175 | case "DOMMouseScroll": 176 | if (this.isMouseDownR) { 177 | event.preventDefault(); 178 | event.stopPropagation(); 179 | this.shouldFireContext = false; 180 | this.hideFireContext = true; 181 | this.directionChain = "W" + (event.detail > 0 ? "+" : "-"); 182 | this.stopGesture(event); 183 | } 184 | break; 185 | case "dragend": 186 | this.isMouseDownL = false; 187 | } 188 | }, 189 | stopGesture: function (event) { 190 | (this.GESTURES[this.directionChain] ? this.GESTURES[this.directionChain].cmd(this, event) & (XULBrowserWindow.statusTextField.label = "") : (XULBrowserWindow.statusTextField.label = "\u672a\u77e5\u624b\u52bf:" + this.directionChain)) & (this.directionChain = ""); 191 | } 192 | }; 193 | ucjsMouseGestures.createMenuitem(); 194 | ucjsMouseGestures.init(); 195 | })() -------------------------------------------------------------------------------- /MouseGestures/README.md: -------------------------------------------------------------------------------- 1 | ###说明文档: 2 | 此脚本来自 [紫云飞的在线定制](http://www.cnblogs.com/ziyunfei/archive/2011/12/15/2289504.html) 3 | 这是可定制 Firefox 鼠标手势的脚本……作用就不用说了吧……不过我没有使用鼠标轨迹。是我最喜欢的脚本之一!!! 4 | 5 | [**MouseGestures.uc.js**](https://github.com/defpt/userChromeJs/blob/master/MouseGestures/MouseGestures.uc.js) 是紫大原版定制的脚本,当然里面自定义了一些紫大站点没有的自用手势 6 | 7 | [**MouseGestures2.uc.js**](https://github.com/defpt/userChromeJs/blob/master/MouseGestures/MouseGestures2.uc.js) ***把脚本文件和配置分离开了,这样修改后无需重启,重新载入配置文件即可生效。***为了统一管理自用配置,我把配置路径设为本地Firefox配置文件夹下的chrome\Local\,也就是说如果你想使用此处这个脚本,那么要把配置文件放到自己建立的chrome\Local\文件夹下 8 | 9 | **[_mouseGestures.js](https://github.com/defpt/userChromeJs/blob/master/MouseGestures/_mouseGestures.js)** 是 ***MouseGestures2.uc.js*** 的配置文件,放chrome\Local路径下即可 10 | 11 | [**EasyDrag.uc.js**](https://github.com/defpt/userChromeJs/tree/master/MouseGestures/EasyDrag.uc.js) 从紫大博客定制的自用拖拽脚本,修复一个拖拽链接bug以及添加一些自用功能,我的必备脚本之一 12 | 13 | ![MouseGestures](https://github.com/defpt/userChromeJs/blob/master/MouseGestures/MouseGestures.png?raw=true) 14 | ![EasyDrag](https://github.com/defpt/userChromeJs/blob/master/MouseGestures/Easydrag.png?raw=true) -------------------------------------------------------------------------------- /MouseGestures/_mouseGestures.js: -------------------------------------------------------------------------------- 1 | GESTURES = { 2 | //强制转到页首 3 | "U" : { 4 | name : "转到页首", 5 | cmd : function () { 6 | goDoCommand('cmd_scrollTop'); 7 | } 8 | }, 9 | //强制转到页尾 10 | "D" : { 11 | name : "转到页尾", 12 | cmd : function (gestures, event) { 13 | goDoCommand('cmd_scrollBottom'); 14 | } 15 | }, 16 | //后退 17 | "L" : { 18 | name : "后退", 19 | cmd : function () { 20 | getWebNavigation().canGoBack && getWebNavigation().goBack(); 21 | } 22 | }, 23 | //前进 24 | "R" : { 25 | name : "前进", 26 | cmd : function () { 27 | getWebNavigation().canGoForward && getWebNavigation().goForward(); 28 | } 29 | }, 30 | /* // 增强型后退,没后退翻到上一页 31 | "L" : { 32 | name : "后退", 33 | cmd : function () { 34 | var nav = gBrowser.webNavigation; 35 | if (nav.canGoBack) { 36 | nav.goBack(); 37 | } else { 38 | var document = window._content.document; 39 | var links = document.links; 40 | for(i = 0; i < links.length; i++) { 41 | if ((links[i].text == '上一頁') || (links[i].text == '上一页') || (links[i].text == '<上一页') || (links[i].text == '« 上一页') || (links[i].text == '<<上一页') || (links[i].text == '[上一页]') || (links[i].text == '翻上页') || (links[i].text == '【上一页】') || (links[i].text == 'Previous') || (links[i].text == 'Prev') || (links[i].text == 'previous') || (links[i].text == 'prev') || (links[i].text == '‹‹') || (links[i].text == '<')) document.location = links[i].href; 42 | } 43 | } 44 | } 45 | }, 46 | //增强型前进,没前进翻到下一页 47 | "R" : { 48 | name : "前进", 49 | cmd : function () { 50 | var nav = gBrowser.webNavigation; 51 | if (nav.canGoForward) { 52 | nav.goForward(); 53 | } else { 54 | var document = window._content.document; 55 | var links = document.links; 56 | for(i = 0; i < links.length; i++) { 57 | if ((links[i].text == '下一頁') || (links[i].text == '下一页') || (links[i].text == '下一页>') || (links[i].text == '下一页 »') ||(links[i].text == '下一页>>') || (links[i].text == '[下一页]') || (links[i].text == '翻下页') || (links[i].text == '【下一页】') || (links[i].text == 'Next') || (links[i].text == 'next') || (links[i].text == '››') || (links[i].text == '>')) document.location = links[i].href; 58 | } 59 | } 60 | } 61 | }, */ 62 | //刷新当前页面 63 | "UD" : { 64 | name : "刷新当前页面", 65 | cmd : function () { 66 | gBrowser.mCurrentBrowser.reload(); 67 | } 68 | }, 69 | //刷新当前页面,故意重复,这个容易误识别 70 | "URD" : { 71 | name : "刷新当前页面", 72 | cmd : function () { 73 | gBrowser.mCurrentBrowser.reload(); 74 | } 75 | }, 76 | //激活左边的标签页 77 | "UL" : { 78 | name : "激活左边的标签页", 79 | cmd : function () { 80 | gBrowser.tabContainer.advanceSelectedTab(-1, true); 81 | } 82 | }, 83 | //激活右边的标签页 84 | "UR" : { 85 | name : "激活右边的标签页", 86 | cmd : function () { 87 | gBrowser.tabContainer.advanceSelectedTab(1, true); 88 | } 89 | }, 90 | //跳过缓存刷新当前页面 91 | "DU" : { 92 | name : "跳过缓存刷新当前页面", 93 | cmd : function () { 94 | BrowserReloadSkipCache(); 95 | } 96 | }, 97 | //跳过缓存刷新当前页面,故意重复,这个容易误识别 98 | "DRU" : { 99 | name : "跳过缓存刷新当前页面", 100 | cmd : function () { 101 | BrowserReloadSkipCache(); 102 | } 103 | }, 104 | //关闭所有标签页(不关闭 Pinned 标签,且在pinned页面上可用) 105 | "DL" : { 106 | name : "关闭所有标签页", 107 | cmd : function () { 108 | var tab = gBrowser.mCurrentTab; 109 | if (tab.pinned) { 110 | var tabs = gBrowser.mCurrentTab.boxObject; 111 | do { 112 | tab = tabs.nextSibling; 113 | while (tab.pinned) 114 | tab = tab.nextSibling; 115 | gBrowser.removeTab(tab); 116 | } while (tab); 117 | } else { 118 | gBrowser.removeAllTabsBut(tab); 119 | } 120 | gBrowser.removeCurrentTab(); 121 | } 122 | }, 123 | //关闭当前标签 124 | "DR" : { 125 | name : "关闭当前标签", 126 | cmd : function () { 127 | gBrowser.removeCurrentTab(); 128 | } 129 | }, 130 | //最小化窗口 131 | "LD" : { 132 | name : "最小化窗口", 133 | cmd : function (self) { 134 | self.isMouseDownR = false; 135 | setTimeout("minimize()", 10); 136 | } 137 | }, 138 | //打开新标签 139 | "LR" : { 140 | name : "打开新标签", 141 | cmd : function () { 142 | BrowserOpenTab(); 143 | } 144 | }, 145 | //站内搜索 146 | "LU" : { 147 | name : "站内搜索", 148 | cmd : function () { 149 | var s = prompt('站内搜索——请输入待搜索字符串', ''); 150 | if (s.length > 0) 151 | gBrowser.addTab('http://www.google.de/search?q=site:' + encodeURIComponent(content.location.host) + ' ' + encodeURIComponent(s)); 152 | } 153 | }, 154 | //恢复关闭的标签页 155 | "RL" : { 156 | name : "恢复关闭的标签页", 157 | cmd : function () { 158 | undoCloseTab(); 159 | } 160 | }, 161 | //uAutoPagerize2自动翻页上一页 162 | "RU" : { 163 | name : "自动翻页上一页", 164 | cmd : function (gestures, event) { 165 | var doc = event.target.ownerDocument; 166 | var win = doc.defaultView; 167 | if (win.ap) 168 | uAutoPagerize.gotoprev(win); 169 | else if (uAutoPagerize && doc.body && doc.body.getAttribute("name") == "MyNovelReader") 170 | uAutoPagerize.gotoprev(win, ".title"); 171 | else 172 | win.scrollByPages(-1); 173 | } 174 | }, 175 | //uAutoPagerize2自动翻页下一页 176 | "RD" : { 177 | name : "自动翻页下一页", 178 | cmd : function (gestures, event) { 179 | var doc = event.target.ownerDocument; 180 | var win = doc.defaultView; 181 | if (win.ap) 182 | uAutoPagerize.gotonext(win); 183 | else if (uAutoPagerize && doc.body && doc.body.getAttribute("name") == "MyNovelReader") 184 | uAutoPagerize.gotonext(win, ".title"); 185 | else 186 | win.scrollByPages(1); 187 | } 188 | }, 189 | //清理浏览痕迹 190 | "LUR" : { 191 | name : "清理浏览痕迹", 192 | cmd : function () { 193 | Cc['@mozilla.org/browser/browserglue;1'].getService(Ci.nsIBrowserGlue).sanitize(window); 194 | } 195 | }, 196 | //添加到收藏夹 197 | "RULD" : { 198 | name : "添加到收藏夹", 199 | cmd : function () { 200 | PlacesCommandHook.bookmarkCurrentPage(true, PlacesUtils.bookmarksMenuFolderId); 201 | } 202 | }, 203 | //新建隐私窗口 204 | "URDL" : { 205 | name : "新建隐私窗口", 206 | cmd : function () { 207 | OpenBrowserWindow({ 208 | private : true 209 | }); 210 | } 211 | }, 212 | //清爽阅读 EverNote clearly 213 | "RULDR" : { 214 | name : "清爽阅读", 215 | cmd : function () { 216 | __readable_by_evernote.button__call(); 217 | } 218 | }, 219 | }; -------------------------------------------------------------------------------- /Picture/CSS+userjs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Picture/CSS+userjs.png -------------------------------------------------------------------------------- /Picture/ExternalAppBtn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Picture/ExternalAppBtn.png -------------------------------------------------------------------------------- /Picture/ExternalFuncBtn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Picture/ExternalFuncBtn.png -------------------------------------------------------------------------------- /Picture/FF29UI.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Picture/FF29UI.png -------------------------------------------------------------------------------- /Picture/README.md: -------------------------------------------------------------------------------- 1 | ###各种功能菜单 2 | ![ExternalFuncBtn](https://github.com/defpt/userChromeJs/blob/master/Picture/ExternalFuncBtn.png?raw=true) 3 | ![ExternalAppBtn](https://github.com/defpt/userChromeJs/blob/master/Picture/ExternalAppBtn.png?raw=true) 4 | ![rebuildAppmenu](https://github.com/defpt/userChromeJs/blob/master/Picture/rebuildAppmenu.png?raw=true) 5 | ###样式以及油猴脚本加载器菜单 6 | ![](https://github.com/defpt/userChromeJs/blob/master/Picture/CSS+userjs.png?raw=true) 7 | -------------------------------------------------------------------------------- /Picture/mynewtab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Picture/mynewtab.png -------------------------------------------------------------------------------- /Picture/rebuildAppmenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Picture/rebuildAppmenu.png -------------------------------------------------------------------------------- /Picture/tqyb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Picture/tqyb.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ##自用脚本的说明文档 2 | 3 | **个人经常访问的脚本资源站点**:[紫云飞原创脚本](http://www.cnblogs.com/ziyunfei/archive/2011/11/25/2263756.html)、 [饭友ywzhaiqi自用脚本](https://github.com/ywzhaiqi/userChromeJS) 、 [饭友lastdream2013自用脚本](https://github.com/lastdream2013/userChrome)、 [Alice00775 原创资源](https://github.com/alice0775/userChrome.js)、 [Griever 原创资源](https://github.com/Griever/userChromeJS)、[Mozilla 社区脚本资源](https://j.mozest.com/zh-CN/) 4 | 5 | **下面是一些自用(包括自写、修改、整理的)UC脚本** [此处是一些按钮图样](https://github.com/defpt/userChromeJs/blob/master/Picture/README.md) 6 | 7 | ###多文件脚本 8 | * [addMenuPlus](https://github.com/defpt/userChromeJs/tree/master/addMenuPlus) 神器级菜单设置脚本,我的必备脚本之一 9 | * [Appmenu](https://github.com/defpt/userChromeJs/blob/master/Appmenu) 自定义橙色菜单 10 | * [autoCopy](https://github.com/defpt/userChromeJs/tree/master/autoCopy) 自动复制选中内容,我的必备脚本之一 11 | * [DefaultFullZoom](https://github.com/defpt/userChromeJs/tree/master/Default%20Full%20Zoom%20Level) 可设置默认缩放百分比 12 | * [KeyChanger](https://github.com/defpt/userChromeJs/tree/master/KeyChanger) 快捷键设置uc脚本,我的必备脚本之一 13 | * [MouseGestures](https://github.com/defpt/userChromeJs/tree/master/MouseGestures) 鼠标手势脚本,我的必备脚本之一 14 | * [RefererChange](https://github.com/defpt/userChromeJs/tree/master/RefererChange) 破解图片外链外置配置版 15 | * [Sidebar](https://github.com/defpt/userChromeJs/blob/master/Sidebar) 从lastdream2013版的SidebarMod.uc.js修改而来的侧边栏加强脚本 16 | * [Stylish](https://github.com/defpt/userChromeJs/tree/master/Stylish) stylish 扩展辅助编辑功能脚本 17 | * [Translator](https://github.com/defpt/userChromeJs/blob/master/Translator) 翻译脚本 18 | * [userChrome](https://github.com/defpt/userChromeJs/blob/master/userChrome) **UC脚本引导器以及UC脚本管理器** 19 | 20 | ###单文件脚本 21 | * [000-AidBar.uc.js](https://github.com/defpt/userChromeJs/blob/master/000-AidBar.uc.js) 这是个按钮容器,位于标签栏,我用来辅助转移脚本并自动隐藏,hover 时显示~~~,[点击参看效果](http://bbs.kafan.cn/thread-1727795-1-1.html) 22 | * [ContextMenu.uc.js](https://github.com/defpt/userChromeJs/blob/master/ContextMenu.uc.js) 右键菜单,添加了几个右键菜单,现在我已经弃用,比起addmenuplus脚本差多了 23 | * [contextSearcher.uc.js](https://github.com/defpt/userChromeJs/blob/master/contextSearcher.uc.js) 右键搜索增强脚本,基于原版添加了搜索完成后自动清空搜索栏并切回默认搜索引擎,已经改用 addmenuplus 自行配制,以后不再维护 24 | * [EasyDrag.uc.js](https://github.com/defpt/userChromeJs/tree/master/MouseGestures) 从紫大博客定制的自用拖拽脚本,修复一个拖拽链接bug以及添加一些自用功能,我的必备脚本之一 25 | * [ExternalFuncBtn.uc.js](https://github.com/defpt/userChromeJs/blob/master/ExternalFuncBtn.uc.js) 多功能辅助按钮菜单, 以lastdream2013的代码为基础,整合了脚本 [JsToolsmenu.uc.js](https://github.com/defpt/userChromeJs/blob/master/JsToolsmenu.uc.js) 26 | * [HistoryMenu.uc.js](https://github.com/defpt/userChromeJs/blob/master/HistoryMenu) 历史按钮、左键打开菜单,右击恢复最后关闭的标签 27 | * [InFormEnterLite.uc.js](https://github.com/defpt/userChromeJs/blob/master/InFormEnterLite.uc.js) 填表脚本,被我搞成快速回复了,貌似这个比论坛灌水脚本支持范围更广,现已弃用,理由同ContextMenu.uc.js 28 | * [MemoryMonitor.uc.js](https://github.com/defpt/userChromeJs/blob/master/MemoryMonitor.uc.js) 简单的FF内存监视器 29 | * [quickProxy](https://github.com/defpt/userChromeJs/blob/master/quickProxyMod.uc.js) 快速切换代理 30 | * [ReadLater2.uc.js](https://github.com/defpt/userChromeJs/blob/master/ReadLater2.uc.js) 标记链接或当前网页以便稍后阅读 31 | * [TabPlus.uc.js](https://github.com/defpt/userChromeJs/blob/master/TabPlus.uc.js) 自用标签增强,整合多个功能,我的必备脚本之一 32 | * [Updatebookmarklite.uc.js](https://github.com/defpt/userChromeJs/blob/master/Updatebookmarklite.uc.js) 用来更新书签网址、名称 33 | * [openImgRar.uc.js](https://github.com/defpt/userChromeJs/blob/master/openImgRar.uc.js) 解密内涵图,已集成在addmenuplus脚本配置中 34 | * [Example](https://github.com/defpt/userChromeJs/blob/master/Example) 学习UC脚本笔记以及范例收藏 35 | -------------------------------------------------------------------------------- /Redirector/README.md: -------------------------------------------------------------------------------- 1 | ##说明文档: 2 | 3 | **Redirector.uc.js 原脚本来自[卡饭原帖](http://bbs.kafan.cn/thread-1621837-1-1.html),这里是规则外置版,微改自用...非常谢原作者大大的帮忙!!!** 4 | 5 | - 左键点击全局开关,右键点击打开菜单 6 | - 为了统一管理自用配置,我把配置路径设为本地Firefox配置文件夹下的chrome\Local\ 7 | - 鉴于地址栏按钮太多,按钮直接放在我写的[辅助栏](https://github.com/defpt/userChromeJs/blob/master/000-AidBar.uc.js)自动隐藏 8 | 9 | _**redirector.js** 是配置文件,如果你想使用此处这个自用版脚本,那么要把配置文件放到自己建立的 chrome\Local\ 文件夹下 10 | 11 | 12 | -------------------------------------------------------------------------------- /Redirector/_redirector.js: -------------------------------------------------------------------------------- 1 | rules = [ 2 | { 3 | name: "about:haoutil", // 规则名称 4 | from: "about:haoutil", // 需要重定向的地址 5 | to: "https://haoutil.googlecode.com", // 目标地址 6 | wildcard: false, // 可选,true 表示 from 是通配符 7 | regex: false, // 可选,true 表示 from 是正则表达式 8 | resp: false // 可选,true 表示替换 response body 9 | }, 10 | // { 11 | // name: "google链接加密", 12 | // from: /^http:\/\/(([^\.]+\.)?google\..+)/i, 13 | // exclude: /google\.cn/i, // 可选,排除例外规则 14 | // to: "https://$1", 15 | // regex: true 16 | // }, 17 | // { 18 | // name: "google搜索结果禁止跳转", 19 | // from: /^https?:\/\/www\.google\.com\/url\?.*url=([^&]*).*/i, 20 | // to: "$1", 21 | // regex: true 22 | // }, 23 | { 24 | name: "wiki中文>>简体中文", 25 | from: /\:\/\/zh\.wikipedia\.org\/(?!zh\-cn\/)[^\/]+/i, 26 | exclude: /favicon\.ico/i, 27 | to: '://zh.wikipedia.org/zh-cn', 28 | regex: true 29 | }, 30 | { 31 | name: "userscripts:8080", 32 | from: /^https?:\/\/userscripts\.org\/(.*)/i, 33 | to: "http:\/\/userscripts.org:8080/$1", 34 | regex: true 35 | }, 36 | { 37 | name: "WiKi链接加密", 38 | from: /^http:\/\/([^\/]+\.wikipedia\.org\/.+)/i, 39 | to: "https://$1", 40 | regex: true 41 | }, 42 | { 43 | // 包含手机版界面 44 | name: "百度随心听(音质改320)", 45 | from: /^http:\/\/music\.baidu\.com\/data\/music\/fmlink(.*[&\?])rate=[^3]\d+(.*)/i, 46 | to: "http://music.baidu.com/data/music/fmlink$1rate=320$2", 47 | regex: true 48 | } 49 | ]; -------------------------------------------------------------------------------- /RefererChange/README.md: -------------------------------------------------------------------------------- 1 | ##说明文档: 2 | ###破解图片外链脚本:基于黑名单、工具栏菜单版 3 | **RefererChanger.uc.js** 是基于原版的自用DIY版 4 | **RefererChanger2.uc.js** 是基于原版的配置分离自用DIY版 5 | _refererChanger.js 是RefererChanger2.uc.js的规则配置文件,要把配置文件放到 chrome\Local\ 文件夹下 6 | 7 | 8 | -------------------------------------------------------------------------------- /RefererChange/RefererChange.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name refererChanger.uc.js 3 | // @description 破解图片外链脚本,黑名单、工具菜单版、自用DIY版 4 | // @include main 5 | // @include chrome://browser/content/browser.xul 6 | // @charset utf-8 7 | // @version v2014.10.04 8 | // @note 添加某站点规则 9 | // ==/UserScript== 10 | /* 设置参数: 11 | @NORMAL:不改变referer 12 | @FORGE:发送根站点referer 13 | @ORIGINAL:发送打开站点referer 14 | @BLOCK : 发送空referer */ 15 | 16 | var refererChanger = {}; 17 | refererChanger.state = true; /* 启动时是否启用 */ 18 | refererChanger.enabledSrc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADdSURBVDhPtVNBCsIwEOwbxH+IR4sYk5RAexP8ki/x6A8EEf8iFi+91IsnnQ3ZkBbTRsGBoTvZnemS0kwpVYI38PUlyVNSQGhuEulDKMAKrfU8S4SUcsY+H+AaO9QtPe3kAGIBT6dbOzUA7/MFQG8GH/0NoHNw5aTFx4AYYD6CZyctkgOKoljyTLiF9/nCAfUW3DhJ+sQz4RZ81gkQQkwxdIeujTETfNo195l0Fg2A+cAa9R7PC+vg3G7BuhPA9Rj/E4DVcmqkAPewCAN++ROZNV1cRUWvMUr4rlLK6g1AWikHrFj7lgAAAABJRU5ErkJggg=="; 19 | refererChanger.disabledSrc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADESURBVDhPnVExDsIwDOwj+AgjC8HJBBsSX+I1PALxFwRiYSkLE5yNHblSWtWcdIp98V3Spss5b8Eb+ImwM6Dx5uccqvUHCGIupSxVmg321QAWiOiIuudVJiZQfT4gpfTWvpepCVRfLQA+GSGvv28QQTiAZ3CztbbjAagP4F5bgc0g4KxSOwDfvwAfMqGwfSOee+P1QQBOOPFqgH6xfaPdwvpBgIfpLfr9ZoBpY/QzUogrAPyHlQ+rMDHAu1rjZrzWlYh2X7nA+NaBJVlNAAAAAElFTkSuQmCC"; 20 | 21 | refererChanger.sites = { 22 | 'img.ph.126.net' : '@FORGE', 23 | 'isnowfy.com' : '@FORGE', 24 | 'image.itmedia.co.jp' : '@FORGE', 25 | '2ch.net' : '@FORGE', 26 | 'imepita.jp' : '@ORIGINAL', 27 | 'tumblr.com' : '@FORGE', 28 | 'photo.store.qq.com' : '@FORGE', 29 | 'img.pconline.com.cn' : '@FORGE', 30 | 'fc2.com' : '@BLOCK', 31 | 'blogs.yahoo.co.jp' : '@BLOCK', 32 | 'hentaiverse.net': '@BLOCK', 33 | 'photo.sina.com.cn':'@BLOCK', 34 | 'qlogo.cn':'@BLOCK', 35 | 'qpic.cn':'@BLOCK', 36 | 'fmn.rrfmn.com' : '@BLOCK', 37 | 'bdstatic.com' : 'http://tieba.baidu.com/', 38 | 'space.wenxuecity.com' : 'http://bbs.wenxuecity.com/', 39 | 'www.autoimg.cn' : 'http://club.autohome.com.cn/', 40 | 'kkkmh.com' : 'http://www.kkkmh.com/', 41 | 'nonie.1ting.com' : 'http://www.1ting.com/', 42 | 'sinaimg.cn' : 'http://blog.sina.com.cn/', 43 | 'yyets.com' : 'http://www.yyets.com/', 44 | 'img.knb.im' : 'http://www.kenengba.com/', 45 | 'tianya.cn' : 'http://bbs.tianya.cn/', 46 | 'baidu-img.cn' : 'http://www.baidu.com/', 47 | 'xici.net' : 'http://www.xici.net/', 48 | 'media.chinagate.com' : 'http://www.wenxuecity.com/', 49 | 'jdstatic.tankr.net' : 'http://jandan.net/', 50 | 'sankakustatic.com' : 'http://chan.sankakucomplex.com/', 51 | 'img.liufen.com': 'http://www.liufen.com.cn/', 52 | 'postimage.org' : '@FORGE', 53 | 'hiphotos.baidu.com' : '@FORGE', 54 | 'hiphotos.bdimg.com' : '@FORGE', 55 | 'img.cnbeta.com' : '@FORGE', 56 | 'imgsrc.baidu.com' : '@FORGE', 57 | 'zol.com.cn' : '@BLOCK', 58 | }; 59 | 60 | refererChanger.init = function() { 61 | var src = this.state ? this.enabledSrc : this.disabledSrc; 62 | var label = this.state ? "破解图片外链已启用" : "破解图片外链已禁用"; 63 | var menuitem = document.createElement('menuitem'); 64 | menuitem.setAttribute('id', 'RefererChanger'); 65 | menuitem.setAttribute('class', 'menuitem-iconic'); 66 | menuitem.setAttribute("tooltiptext", "破解图片外链开关"); 67 | menuitem.setAttribute("label", label); 68 | menuitem.setAttribute('src', src); 69 | menuitem.setAttribute('oncommand', 'refererChanger.RCToggle();'); 70 | document.getElementById('menu_ToolsPopup').appendChild(menuitem); 71 | 72 | var os = Cc['@mozilla.org/observer-service;1'].getService( 73 | Ci.nsIObserverService); 74 | os.addObserver(this, 'http-on-modify-request', false); 75 | 76 | }; 77 | refererChanger.RCToggle = function() { 78 | this.state = !this.state; 79 | let menuitem = document.getElementById('RefererChanger'); 80 | try { 81 | var src = this.state ? this.enabledSrc : this.disabledSrc; 82 | var label = this.state ? "破解图片外链已启用" : "破解图片外链已禁用"; 83 | menuitem.setAttribute("src", src); 84 | menuitem.setAttribute("label", label); 85 | } catch (e) {} 86 | }; 87 | 88 | // *********Config End********** 89 | //var statusbarHidden = true; 90 | refererChanger.adjustRef = function(http, site) { 91 | try { 92 | var sRef; 93 | var refAction = undefined; 94 | for (var i in this.sites) { 95 | if (site.indexOf(i) != -1) { 96 | refAction = this.sites[i]; 97 | break; 98 | } 99 | } 100 | 101 | if (refAction == undefined) return true; 102 | if (refAction.charAt(0) == '@') { 103 | //下はデバッグ用 104 | //logs.logStringMessage("ReferrerChanger: " + http.originalURI.spec + " : "+refAction); 105 | //logs.logStringMessage("ReferrerChanger: OriginalReferrer: "+http.referrer.spec); 106 | 107 | switch (refAction) { 108 | case '@NORMAL': 109 | return true; 110 | break; 111 | case '@FORGE': 112 | sRef = http.URI.scheme + "://" + http.URI.hostPort + "/"; 113 | break; 114 | case '@BLOCK': 115 | sRef = ""; 116 | break; 117 | case '@AUTO': 118 | return false; 119 | case '@ORIGINAL': 120 | sRef = window.content.document.location.href; 121 | break; 122 | default: 123 | //return false; 124 | break; 125 | } 126 | } else if (refAction.length == 0) { 127 | return true; 128 | } else { 129 | sRef = refAction; 130 | } 131 | http.setRequestHeader("Referer", sRef, false); 132 | if (http.referrer) http.referrer.spec = sRef; 133 | return true; 134 | } catch (e) {} 135 | return true; 136 | }; 137 | 138 | refererChanger.observe = function(aSubject, aTopic, aData) { 139 | if (aTopic != 'http-on-modify-request') return; 140 | if (!this.state) return; 141 | var http = aSubject.QueryInterface(Ci.nsIHttpChannel); 142 | for (var s = http.URI.host; s != ""; s = s.replace(/^.*?(\.|$)/, "")) { 143 | if (this.adjustRef(http, s)) return; 144 | } 145 | if (http.referrer && http.referrer.host != http.originalURI.host) http.setRequestHeader('Referer', http.originalURI.spec.replace(/[^/]+$/, ''), false); 146 | }; 147 | 148 | refererChanger.unregister = function() { 149 | var os = Cc['@mozilla.org/observer-service;1'].getService( 150 | Ci.nsIObserverService); 151 | os.removeObserver(this, 'http-on-modify-request', false); 152 | }; 153 | 154 | var added = false; 155 | if (location == "chrome://browser/content/browser.xul") { 156 | added = true; 157 | refererChanger.init(); 158 | } 159 | window.addEventListener("unload", function() { 160 | if (location == "chrome://browser/content/browser.xul") if (added) refererChanger.unregister(); 161 | }, false); -------------------------------------------------------------------------------- /RefererChange/RefererChange2.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name refererChanger 3 | // @include main 4 | // @include chrome://browser/content/browser.xul 5 | // @version v2014.10.04 6 | // @description 破解图片外链脚本,黑名单、工具菜单版、外置配置 自用DIY版 7 | // @note 添加某站点规则 8 | // ==/UserScript== 9 | // ◆設定方法 10 | // @NORMAL:不改变referer 11 | // @FORGE:发送根站点referer 12 | // @ORIGINAL:发送打开站点referer 13 | // @BLOCK : 发送空referer 14 | 15 | var refererChanger = {}; 16 | refererChanger.state = true; /* 启动时是否启用 */ 17 | refererChanger.fileName = 'Local\\_refererChange.js'; 18 | refererChanger.enabledSrc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADdSURBVDhPtVNBCsIwEOwbxH+IR4sYk5RAexP8ki/x6A8EEf8iFi+91IsnnQ3ZkBbTRsGBoTvZnemS0kwpVYI38PUlyVNSQGhuEulDKMAKrfU8S4SUcsY+H+AaO9QtPe3kAGIBT6dbOzUA7/MFQG8GH/0NoHNw5aTFx4AYYD6CZyctkgOKoljyTLiF9/nCAfUW3DhJ+sQz4RZ81gkQQkwxdIeujTETfNo195l0Fg2A+cAa9R7PC+vg3G7BuhPA9Rj/E4DVcmqkAPewCAN++ROZNV1cRUWvMUr4rlLK6g1AWikHrFj7lgAAAABJRU5ErkJggg=="; 19 | refererChanger.disabledSrc = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADESURBVDhPnVExDsIwDOwj+AgjC8HJBBsSX+I1PALxFwRiYSkLE5yNHblSWtWcdIp98V3Spss5b8Eb+ImwM6Dx5uccqvUHCGIupSxVmg321QAWiOiIuudVJiZQfT4gpfTWvpepCVRfLQA+GSGvv28QQTiAZ3CztbbjAagP4F5bgc0g4KxSOwDfvwAfMqGwfSOee+P1QQBOOPFqgH6xfaPdwvpBgIfpLfr9ZoBpY/QzUogrAPyHlQ+rMDHAu1rjZrzWlYh2X7nA+NaBJVlNAAAAAElFTkSuQmCC"; 20 | refererChanger.sites = {}; 21 | 22 | refererChanger.init = function() { 23 | this.reload(); 24 | var src = this.state ? this.enabledSrc : this.disabledSrc; 25 | var label = this.state ? "破解图片外链已启用" : "破解图片外链已禁用"; 26 | var menuitem = document.createElement('menuitem'); 27 | menuitem.setAttribute('id', 'RefererChanger'); 28 | menuitem.setAttribute('class', 'menuitem-iconic'); 29 | menuitem.setAttribute("tooltiptext", '左键开关、中键重载、右键配置'); 30 | menuitem.setAttribute("label", label); 31 | menuitem.setAttribute('src', src); 32 | menuitem.setAttribute('oncommand', 'refererChanger.RCToggle();'); 33 | menuitem.setAttribute('onclick', 'if (event.button == 2) {event.preventDefault();closeMenus(event.currentTarget); refererChanger.edit();}else if(event.button == 1) { event.preventDefault(); refererChanger.reload(true);}'); 34 | document.getElementById('menu_ToolsPopup').appendChild(menuitem); 35 | 36 | var os = Cc['@mozilla.org/observer-service;1'].getService( 37 | Ci.nsIObserverService); 38 | os.addObserver(this, 'http-on-modify-request', false); 39 | 40 | }; 41 | refererChanger.RCToggle = function() { 42 | this.state = !this.state; 43 | let menuitem = document.getElementById('RefererChanger'); 44 | try { 45 | var src = this.state ? this.enabledSrc : this.disabledSrc; 46 | var label = this.state ? "破解图片外链已启用" : "破解图片外链已禁用"; 47 | menuitem.setAttribute("src", src); 48 | menuitem.setAttribute("label", label); 49 | } catch (e) {} 50 | }; 51 | refererChanger.reload = function(isAlert) { 52 | var data = this.loadFile(this.fileName); 53 | if (!data) return; 54 | var sandbox = new Cu.Sandbox(new XPCNativeWrapper(window)); 55 | try { 56 | Cu.evalInSandbox(data, sandbox, "1.8"); 57 | } catch (e) { 58 | this.alert("Error: " + e + "\n请重新检查配置文件"); 59 | return; 60 | } 61 | 62 | this.sites = sandbox.sites; 63 | if (isAlert) this.alert("配置已经重新载入"); 64 | }; 65 | 66 | refererChanger.loadFile = function(aLeafName) { 67 | var aFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIDirectoryService).QueryInterface(Ci.nsIProperties).get('UChrm', Ci.nsILocalFile); 68 | aFile.appendRelativePath(aLeafName); 69 | if (!aFile.exists() || !aFile.isFile()) return null; 70 | var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream); 71 | var sstream = Cc["@mozilla.org/scriptableinputstream;1"].createInstance(Ci.nsIScriptableInputStream); 72 | fstream.init(aFile, -1, 0, 0); 73 | sstream.init(fstream); 74 | var data = sstream.read(sstream.available()); 75 | try { 76 | data = decodeURIComponent(escape(data)); 77 | } catch (e) {} 78 | sstream.close(); 79 | fstream.close(); 80 | return data; 81 | }; 82 | refererChanger.alert = function(aString, aTitle) { 83 | Cc['@mozilla.org/alerts-service;1'].getService(Ci.nsIAlertsService).showAlertNotification("", aTitle || "RefererChanger", aString, false, "", null); 84 | }; 85 | 86 | refererChanger.edit = function() { 87 | var aFile = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIDirectoryService).QueryInterface(Ci.nsIProperties).get('UChrm', Ci.nsILocalFile); 88 | aFile.appendRelativePath(this.fileName); 89 | if (!aFile || !aFile.exists() || !aFile.isFile()) return; 90 | var editor; 91 | try { 92 | editor = Services.prefs.getComplexValue("view_source.editor.path", Ci.nsILocalFile); 93 | } catch (e) { 94 | this.alert("请设置编辑器的路径。\nview_source.editor.path"); 95 | toOpenWindowByType('pref:pref', 'about:config?filter=view_source.editor.path'); 96 | return; 97 | } 98 | var UI = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter); 99 | UI.charset = window.navigator.platform.toLowerCase().indexOf("win") >= 0 ? "gbk" : "UTF-8"; 100 | var process = Cc['@mozilla.org/process/util;1'].createInstance(Ci.nsIProcess); 101 | 102 | try { 103 | var path = UI.ConvertFromUnicode(aFile.path); 104 | var args = [path]; 105 | process.init(editor); 106 | process.run(false, args, args.length); 107 | } catch (e) { 108 | this.alert("编辑器不正确!") 109 | } 110 | }; 111 | 112 | // *********Config End********** 113 | //var statusbarHidden = true; 114 | refererChanger.adjustRef = function (http, site) { 115 | try { 116 | var sRef; 117 | var refAction = undefined; 118 | for (var i in this.sites) { 119 | if(site.indexOf(i) != -1){ 120 | refAction = this.sites[i]; 121 | break; 122 | } 123 | } 124 | 125 | if (refAction == undefined) 126 | return true; 127 | if (refAction.charAt(0) == '@'){ 128 | //下はデバッグ用 129 | //logs.logStringMessage("ReferrerChanger: " + http.originalURI.spec + " : "+refAction); 130 | //logs.logStringMessage("ReferrerChanger: OriginalReferrer: "+http.referrer.spec); 131 | 132 | switch (refAction){ 133 | case '@NORMAL': 134 | return true; 135 | break; 136 | case '@FORGE': 137 | sRef = http.URI.scheme + "://" + http.URI.hostPort + "/"; 138 | break; 139 | case '@BLOCK': 140 | sRef = ""; 141 | break; 142 | case '@AUTO': 143 | return false; 144 | case '@ORIGINAL': 145 | sRef = window.content.document.location.href; 146 | break; 147 | default: 148 | //return false; 149 | break; 150 | } 151 | }else if(refAction.length == 0) { 152 | return true; 153 | }else{ 154 | sRef= refAction; 155 | } 156 | http.setRequestHeader("Referer", sRef, false); 157 | if (http.referrer) 158 | http.referrer.spec = sRef; 159 | return true; 160 | } catch (e) {} 161 | return true; 162 | }; 163 | 164 | refererChanger.observe = function (aSubject, aTopic, aData) { 165 | if (aTopic != 'http-on-modify-request') return; 166 | if (!this.state) return; 167 | var http = aSubject.QueryInterface(Ci.nsIHttpChannel); 168 | for (var s = http.URI.host; s != ""; s = s.replace(/^.*?(\.|$)/, "")){ 169 | if (this.adjustRef(http, s)) 170 | return; 171 | } 172 | if (http.referrer && http.referrer.host != http.originalURI.host) 173 | http.setRequestHeader('Referer', 174 | http.originalURI.spec.replace(/[^/]+$/,''), false); 175 | }; 176 | 177 | refererChanger.unregister = function () { 178 | var os = Cc['@mozilla.org/observer-service;1'].getService( 179 | Ci.nsIObserverService); 180 | os.removeObserver(this, 'http-on-modify-request', false); 181 | }; 182 | 183 | var added = false; 184 | if (location == "chrome://browser/content/browser.xul") { 185 | added = true; 186 | refererChanger.init(); 187 | } 188 | window.addEventListener("unload", function () { 189 | if (location == "chrome://browser/content/browser.xul") 190 | if (added) 191 | refererChanger.unregister(); 192 | }, false); 193 | 194 | -------------------------------------------------------------------------------- /RefererChange/_refererChange.js: -------------------------------------------------------------------------------- 1 | sites = { 2 | 'img.ph.126.net' : '@FORGE', 3 | 'isnowfy.com' : '@FORGE', 4 | 'image.itmedia.co.jp' : '@FORGE', 5 | '2ch.net' : '@FORGE', 6 | 'imepita.jp' : '@ORIGINAL', 7 | 'tumblr.com' : '@FORGE', 8 | 'photo.store.qq.com' : '@FORGE', 9 | 'img.pconline.com.cn' : '@FORGE', 10 | 'fc2.com' : '@BLOCK', 11 | 'blogs.yahoo.co.jp' : '@BLOCK', 12 | 'hentaiverse.net': '@BLOCK', 13 | 'photo.sina.com.cn':'@BLOCK', 14 | 'qlogo.cn':'@BLOCK', 15 | 'qpic.cn':'@BLOCK', 16 | 'fmn.rrfmn.com' : '@BLOCK', 17 | 'bdstatic.com' : 'http://tieba.baidu.com/', 18 | 'space.wenxuecity.com' : 'http://bbs.wenxuecity.com/', 19 | 'www.autoimg.cn' : 'http://club.autohome.com.cn/', 20 | 'kkkmh.com' : 'http://www.kkkmh.com/', 21 | 'nonie.1ting.com' : 'http://www.1ting.com/', 22 | 'sinaimg.cn' : 'http://blog.sina.com.cn/', 23 | 'yyets.com' : 'http://www.yyets.com/', 24 | 'img.knb.im' : 'http://www.kenengba.com/', 25 | 'tianya.cn' : 'http://bbs.tianya.cn/', 26 | 'baidu-img.cn' : 'http://www.baidu.com/', 27 | 'xici.net' : 'http://www.xici.net/', 28 | 'media.chinagate.com' : 'http://www.wenxuecity.com/', 29 | 'jdstatic.tankr.net' : 'http://jandan.net/', 30 | 'sankakustatic.com' : 'http://chan.sankakucomplex.com/', 31 | 'img.liufen.com': 'http://www.liufen.com.cn/', 32 | 'postimage.org' : '@FORGE', 33 | 'hiphotos.baidu.com' : '@FORGE', 34 | 'hiphotos.bdimg.com' : '@FORGE', 35 | 'img.cnbeta.com' : '@FORGE', 36 | 'imgsrc.baidu.com' : '@FORGE', 37 | 'zol.com.cn' : '@BLOCK', 38 | }; -------------------------------------------------------------------------------- /Sidebar/README.md: -------------------------------------------------------------------------------- 1 | ##侧边栏按钮以及功能增强 2 | 3 | ###列个单子吧: 4 | + 1、**SidebarPlus.uc.js** 这个是侧栏增强脚本,**必需!!!**功能来自lastdream2013版的SidebarMod.uc.js,我这里去除了某些我用不到的站点(这些功能最好按需自定义)以及Splitter,修改默认的侧栏书签为侧栏历史(缓存中无打开记录的情况),**前者多了个激活按钮:主页按钮右键,后者去除了这个激活按钮,因为配合浮动侧栏以后,侧栏是一直打开的,激活按钮根本用不到,当然都能直接用FF自代的按钮或快捷键打开** 5 | + 2、**[浮动侧栏样式](http://userstyles.org/styles/91562/auto-hide-sidebar-for-firefox-default-style?r=1375945924)**,这个是自动隐藏侧栏样式,**非必需** 有了它你可以一直开着侧栏打开某个适合侧栏的站点,比如我最长用谷哥翻译和豆瓣电台,所以我单独把这两个拉了出来,看图就明白了 6 | + 3、[Add-ons Manager - In the Sidebar](http://userstyles.org/styles/48731/add-ons-manager-in-the-sidebar) 这个是组件管理器侧栏样式 7 | + 4、[谷哥翻译侧栏样式](http://bbs.kafan.cn/thread-1587319-1-1.html) 这个样式是我在谷歌翻译改版以后自己写的,相关说明看帖子内容吧 8 | 9 | 上面3和4的两个样式可以使侧栏中的组件管理器和翻译页面完美显示,也就是**想要图中效果就的装** 10 | 11 | **此外就是 [Sidebar_S.uc.js](https://github.com/defpt/userChromeJs/blob/master/Sidebar/Sidebar_S.uc.js) 了,最近发现除了电台,其它站点很少使用,所以又来了个精简版,只保留了功能按钮、历史、组件、豆瓣电台** 12 | 13 | ###配合效果图 14 | 15 | ![ExternalFuncBtn](https://github.com/defpt/userChromeJs/blob/master/Sidebar/sidebar.png?raw=true) 16 | ![sidebar](https://github.com/defpt/userChromeJs/blob/master/Sidebar/sidebar.gif?raw=true) 17 | -------------------------------------------------------------------------------- /Sidebar/Sidebar_S.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Sidebar.uc.js 3 | // @description 侧边栏功能增强 4 | // @include chrome://browser/content/browser.xul 5 | // @charset UTF-8 6 | // ==/UserScript== 7 | (function() { 8 | if (!document.getElementById('sidebar-box')) return; 9 | if (!window.SidebarMod) { 10 | window.SidebarMod = { 11 | sitelist:[ 12 | { 13 | name: '书签', 14 | url: 'chrome://browser/content/bookmarks/bookmarksPanel.xul', 15 | favicon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAHCSURBVDhPlZE/SBxBFMY/olHEgFUStNVODKSSIAiBFJKApZAiYqWNWGqhYCPEO+90V43cYlC880BPFOz8U9hZKSEkpLFJYhEQNIfnzs4bYSZvLmNEPPTywQ/evPd9j9lZ3CXaQBfz1h3/T3oVNWoDOWbN1q5dvjj4Qq3jqAjXrl2eTICHKocRsQZlsbXtufH90hnU0wr21AqMxda258Y3pfOHTbTf06KW0SYz6KQsupmYWAKpLC9gRAaSlvGeeXeZxWu13dqqTz816/yXRtASfJHGuUqzuUzEAnSUxm/OetDfxuppAX44D0GLfN0ycN4ZfRhrKH6GMaMPonn0yxRO6COb7sB65GLtgM0Uw1cqvnyAPgrwkzEl+YAfKoVecxCU/iMXKX79WezSHJtLs12YwxNnvy3y8Vz4+EozbC6BmMZnvsUzZ78tOYVO4SFPHgeYMIFC6OHi6hx5OJWTeOPsN2VGUSmTGAnj0BwMKYktNYX2KImXNIkd27MzXjBojKlwsWuZWTyiODYpge9yAkPax2M3QsHDU5nAMM+OaQI5rX/VutG1zDjqZAypKI5XfJsq1/4nXljNsw4ZR2DOzur+doE/oEdo9V5pyj4AAAAASUVORK5CYII=' 16 | },{ 17 | name: '历史', 18 | url: 'chrome://browser/content/history/history-panel.xul', 19 | favicon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAH7SURBVDhPhVI9a9tQFBUeO4YOwZTSH+Ch1I2esIdi10jvPYsMmTLkH5Sm9lI8FIsOHUsU+gOMKSGEBNwiB5K9xJbdQJYQYtWIYEonL82HBhNe7316LnbT2AcOsu5759xzr6zdB+FoibPlTPL6OJMUQkuo8nwEtvGsx/TtgOuXASci6hripkMuoy7ZufaXnqtr/0eP69UeI7coDBjpH7JseLKXDW+6RhgbGbdg9F5dj3FeNAryyck7KeR6GHCDYs2y6JZpss/4O+rq5oRRFWsS0PEXRD4G4QjFOLc6mjJAXPlLi2iCSa78zFNZhK6tuDMRMELwo0hWcYF49q8BIvINiimAcR2EW2MDxcO+nX5sWdYT06TnlsXOKKWP5GWFeBQylC89Tj6gEEa5gD2syCIAujdALJCQ4hRYi8lp1CENTPH7e/ohGqyhyU87/UBpJUC4O2mA4yAhDc81aSPfhPqBuaCu3wXGHu+Ac76oyhJ5j4U5j8UjIF59+pYsua2N8uaR/Hyz8HKf2dg936R1VdK0dbeTeuO2R6WN1uD1ZntqYZMofCkkofsAOHrhFVOqHKPktt8CBZqsu77tOOLv/99xnETOo1yKoTvsoKKOpgFjVGQSZQT0QPAVBBcyNnS+VzwGjgNGdTAaopHsCAsD1u7Enofyx6OFmZ9K07Q/7iAmIuxhVMIAAAAASUVORK5CYII=' 20 | },{ 21 | name: '附加组件', 22 | url: 'chrome://mozapps/content/extensions/extensions.xul', 23 | favicon: "chrome://mozapps/skin/extensions/extensionGeneric-16.png#-moz-resolution=16,16" 24 | },{ 25 | name: '豆瓣电台', 26 | url: 'http://douban.fm/partner/sidebar', 27 | favicon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKySURBVDhPpVJNSBtBFN7WQ6FQKIReemhBKCL04qFUFDFas5pkk12TXTc21p80qQaTCv4RazWbxEOoUBPjGlc02BA1teaQUlJEivRSL948lJyL50KhaBMzr7PrVmmt9NAPPt43s/O+efP2ERcBAC6p8t8YGhq6PTY29qC/v1+jbp3C7/df5jiuDMuLDb1e742mpiZPO8/HR0dHQ5OTk/zAwMB9n8/3m+HGxkaZbChT3TqP8vLyWxUVFXatVjvudDoHXS6Xc3h4mMSG19Uj55FOp+/m8/nura2tDlEU+flYjEomk9bt7e2JXC63ub6+9ml5eXkvlUoldnY+uHd3dy2SJF1V0wkiGAyuZbNvQVqQjl9n38Grj3uwlkrBykryaHFx5Ws8Lh1K0iLMzYkwMxOFXO596eDgy4toNHpFMXC73Zse71NEUVTB1N0L956/RBaTGbg2G3AcDyzLg8FAHet05LFW21j0+wXY39/PV1VV3VQM+vr63jwbn0CP7B2F7kEfosJLyNXjQE963ain5zHi+XbEcTZksz1EFgtXFIQgymTSn3GvTgw8Hs8m7gNEItGiKM6DGF8AEZeL+4HLnoMYphwjkQjCZZdWV1dRIpFYwgbXFAO73Z7BVYDZbC5arVZgrRaQ4xlZhTRDl0wmE0xPTxe6urpalGQZeFAUg9ZWpog1fvcfZE9iG8chhqFROBwudnZ2tqrpBEHTdMbhcCAjZSwwDINoWiaNDzNKgryWNW5yyWA0IkEQiizLnhno9fqszWaD+vr6EkmSQDbrQI46WZPNiiZ1siahoaEBRkZGEH4uq6YTBH5XanZ29kcgEPg+NTV1KASEI3yLysCpDoVCh3iMj2Kx2Dc8+gY1nSAqKyvv4Nup2tpafXV1dUtNTY3hb/z1ra6urlGj0Zz8gf8DQfwE+1lqxfLEhu8AAAAASUVORK5CYII=' 28 | }], 29 | 30 | makeButton: function (sitelist) { 31 | var i, 32 | len = sitelist.length, 33 | item, 34 | btn, 35 | frag = document.createDocumentFragment(); 36 | insertpoint = document.querySelector('#sidebar-header .close-icon'); 37 | for (i = 0; i < len; i++) { 38 | item = sitelist[i]; 39 | btn = frag.appendChild(document.createElement('toolbarbutton')); 40 | btn.setAttribute('tooltiptext', item.name); 41 | btn.setAttribute('style', 'list-style-image: url("' + item.favicon + '")'); 42 | btn.setAttribute('url', item.url); 43 | btn.setAttribute('onclick', 'openWebPanel(this.getAttribute("tooltiptext"), this.getAttribute("url"))'); 44 | } 45 | insertpoint.parentNode.insertBefore(frag, insertpoint); 46 | }, 47 | 48 | toggleSidebar: function (commandID, forceOpen) { 49 | var sidebarBox = document.getElementById("sidebar-box"), 50 | sidebar = document.getElementById("sidebar"), 51 | sidebarTitle = document.getElementById("sidebar-title"), 52 | sidebarBoxArrow = document.getElementById('sidebar-box-arrow'), 53 | lastcommand = commandID || sidebarBox.getAttribute('sidebarcommand') || sidebarBox.getAttribute('sidebarlastcommand') || 'viewHistorySidebar'; 54 | 55 | if (!commandID && sidebarBox.hidden) { 56 | if (sidebarBox.getAttribute('sidebarcommand') === '') { 57 | toggleSidebar(lastcommand, true); 58 | sidebarBox.setAttribute('sidebarlastcommand', lastcommand); 59 | } else { 60 | sidebarBox.hidden = false; 61 | if (sidebarBoxArrow) sidebarBoxArrow.className = ''; 62 | } 63 | return; 64 | } 65 | 66 | if (!commandID) commandID = sidebarBox.getAttribute("sidebarcommand"); 67 | let sidebarBroadcaster = document.getElementById(commandID); 68 | 69 | if (sidebarBroadcaster.getAttribute("checked") == "true") { 70 | if (!forceOpen) { 71 | if (sidebarBox.getAttribute('sidebarcommand') !== 'viewWebPanelsSidebar') { 72 | sidebar.setAttribute("src", "about:blank"); 73 | sidebar.docShell.createAboutBlankContentViewer(null); 74 | sidebarBox.setAttribute("sidebarcommand", ""); 75 | sidebarTitle.value = ""; 76 | sidebarBox.setAttribute('sidebarlastcommand', lastcommand); 77 | } 78 | sidebarBox.setAttribute("sidebarcommand", ""); 79 | sidebarBox.setAttribute('sidebarlastcommand', lastcommand); 80 | sidebarBroadcaster.removeAttribute("checked"); 81 | sidebarBox.hidden = true; 82 | if (sidebarBoxArrow) sidebarBoxArrow.className = 'right'; 83 | gBrowser.selectedBrowser.focus(); 84 | } else { 85 | fireSidebarFocusedEvent(); 86 | } 87 | return; 88 | } 89 | 90 | var broadcasters = document.getElementsByAttribute("group", "sidebar"); 91 | for (let broadcaster of broadcasters) { 92 | if (broadcaster.localName != "broadcaster") continue; 93 | if (broadcaster != sidebarBroadcaster) broadcaster.removeAttribute("checked"); 94 | else sidebarBroadcaster.setAttribute("checked", "true"); 95 | } 96 | 97 | sidebarBox.hidden = false; 98 | if (sidebarBoxArrow)sidebarBoxArrow.className = ''; 99 | 100 | var url = sidebarBroadcaster.getAttribute("sidebarurl"); 101 | var title = sidebarBroadcaster.getAttribute("sidebartitle"); 102 | if (!title) title = sidebarBroadcaster.getAttribute("label"); 103 | sidebar.setAttribute("src", url); 104 | sidebarBox.setAttribute("sidebarcommand", sidebarBroadcaster.id); 105 | if ( title && title !== '') sidebarTitle.value = title; 106 | sidebarBox.setAttribute("src", url); 107 | sidebarBox.setAttribute('sidebarlastcommand', lastcommand); 108 | 109 | if (sidebar.contentDocument.location.href != url) sidebar.addEventListener("load", sidebarOnLoad, true); 110 | else fireSidebarFocusedEvent(); 111 | }, 112 | 113 | modifySidebarClickBehaviour: function () { 114 | var sidebar = document.getElementById('sidebar'); 115 | sidebar.addEventListener('DOMContentLoaded', function(){ 116 | if (sidebar.contentDocument){ 117 | sidebar.removeEventListener('DOMContentLoaded', arguments.callee, false); 118 | var wpb = sidebar.contentDocument.getElementById('web-panels-browser'); 119 | if (wpb) { 120 | wpb.onclick = null; 121 | } 122 | } 123 | }, false); 124 | 125 | eval("window.asyncOpenWebPanel = " + window.asyncOpenWebPanel.toString().slice(0, -1) + 126 | 'var wpb = sidebar.contentDocument.getElementById("web-panels-browser");' + 127 | 'if (wpb) wpb.onclick = null;' + '}' 128 | ); 129 | 130 | eval("window.openWebPanel = " + window.openWebPanel.toString().slice(0, -1) + 131 | 'var wpb = sidebar.contentDocument.getElementById("web-panels-browser");' + 132 | 'if (wpb) wpb.onclick = null;' + '}' 133 | ); 134 | }, 135 | 136 | init: function() { 137 | window.toggleSidebar = this.toggleSidebar; 138 | this.makeButton(this.sitelist); 139 | this.modifySidebarClickBehaviour(); 140 | } 141 | }; 142 | 143 | SidebarMod.init(); 144 | } 145 | })(); 146 | -------------------------------------------------------------------------------- /Sidebar/sidebar.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Sidebar/sidebar.gif -------------------------------------------------------------------------------- /Sidebar/sidebar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Sidebar/sidebar.png -------------------------------------------------------------------------------- /Stylish/README.md: -------------------------------------------------------------------------------- 1 | ##说明文档: 2 | 给Stylish扩展添加一些辅助编辑功能 3 | 4 | 5 | **[stylish0.5_edit.uc.js](https://github.com/defpt/userChromeJs/blob/master/Stylish/stylish0.5_edit.uc.js)** y大修改版,我删除了添加文本功能,因为功能在下面脚本也有 6 | 7 | **[StylishCustom.uc.js](https://github.com/defpt/userChromeJs/blob/master/Stylish/StylishCustom.uc.js)** 来自贴吧 [黒仪大螃蟹的脚本](http://tieba.baidu.com/p/2541544018?pn=1) , 这里的自用版修改了按钮位置到扩展的预览后面 8 | 9 | **stylish编辑器效果图** 10 | 11 | ![stylish编辑器效果图](https://github.com/defpt/userChromeJs/blob/master/Stylish/Stylish.png?raw=true) 12 | 13 | -------------------------------------------------------------------------------- /Stylish/Stylish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Stylish/Stylish.png -------------------------------------------------------------------------------- /TabPlus.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name TabPlus.uc.js 3 | // @description 自用整合版标签增强 4 | // @namespace TabPlus@gmail.com 5 | // @include chrome://browser/content/browser.xul 6 | // @include chrome://browser/content/bookmarks/bookmarksPanel.xul 7 | // @include chrome://browser/content/history/history-panel.xul 8 | // @include chrome://browser/content/places/places.xul 9 | // @Note 2014.09.18 最后一次修正整合 by defpt 10 | // ==/UserScript== 11 | (function() { 12 | // 新标签打开:书签、历史、搜索栏 13 | try { 14 | eval('openLinkIn=' + openLinkIn.toString(). 15 | replace('w.gBrowser.selectedTab.pinned', '(!w.isTabEmpty(w.gBrowser.selectedTab) || $&)'). 16 | replace(/&&\s+w\.gBrowser\.currentURI\.host != uriObj\.host/, '')); 17 | }catch(e){} 18 | 19 | // 地址栏新标签打开 20 | try { 21 | location=="chrome://browser/content/browser.xul" && 22 | eval("gURLBar.handleCommand="+gURLBar.handleCommand.toString().replace(/^\s*(load.+);/gm, 23 | "if(/^javascript:/.test(url)||isTabEmpty(gBrowser.selectedTab)){loadCurrent();}else{this.handleRevert();gBrowser.loadOneTab(url, {postData: postData, inBackground: false, allowThirdPartyFixup: true});}")); 24 | }catch(e){} 25 | 26 | //中键点击bookmark菜单不关闭 27 | try { 28 | eval('BookmarksEventHandler.onClick =' + BookmarksEventHandler.onClick.toString().replace('node.hidePopup()', '')); 29 | eval('checkForMiddleClick =' + checkForMiddleClick.toString().replace('closeMenus(event.target);', '')); 30 | } catch(e) {} 31 | 32 | //右键关闭标签页,ctrl+右键打开菜单 33 | gBrowser.mTabContainer.addEventListener("click", 34 | function(e) { 35 | if (e.target.localName == "tab" && e.button == 2 && !e.ctrlKey) { 36 | e.preventDefault(); 37 | gBrowser.removeTab(e.target); 38 | e.stopPropagation(); 39 | } 40 | }, 41 | false); 42 | 43 | // 关闭当前标签页回到左边标签 44 | try { 45 | eval("gBrowser._blurTab = " + gBrowser._blurTab.toString().replace('this.selectedTab = tab;', "this.selectedTab = aTab.previousSibling? aTab.previousSibling : tab;")); 46 | }catch(e){}; 47 | 48 | //自动关闭下载产生的空白标签 49 | eval("gBrowser.mTabProgressListener = " + gBrowser.mTabProgressListener.toString().replace(/(?=var location)/, '\ 50 | if (aWebProgress.DOMWindow.document.documentURI == "about:blank"\ 51 | && aRequest.QueryInterface(nsIChannel).URI.spec != "about:blank") {\ 52 | aWebProgress.DOMWindow.setTimeout(function() {\ 53 | !aWebProgress.isLoadingDocument && aWebProgress.DOMWindow.close();\ 54 | }, 100);\ 55 | }\ 56 | ')); 57 | 58 | })(); 59 | -------------------------------------------------------------------------------- /Translator/JsTranslator.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name JsTranslator.uc.js 3 | // @namespace JsTranslator@gmail.com 4 | // @description 翻译合集,注释了一些我不常用的,可通过注释自行选择, 5 | // 默认图标设在了地址栏,取消13、14、23行注释符号//, 6 | // 注释掉25行可变为可移动按钮 7 | // @charset UTF-8 8 | // @author defpt 9 | // @version 1.0.0 2013.02.25 10 | // ==/UserScript== 11 | (function ToolsBtn() { 12 | function createBtn() { 13 | //var navigator = document.getElementById("navigator-toolbox"); 14 | //if (!navigator || navigator.palette.id !== "BrowserToolbarPalette") return; 15 | var Btn = document.createElement("toolbarbutton"); 16 | Btn.id = "JsTranslator"; 17 | Btn.setAttribute("type", "menu"); 18 | Btn.setAttribute("class", "toolbarbutton-1 chromeclass-toolbar-additional"); 19 | Btn.setAttribute("removable", "true"); 20 | Btn.style.listStyleImage = "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAMpSURBVDhPJZPdTxRXGMZHcGZ2ZrVeNOnXRXvZtPGiJk2t1SjsAmLRsgu7y5IQmzQNqSE1ppZlP2Fx2V3YDz4sxWIU64K2UAiiFgtpbQLGmKjhqknTi9rrJv0bfn3P4eLJycyZ3/M+73nPGN7oZZzoFN6uSdyucfZ3i7oqOOGSaBQ3XGRfpIg3nMfuyGEHL2EFs1iBIUx/BsMV2NXwBHa4ivHJKHuCYwKP4QkVqQ8WME5fwmgTSGA7OLwLt6TZ25gSAwVHx7EEfrmnSu/EdQ6dnxKjAp7OPG+cLdI+NE1A5HQOYwYGsVoyGt7r0wYTUr2KE6lKzDGurCzxbGeD97+sUPt5hZmlGi/+fsSff23zSvcge5rSmL409QKbykCBTqSCGynr+MaZHO/1VTjUV+bew2Wqt2r8+nid4xdl35/Cbc5gN6nqSS3DFdgJl6XfUd75osqV1RU+LV/FOJ7iowsV/nnxmOd/bHG0bwzj2ADGYdHROJbApjoDK1TmpWiJ0sI8D7eX+e/fHYZv1OjOfcMvW6tS/T65a3NsPVmXRKtkvv2Otq9K1DcmsfySwCPjUtXfPTfB270lrq4ucm58huL8TXryk2LwgLXNZfpGJyl9f5OZH2sEYmXqGySFNhDYkXEZZ0Y40DXC/L0fiOSmOdhb4PPCZZ7s/MZPD5Y4daFIXYPEPxKTFgbkDiTkEBPKoIgbKlDXnuOI7nmbpzvrzC7eIDk9y/bTTdY2Frl9Z467m7d4KzQkE0hIdZEvLgYyazeUx2gdInt9jo1Hd3kzkiWaHte6//sa/VOzvH46xcGzOfa3qvGpQ4zr1bA78njkipqBYV7tGeG1Tpl1g0Q7IZsffs21lQU+y8nF+uCiHJwCEzLGXQPLJy3p+92hrmgW82RKNpN4T6XwSiXbH6d2Z4H2/oqMsB+3JYFHoqv3pn8Ae9dAfo5AFs/HafadTOIK6LQktUz5MJquSN+D1DUKIJXtJlnlvSUG+gxsgZ22DK5U11JwszJIaBknYvpjT7NAAntElj8m/YuRmBqurqzgtAASXaVQUZWBQN7WuKzyrCqrBALb/n5tYvli/A/bgheQIo8aZgAAAABJRU5ErkJggg==)"; 21 | Btn.setAttribute("label","JsTranslator"); 22 | //Btn.setAttribute("tooltiptext","JsTranslator"); 23 | //navigator.palette.appendChild(Btn); 24 | //status-bar urlbar-icons addon-bar alltabs-button TabsToolbar go-button 25 | document.getElementById("urlbar-icons").appendChild(Btn);//地址栏 26 | 27 | Popup = document.createElement("menupopup"); 28 | //Popup.setAttribute("position", "after_end");//适合放右边 29 | Btn.appendChild(Popup); 30 | 31 | for (let i = 0, menu; menu = mMenus[i]; i++) { 32 | let menuItem; 33 | if (menu.label == "-") { 34 | menuItem = document.createElement("menuseparator"); 35 | } else { 36 | menuItem = document.createElement("menuitem"); 37 | menuItem.setAttribute("label", menu.label); 38 | menuItem.setAttribute('class', 'menuitem-iconic'); 39 | menuItem.setAttribute("oncommand", menu.command); 40 | menuItem.setAttribute("image", menu.image); 41 | } 42 | Popup.appendChild(menuItem); 43 | } 44 | } 45 | 46 | var mMenus = [ 47 | { 48 | label: "S-划词翻译", 49 | command: "shangyi();", 50 | image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAMpSURBVDhPJZPdTxRXGMZHcGZ2ZrVeNOnXRXvZtPGiJk2t1SjsAmLRsgu7y5IQmzQNqSE1ppZlP2Fx2V3YDz4sxWIU64K2UAiiFgtpbQLGmKjhqknTi9rrJv0bfn3P4eLJycyZ3/M+73nPGN7oZZzoFN6uSdyucfZ3i7oqOOGSaBQ3XGRfpIg3nMfuyGEHL2EFs1iBIUx/BsMV2NXwBHa4ivHJKHuCYwKP4QkVqQ8WME5fwmgTSGA7OLwLt6TZ25gSAwVHx7EEfrmnSu/EdQ6dnxKjAp7OPG+cLdI+NE1A5HQOYwYGsVoyGt7r0wYTUr2KE6lKzDGurCzxbGeD97+sUPt5hZmlGi/+fsSff23zSvcge5rSmL409QKbykCBTqSCGynr+MaZHO/1VTjUV+bew2Wqt2r8+nid4xdl35/Cbc5gN6nqSS3DFdgJl6XfUd75osqV1RU+LV/FOJ7iowsV/nnxmOd/bHG0bwzj2ADGYdHROJbApjoDK1TmpWiJ0sI8D7eX+e/fHYZv1OjOfcMvW6tS/T65a3NsPVmXRKtkvv2Otq9K1DcmsfySwCPjUtXfPTfB270lrq4ucm58huL8TXryk2LwgLXNZfpGJyl9f5OZH2sEYmXqGySFNhDYkXEZZ0Y40DXC/L0fiOSmOdhb4PPCZZ7s/MZPD5Y4daFIXYPEPxKTFgbkDiTkEBPKoIgbKlDXnuOI7nmbpzvrzC7eIDk9y/bTTdY2Frl9Z467m7d4KzQkE0hIdZEvLgYyazeUx2gdInt9jo1Hd3kzkiWaHte6//sa/VOzvH46xcGzOfa3qvGpQ4zr1bA78njkipqBYV7tGeG1Tpl1g0Q7IZsffs21lQU+y8nF+uCiHJwCEzLGXQPLJy3p+92hrmgW82RKNpN4T6XwSiXbH6d2Z4H2/oqMsB+3JYFHoqv3pn8Ae9dAfo5AFs/HafadTOIK6LQktUz5MJquSN+D1DUKIJXtJlnlvSUG+gxsgZ22DK5U11JwszJIaBknYvpjT7NAAntElj8m/YuRmBqurqzgtAASXaVQUZWBQN7WuKzyrCqrBALb/n5tYvli/A/bgheQIo8aZgAAAABJRU5ErkJggg==", 51 | }, 52 | { 53 | label: "B-划词翻译", 54 | command: "bingwordtran();", 55 | image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKaSURBVDhPfVJbSBRhFP6RwohKQ9PUtqASkyRJSc1rBAZdHgwKIXq0oh56sZCM6PJQWUaQERGZD+aDWFBBQRHddt2dnRks3EjcaFctyUu5W2m2uzPzdc6/6W4Q/fDtzJzzfed8/9kjtIpl+B/0quVw5SWiO1tA5+9K2195oVdy8F+wQd+0AurGNHiP7IX/fD20soxo0TgeOciiYAzcUa+ykTAd7uJUOPPmYbK/F3x6tudBLUmDRsIZvlDLs6CWZxIoQF2VwiSJnq256N1Tgdc1BRjpuon3jXVwrpsPjYvHaYRalglNiumu65PQd2gnAo4nCH8dg2lEYFkmwhPjGH/Uib6DNcRZJLmsYa1QyYZCdh1rEuBrOiqtfvfomHA+le9GOCSffCzLgv9ig+Syhl0IpSgVenU2fOfqYYZ+MQujDzrQs6sEQzeaMHDlJAavnkGIHHEBdsVcvXo13DQP8SJT4FNrs+xgTk9J0tjDTrzdvwPG1A+YkTCG21vgPXFA5ozpn5LLGvsqAdGdvxBvaksxeq9dEizTwIT9Md4d3o3ItyAsw8BwxzX00xA5Z5mm5LLGWZAM4aZ7OAsXw56TgJG7bbI6n5H7t+Gj+w5eP0vXOEVuJqPxO7cklzVu2guh0D2U0gwaylIKJsPffIz+d48kzxyLMD30AT7KMYe5UsMzcNGmubgITdVFCXvuHHjqtsF3oQH+S40YaDktn9qWHMrNJU56lEsa1kYd8AdjQwrcm1ciQsPjEw58QSQYkO8f2y7DQVupkG3Z8A+EUrwEElygKAUKLcjnrlYElOcIaq8QVF8i4HoG7/F96M5fIF3OagjCRT+zoCJO2gvuZF+bGAN9O1jMTeL5BMGCeHBQoRVlJ/HgzpJD+Rg/Fb8BRfqae7uMECUAAAAASUVORK5CYII=", 56 | }, 57 | { 58 | label: "繁体转简体", 59 | command: "Fan2Jian();", 60 | image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAADkSURBVDhPpZOxDYQwDEVvCM+RCZDomAKJjp4NaCgY4ZoMwAxswAS3Akv4YscJCQlRTld8RRH28+cbXu/Pif+oDqBHBABU85E8ywAO7BtAaFZcqNGc/WDuBmA14hTU3wDSTIXDiB1PXfm8AICdzgKCZi+Ztq+o6E6ufL1V5GCZW9PUYr+H9xgaTidlQwwbfXAPLp5DFACLmzabRREg64LGBGggNN25ucIsbUFsqnlLXNQBxKYrDlfYaXmFGgeU9JR8PA5wbSkFSAbRqnz6rT2LAN5AXMByEFYxg5JcPvEP9QMgpxO/jDuutEa92ggAAAAASUVORK5CYII=", 61 | }, 62 | { 63 | label: "G-网页翻译", 64 | command: "googlewebtran();", 65 | image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFPSURBVDhPjZExS0MxFEajCOLqD9DdyT/h5q44OIiLm9BJEMRRwU0cWjoUunQQcRGpOKiD8EAfShWHakWeipRu6uBy5Vy9IXm21MAhTZrv3Js8x/h8b0tIp93yvL3ciR7qNfLhen1PSuXtSPD6fNNbQojAympBmV+YU2wN2VPjf4IwGIr6CuA8OdFA2kg0sLS+IcuJeGZORaaPPmTyQGS09qWoIHwwq0hHmxedvgKVhAIe0FrPh4+bmYKkq+Dh/jK6OyGDbuxr8NvCI8VMHH9w76FCU9+BLlhby0BlO0ehPwLCBg8I3BUQUHk3SbU6AvYIqyAMGwRMQAjh2mGqQQTIvIARhlkPzO77Nu2zEjTYm6g8yvDW1Y9gcPFMw8yAAMKKU9VrhU4QMEeCfNhAQNBaBh4bvIDRTcIBCMO2Z/zG40GYmXuOl1oRYzu3Huec+waxf3TWiFPEawAAAABJRU5ErkJggg==", 66 | }, 67 | { 68 | label: "B-网页翻译", 69 | command: "bingwebtran();", 70 | image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEkSURBVDhPYyAW2LZv+g9lorAJApBiELZp2wimMTTbIAnMPXwDohiI5wHZUGEwwNAIAzBTc5YcAdPzjqBqBAGYGpDBMDZUCiI54dxHsBNzlh7FqhmZBqlD5oMZAWsf/nefdx7VZCBA5sMNQBdDdhYMQ+UxDEDmgwCyYTgBzAIYGywIBDCvwIHJfI//atPcwBgqhBOguwQDEGMIXmA8z/2/2nR3FENAfBSMbgnICyCNJkActMbzvyaaASCgCtTUf6r8f+JuP1QL/Fe7/289UgcXmHCq+7/+HEwDojYEgjW6bvVENQBk64aba1AMMJqLagBYM9AF0RuDML3gv8r9f8vhWrgAyED92QgDQIpBmkCaoULgMIEyIQDsf2A4gDCMD5bACxgYACt08k6OMYLWAAAAAElFTkSuQmCC", 71 | }, 72 | /* 73 | { 74 | label: "D-划词翻译", 75 | command: "dict();", 76 | image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALlSURBVDhPbZJrSFNhGMdPKAhCg0gqU8ya7tLc1KnTuZ29WiF9iMRI0jQINEmXQUSNorSCMi9EltnSgUKGWzueM0XBPiQFpWBgYqXrtrxkmdvOLuaFIJ7OtlfT8gfPl/f//P/Py/u8xCqCiVvj4bzWCb643bVX1u44lGiyH4s3OXKIqolNuGd9hEZXpoLyXlBRbLOKZs1qhn1CMu4+snNuUGPxDqtpT6+wzZ7JtYYGHP+Q/tBmkOjHQNZuB6mRhTiuxC2TEFXTDzF3RyD5sQM0FredZFzPNLRjWFL/OgtbVwhSGUbMce0OkJlc/qDIs22Ais7NI+3V+e3nzSBotkEK5YZYwziQt/tGsO8vYqN7XwbjWkw0e0Bs+Aw7juggQqKI92nxBbocTW0PiFqmwDdE0mQF+Z2B437jMjz9BB/RrEdOeUDQ8AZSy2sAS354Na/4ySY7yLlbiFq+gvgyBYQ8JxzLvoAffMQ4Z1M6lgNqfQHBAdXPRpJmh9IZLwibPkJs0Q0ISc2OxhoHtyrUwU6quIb1AkJavkdzjzigoLkB995CUln1mhv6QYxrWkGvCQgKKAQhNbEHScb5yfdGwqYPoNTp/w9IoZyl8VyD6P4oF1C3JiCJchWhDpfXtyVJ2wwIKiwgKLmpxvIKPNTltSW0foFUXfPaCXXTYYhhv8nN3Jq5f7KlvBXQyUtLWMXUWcPITk9fsnEGYio6QXTmAcKKf0sk7RlKMDkh6iIDWzPzITm3WIvlAInG2TzEuG0yEwu7Gt6BunGA5o43EPVTkekWjx51Ly75fqbo8CmISN0jC7gwUno+W9290KW0/ASpeQ5k1Byg7gWvsvd3dXrPr9YM2rkobByF0NwrgPJLJrEtgPzRdDFpGAFB9XOIrn4BO/31EgS1/SCsegoRWj1syz4NqoJyUOfkWzYrkQhbMQcqw9JKr18jC7WDmqNlVk1B2Zi/CrVWTd6J92lZ+yt5uxNjcPcqCOIP0FCDg77I/8oAAAAASUVORK5CYII=", 77 | }, 78 | { 79 | label: "Y-网页翻译", 80 | command: "youdao();", 81 | image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAN5SURBVDhPJZNZT1sHEIXvv+lrpf6BSn1tJdSqVdIFNU0jFDYREjCYi9lCFmwXcAoJJbRNIDZgIGFrKOCUPSwNBGOMjVd8vYJtjA0ECPbXGzrSPMwZnZmjWYS94wze2DucHoloNEYodkDi4JBUbA/nTohgKk049f5/P8oQeQfBgzNCchxKnSO44yfYXRLe4B72QIJ1X5wJe4w16YBIKMK2fw/P/jm+xHs5H8fiCRM4BJ/MkxJnCCsbNhxONxaZ6IwkZXKUzpUwrTN+lt0ytu2U8RTR1CnB3RiTEybe2P24k2CLHCNYLWYWLF5ervvpXJT4ZdJDs8lL0z9ufp0LYJeLB30+Mpk08UQKt1dC/0zPq3Unlv0Mgt28Rv/0JqLRTHWfmdpRG5ppD01LO9TPS1i9fhxbVj7Y4dEx/kiCNbMVrVrDxJoLYen1a4ZnzGTr5inpWqVm0kHHepgBa4R2Z4KV9bc4bHbSGUin08TiCSwOicGXJq5c/gZB1zfB0sIitd1rfN4whWLMxogtylzwkOndY0aH/iIW2+fk5Izz8/TFtqZWnbT89oTC0kqEqgkXYmsnxp5+mkc3Uc5JdEnHmEKn9He1stxbR+okTTJ5SDC0i3F0iu6RWbKyvrpQK5TKQ7s7aeN2XT31ohJtYyO372tozP2CGfUneB5+jPmVEYcURd/7gqY/hii6KfJlYQV1bw4QSsZd9M9vEg6FmZ2bx9jdwxPDIB3V19i+8xGutk+xaC+zsb6JRteOtu05l769Qv7TSVRTPoSfKxvoMAxh9/jlKR8RiETZckqMTL9l+M53BLSf4crNYtrQi0rdRtXddr7+8TrKcQdKkxvhmuZ3quruM7tqI7K7R0g+FrvDw9LaFgbjc14oLzFwIw99zyCK6mZuljXww61qKhf3qJjaQVC9SZJbXkv/4JjceYctu5OR8Vn0A3/zqHOYet1TlPdaUKjUlNc/Jq+wlmxRjWo1hXI2gFBrzZDbYkSj1mJatmIcW0Q/OMvjZ0PoHhnQPuji3gMDVeouipXNZH9/laI/xxCX96n4UEBcilNmclFQrKCp+SGisoqCG6XkFJeRU1JJzi2RvCIF+QXlXL1ehMI4h2olQcVcCHEhjFBhclIpy8mv1/FTfjElA8uo5oPUbZxQYzmjZuMUlfwTJe19qKZ3EP9NXkgX58NULOzyH7U7LAdvsKXgAAAAAElFTkSuQmCC", 82 | }, 83 | {label: "-",},//我是分割线 84 | { 85 | label: "QQ-云词典", 86 | command: "qqdictionary();", 87 | image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAMJSURBVDhPjZNrSNRZGIf/G26atJVlZas1QbFUtlS7pWRZYZRFF8ztpgVBUjabO6VmpSba3W6W5CWUdHPcUZupNBRCl8KxyEvp2I42pjPjehknR3G8ZFEfnpwpGoOifvB8OO8578N7DhzBEnf/OOlPy+IY55f0XThtTWdKglpqbbbEdcNp7H8PYbrkDm5iORNDi3GRFOG8f4iQIlzECtz+lDNT8g9LQ86wZYe/RcDHdkGY6BuH3cJwZu65weSgXCZI7uG6T878gxlEXDxO3q1IqkvD6KgOYrD+D3oLZ1vpUUw7/UkgzD7AHLGUSXtzWXMkkevZ0XRojvCmJRxzcwx5BZFITsWyUhyPs3cECSnB9OSLPkwh8o1irNdRdh2LpfRBDO/aJLxrFXO/NJakwmL84guZESTj58BsxvulICyKtl7BrBCprIIFW6KQ3Y7mdeM2unQhVFeexGw24nWxilGBmWy/nM/DhkaU6mYy7lXwg8dh2xt0V/wWqC3zp0/lw/Xbkcgf1ZKl1NM98Ja1N//H9dhR9srOE5xcxLqTeTxpNGLnc9Ym6K3xLulU+bEpOo6oHBV3NWZE55TI1F109L3GI6MRnwv5yGs70RnNtHX1Yx+QZRMMqFbjHZaIsF6OutXMY62RMp2JypZu9KZXNJgG8M3WYuodZG5CzVCtn0mHiodNULnwiePmTApqDJTUGXEKL2HUQSWOoeXMS9bQYOwn7z8Tj5t7MfQMonnZh+JZp01gKvtlv+OmVMZISliaUs+sS2oWXa3DM/k57kkaPDOaWHJDh0eWnuW5zcxI01qbPwkssfdPY3RElVXgnlDPvEQN81Oa+DVdj6e0hcU5bXgp2vEp6GCurB1Rmu5zwYi1qYwIVuIU9RS7AxWMPFSFY0wt4+Kf43xFi8s1PW5/tyLKNjBN2s7kofXUS3XDBKvicdhwGYfNqTgEZNrYKf0yu2SM/uvfYYKN5yivKkf1TMWLphcYjIavYtm3nLuamWMTCCtCT1gk38IuIJ0fd+cwct9dhBVhQ99ZEN4DVHlSaAB4iaAAAAAASUVORK5CYII=", 88 | }, 89 | */ 90 | 91 | ]; 92 | function updateToolbar() { 93 | var toolbars = document.querySelectorAll("toolbar"); 94 | Array.slice(toolbars).forEach(function (toolbar) { 95 | var currentset = toolbar.getAttribute("currentset"); 96 | if (currentset.split(",").indexOf("JsTools-menu") < 0) return; 97 | toolbar.currentSet = currentset; 98 | try { 99 | BrowserToolboxCustomizeDone(true); 100 | } catch (ex) { 101 | } 102 | }); 103 | } 104 | createBtn(); 105 | updateToolbar(); 106 | })(); 107 | /*=================::::::::::::::::::::::::::::::::功用函数列表::::::::::::::::::::::::::::==================*/ 108 | //尚译 109 | function shangyi(){ 110 | loadURI("javascript:void((function(){if(window.Como&&window.Como.someyi){Como.someyi.open()}else{var%20a=document.createElement('script');a.setAttribute('type','text/javascript');var%20b=document.charset?document.charset:document.characterSet;var%20c=b.toLowerCase()=='gb2312'?'pack-gb2312.js':'pack-utf8.js';a.setAttribute('src','http://yi.comsome.com/'+c);document.getElementsByTagName('head').item(0).appendChild(a);Text.prototype.tagName='#text'}})())");} 111 | //Dict 112 | function dict(){ 113 | loadURI("javascript:void((function()%20{var%20element=document.createElement('script');%20element.setAttribute('src',%20'http://dict.cn/hc/init.php');%20document.body.appendChild(element);})())");} 114 | //Bing划词 115 | function bingwordtran(){ 116 | loadURI("javascript:if(typeof%20yXzyxe58==typeof%20alert)yXzyxe58();(function(){script=document.createElement('script');script.src='http://dict.bing.com.cn/cloudwidget/Scripts/Generated/BingTranslate_Hover_Phrase_Selection_ShowIcon.js';script.onload=INIT;document.body.appendChild(script);})();function%20INIT(){BingCW.Init({MachineTranslation:true,WebDefinition:true});}");} 117 | //Bing网页翻译 118 | function bingwebtran(){ 119 | loadURI("javascript:(function(){var%20s%20=%20document.createElement('script');%20s.type%20=%20'text/javascript';%20s.src%20=%20'http://labs.microsofttranslator.com/bookmarklet/default.aspx?f=js&to=zh-chs';%20document.body.insertBefore(s,%20document.body.firstChild);})()");} 120 | //繁体转简体 121 | function Fan2Jian(){ 122 | content.document.documentElement.appendChild(content.document.createElement("script")).src = "http://tongwen.openfoundry.org/NewTongWen/tools/bookmarklet_cn2.js";} 123 | //谷歌网页翻译 124 | function googlewebtran() { 125 | loadURI("javascript:{d=document;b=d.body;o=d.createElement('scri'+'pt');o.setAttribute('src','http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit');o.setAttribute('type','text/javascript');b.appendChild(o);v=b.insertBefore(d.createElement('div'),b.firstChild);v.id='google_translate_element';v.style.display='none';p=d.createElement('scri'+'pt');p.text='function%20googleTranslateElementInit(){new%20google.translate.TranslateElement({pageLanguage:%22%22},%22google_translate_element%22);}';p.setAttribute('type','text/javascript');b.appendChild(p);}void%200");} 126 | /*/有道网页 127 | function youdao() { 128 | loadURI("javascript:%20void((function()%20{var%20element%20=%20document.createElement('script');element.id%20=%20'outfox_seed_js';element.charset%20=%20'utf-8',element.setAttribute('src',%20'http://fanyi.youdao.com/web2/seed.js?'%20+%20Date.parse(new%20Date()));document.body.appendChild(element);})())")} 129 | //QQ云词典 130 | function qqdictionary(){ 131 | loadURI("javascript:void((function(d){if(!!d){d.toggle();return;};var%20src='http://dict.qq.com/cloudgetjs';var%20e=document.createElement('script');e.setAttribute('src',src);document.getElementsByTagName('head')[0].appendChild(e);})(window.QQCloudDict))");}*/ 132 | -------------------------------------------------------------------------------- /Translator/README.md: -------------------------------------------------------------------------------- 1 | ##这里是翻译脚本 2 | 3 | * [**gTranslator.uc.js**](https://github.com/defpt/userChromeJs/blob/master/Translator/gTranslator.uc.js) 谷歌翻译脚本,修改自*Dannylee* 大大的翻译脚本,借鉴了一些其它脚本的代码,是我最喜欢的脚本之一: 4 | 5 | **左键点击按钮**直接翻译,如果有选中文字就翻译文字,否则翻译整个网页。 6 | 7 | **右键点击**弹出设置菜单,3中语言选择,**默认翻译为中文**,这个可通过编辑脚本添加和修改 8 | 9 | **对于选中文本**:不勾选弹窗显示则直接替换原文本,否则弹窗显示翻译结果; 10 | 不勾选对比显示则只显示翻译结果,否则对比显示翻译结果。效果看下面图。 11 | 12 | **支持部分加密的https链接**,比如:https://userscripts.org/scripts/show/157708 13 | 14 | * [**JsTranslator.uc.js**](https://github.com/defpt/userChromeJs/blob/master/Translator/JsTranslator.uc.js) 翻译按钮合集,都是调用小书签包括尚译、谷歌、有道、Dict、Bing、QQ云等划词以及网页翻译 15 | 16 | ###手势或拖拽调用翻译选中文本: 17 | gTranslator.selectionTranslation(); 18 | ###手势翻译,如果有选中文字就翻译文字,否则翻译整个网页。 19 | gTranslator.ToolBarTranslatorClick(); 20 | ###手势翻译整个网页: 21 | gTranslator.pageTranslation(); 22 | ###效果图: 23 | ![gTranslator.png](https://github.com/defpt/userChromeJs/blob/master/Translator/gTranslator.png?raw=true) 24 | ![gTranslator2.png](https://github.com/defpt/userChromeJs/blob/master/Translator/gTranslator2.png?raw=true) -------------------------------------------------------------------------------- /Translator/gTranslator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Translator/gTranslator.png -------------------------------------------------------------------------------- /Translator/gTranslator2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/Translator/gTranslator2.png -------------------------------------------------------------------------------- /Updatebookmarklite.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name Updatebookmarklite.uc.js 3 | // @description 书签维护 4 | // @author danny 5 | // @include main 6 | // @compatibility Firefox 11.0 10.0+ 7 | 8 | var updatebookmark = { 9 | init: function(){ 10 | window.addEventListener("load", updatebookmark.onload, false); 11 | window.setTimeout("updatebookmark.onload();", 0); 12 | }, 13 | 14 | uninit: function(event){ 15 | var plaMenu = document.getElementById("placesContext"); 16 | var menubook1 = document.getElementById("updatebookmarkUpdateCurrentURLMenuItem"); 17 | var menubook2 = document.getElementById("updatebookmarkUpdateCurrentTitleMenuItem"); 18 | var menubook3 = document.getElementById("addnewbookmarkMenuItem"); 19 | if (menubook1 && plaMenu) { 20 | plaMenu.removeChild(menubook1); 21 | } 22 | if (menubook2 && plaMenu) { 23 | plaMenu.removeChild(menubook2); 24 | } 25 | if (menubook3 && plaMenu) { 26 | plaMenu.removeChild(menubook3); 27 | } 28 | window.removeEventListener("load", updatebookmark.onload, false); 29 | }, 30 | 31 | onload: function() { 32 | var placesContextMenu = document.getElementById("placesContext"); 33 | var menuItem = document.createElement("menuitem"); 34 | menuItem.setAttribute("id", "updatebookmarkUpdateCurrentURLMenuItem"); 35 | menuItem.setAttribute("label", "更新为当前地址"); 36 | menuItem.setAttribute("oncommand", "updatebookmark.updateURL();"); 37 | menuItem.setAttribute("closemenu", "single"); 38 | menuItem.setAttribute("selection", "link"); 39 | placesContextMenu.insertBefore(menuItem,placesContextMenu.childNodes[1]); 40 | menuItem = document.createElement("menuitem"); 41 | menuItem.setAttribute("id", "updatebookmarkUpdateCurrentTitleMenuItem"); 42 | menuItem.setAttribute("label", "更新为当前标题"); 43 | menuItem.setAttribute("oncommand", "updatebookmark.updateTitle();"); 44 | menuItem.setAttribute("closemenu", "single"); 45 | menuItem.setAttribute("selection", "link"); 46 | placesContextMenu.insertBefore(menuItem,placesContextMenu.childNodes[2]); 47 | menuItem = document.createElement("menuitem"); 48 | menuItem.setAttribute("id", "addnewbookmarkMenuItem"); 49 | menuItem.setAttribute("label", "在此书签后面添加新书签"); 50 | menuItem.setAttribute("oncommand", "updatebookmark.appendURL();"); 51 | menuItem.setAttribute("closemenu", "single"); 52 | menuItem.setAttribute("selection", "link"); 53 | placesContextMenu.insertBefore(menuItem,placesContextMenu.childNodes[3]); 54 | menuItem = document.createElement("menuitem"); 55 | menuItem.setAttribute("id", "updatebookmarkMenuItem"); 56 | menuItem.setAttribute("label", "更新当前书签"); 57 | menuItem.setAttribute("oncommand", "updatebookmark.updatebookreplace();"); 58 | menuItem.setAttribute("closemenu", "single"); 59 | menuItem.setAttribute("selection", "link"); 60 | placesContextMenu.insertBefore(menuItem,placesContextMenu.childNodes[4]); 61 | placesContextMenu.addEventListener("popupshowing", updatebookmark.onpopup, false); 62 | }, 63 | 64 | onpopup: function(event) { 65 | // show only when single item is clicked and when item is link 66 | var node = document.popupNode; 67 | var isSingleLink = false; 68 | if ("node" in node) { 69 | node = node.node; 70 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 71 | } else 72 | if ("_placesNode" in node) { 73 | node = node._placesNode; 74 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 75 | } else { 76 | if ("view" in node.parentNode) { 77 | node = node.parentNode.view.nodeForTreeIndex(node.parentNode.view.selection.currentIndex); 78 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 79 | } 80 | } 81 | 82 | var menubook1 = document.getElementById('updatebookmarkUpdateCurrentURLMenuItem'); 83 | var menubook2 = document.getElementById('updatebookmarkUpdateCurrentTitleMenuItem'); 84 | var menubook3 = document.getElementById('addnewbookmarkMenuItem'); 85 | var menubook4 = document.getElementById('updatebookmarkMenuItem'); 86 | var activeContent = top.window.document.getElementById("content"); 87 | var activeBrowser = activeContent.selectedBrowser; 88 | var newurlValue = activeBrowser.currentURI.spec; 89 | if (newurlValue == "about:blank" || newurlValue == "about:home") { 90 | if (menubook1) menubook1.hidden = true; 91 | if (menubook2) menubook2.hidden = true; 92 | if (menubook3) menubook3.hidden = true; 93 | if (menubook4) menubook4.hidden = true; 94 | } else { 95 | if (isSingleLink) { 96 | var oldURI = PlacesUtils.bookmarks.getBookmarkURI(node.itemId); 97 | var oldurl = oldURI.spec; 98 | var oldtitleValue = PlacesUtils.bookmarks.getItemTitle(node.itemId); 99 | var newURI = Cc["@mozilla.org/network/io-service;1"]. 100 | getService(Ci.nsIIOService). 101 | newURI(newurlValue, null, null); 102 | var newurl = newURI.spec; 103 | var newtitleValue = activeBrowser.contentTitle; 104 | 105 | //如果标题或地址与当前tab的符合,显示弹出菜单spec 106 | if (oldurl == newurl || oldtitleValue == newtitleValue) { 107 | if (menubook1) menubook1.hidden = false; 108 | if (menubook2) menubook2.hidden = false; 109 | if (menubook3) menubook3.hidden = true; 110 | if (menubook4) menubook4.hidden = true; 111 | return; 112 | } else { 113 | if (menubook1) menubook1.hidden = true; 114 | if (menubook2) menubook2.hidden = true; 115 | if (menubook3) 116 | { menubook3.hidden = false; 117 | menubook3.setAttribute("label", "在此书签后面添加新书签"); 118 | } 119 | if (menubook4) menubook4.hidden = false; 120 | return; 121 | } 122 | } else { 123 | if (menubook1) menubook1.hidden = true; 124 | if (menubook2) menubook2.hidden = true; 125 | if (menubook3) 126 | { menubook3.hidden = false; 127 | menubook3.setAttribute("label", "在此文件夹添加新书签"); 128 | } 129 | if (menubook4) menubook4.hidden = true; 130 | } 131 | } 132 | }, 133 | 134 | updateURL: function() { 135 | var node = document.popupNode; 136 | var isSingleLink = false; 137 | if ("node" in node) { 138 | node = node.node; 139 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 140 | } else 141 | if ("_placesNode" in node) { 142 | node = node._placesNode; 143 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 144 | } else { 145 | if ("view" in node.parentNode) { 146 | node = node.parentNode.view.nodeForTreeIndex(node.parentNode.view.selection.currentIndex); 147 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 148 | } 149 | } 150 | try { 151 | var newValue; 152 | var activeContent = top.window.document.getElementById("content"); 153 | var activeBrowser = activeContent.selectedBrowser; 154 | newValue = activeBrowser.currentURI.spec; 155 | var oldURI = PlacesUtils.bookmarks.getBookmarkURI(node.itemId); 156 | var newURI = Cc["@mozilla.org/network/io-service;1"]. 157 | getService(Ci.nsIIOService). 158 | newURI(newValue, null, null); 159 | 160 | // add old tags onto new uri 161 | var oldValueTags = PlacesUtils.tagging.getTagsForURI(oldURI, {}); 162 | PlacesUtils.tagging.tagURI(newURI, oldValueTags); 163 | PlacesUtils.bookmarks.changeBookmarkURI(node.itemId, newURI); 164 | } catch (ex) { 165 | alert("无法更新书签. 无效的URL."); 166 | } 167 | }, 168 | 169 | updateTitle: function() { 170 | var node = document.popupNode; 171 | var isSingleLink = false; 172 | if ("node" in node) { 173 | node = node.node; 174 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 175 | } else 176 | if ("_placesNode" in node) { 177 | node = node._placesNode; 178 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 179 | } else { 180 | if ("view" in node.parentNode) { 181 | node = node.parentNode.view.nodeForTreeIndex(node.parentNode.view.selection.currentIndex); 182 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 183 | } 184 | } 185 | try { 186 | var newValue; 187 | var activeContent = top.window.document.getElementById("content"); 188 | var activeBrowser = activeContent.selectedBrowser; 189 | newValue = activeBrowser.contentTitle; 190 | PlacesUtils.bookmarks.setItemTitle(node.itemId, newValue); 191 | } catch (ex) { alert(ex.message); } 192 | }, 193 | 194 | updatebookreplace: function() { 195 | var node = document.popupNode; 196 | var isSingleLink = false; 197 | if ("node" in node) { 198 | node = node.node; 199 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 200 | } else 201 | if ("_placesNode" in node) { 202 | node = node._placesNode; 203 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 204 | } else { 205 | if ("view" in node.parentNode) { 206 | node = node.parentNode.view.nodeForTreeIndex(node.parentNode.view.selection.currentIndex); 207 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 208 | } 209 | } 210 | try { 211 | var newValue; 212 | var activeContent = top.window.document.getElementById("content"); 213 | var activeBrowser = activeContent.selectedBrowser; 214 | newValue = activeBrowser.currentURI.spec; 215 | var prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService(Components.interfaces.nsIPromptService); 216 | var items = ["更新标题和地址", "仅更新地址", "仅更新标题"]; // list items 217 | var uselected = {}; 218 | var result = prompts.select(null, "Title", "What greeting do you want?", items.length, items, uselected); 219 | if (result) { 220 | var oldURI = PlacesUtils.bookmarks.getBookmarkURI(node.itemId); 221 | var newURI = Cc["@mozilla.org/network/io-service;1"]. 222 | getService(Ci.nsIIOService). 223 | newURI(newValue, null, null); 224 | //add old tags onto new uri 225 | var newtitleValue = activeBrowser.contentTitle; 226 | if (uselected.value == 0 || uselected.value == 2) 227 | PlacesUtils.bookmarks.setItemTitle(node.itemId, newtitleValue); 228 | if (uselected.value == 0 || uselected.value == 1) { 229 | var oldValueTags = PlacesUtils.tagging.getTagsForURI(oldURI, {}); 230 | PlacesUtils.tagging.tagURI(newURI, oldValueTags); 231 | PlacesUtils.bookmarks.changeBookmarkURI(node.itemId, newURI); 232 | } 233 | } 234 | } catch (ex) { 235 | alert("无法更新书签. 无效的URL."); 236 | } 237 | }, 238 | 239 | appendURL: function() { 240 | var node = document.popupNode; 241 | var isSingleLink = false; 242 | if ("node" in node) { 243 | node = node.node; 244 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 245 | } else 246 | if ("_placesNode" in node) { 247 | node = node._placesNode; 248 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 249 | } else { 250 | if ("view" in node.parentNode) { 251 | node = node.parentNode.view.nodeForTreeIndex(node.parentNode.view.selection.currentIndex); 252 | isSingleLink = node && PlacesUtils.nodeIsBookmark(node); 253 | } 254 | } 255 | try { 256 | var newValue; 257 | var activeContent = top.window.document.getElementById("content"); 258 | var activeBrowser = activeContent.selectedBrowser; 259 | newValue = activeBrowser.currentURI.spec; 260 | var newtitle = activeBrowser.contentTitle; 261 | var newURI = Cc["@mozilla.org/network/io-service;1"]. 262 | getService(Ci.nsIIOService). 263 | newURI(newValue, null, null); 264 | if (isSingleLink) { 265 | var pnodeid = PlacesUtils.bookmarks.getFolderIdForItem(node.itemId); 266 | PlacesUtils.bookmarks.insertBookmark(pnodeid,newURI,PlacesUtils.bookmarks.getItemIndex(node.itemId)+1,newtitle); 267 | } else { 268 | var pnodeid = node.itemId; 269 | PlacesUtils.bookmarks.insertBookmark(pnodeid,newURI,'DEFAULT_INDEX',newtitle); 270 | } 271 | } catch (ex) { alert(ex.message); } 272 | } 273 | }; 274 | updatebookmark.init(); 275 | window.addEventListener("unload", function(event){ updatebookmark.uninit(event); }, false); 276 | -------------------------------------------------------------------------------- /addMenuPlus/FFmenu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/defpt/userChromeJs/99a79b74622ef310bf634668809f024ea862ac4a/addMenuPlus/FFmenu.png -------------------------------------------------------------------------------- /addMenuPlus/README.md: -------------------------------------------------------------------------------- 1 | ###说明文档: 2 | 此脚本来自 [ywzhaiqi/addMenuPlus.uc.js](https://github.com/ywzhaiqi/userChromeJS/tree/master/addmenuPlus) 3 | 这是一个非常强大的定制 Firefox 各种菜单的 UC 脚本。通过外置配置文件可添加、修改、隐藏橙色菜单、菜单栏、以及页面和链接的右键菜单,修改后无需重启,重新载入配置文件即可生效。是我最喜欢的脚本之一!!! 4 | 5 | 6 | **[addMenuPlus.uc.js](https://github.com/ywzhaiqi/userChromeJS/blob/master/addmenuPlus/addMenuPlus.uc.js)** 是脚本文件 7 | 8 | 9 | **[_addmenu.js](https://github.com/defpt/userChromeJs/blob/master/addMenuPlus/_addmenu.js)** 是配置文件 10 | 11 | **右键菜单** 12 | 13 | ![右键菜单](https://github.com/defpt/userChromeJs/blob/master/addMenuPlus/FFmenu.png?raw=true) 14 | 15 | -------------------------------------------------------------------------------- /autoCopy/README.md: -------------------------------------------------------------------------------- 1 | ###说明文档: 2 | 这里是几个自动复制所选内容脚本,主功能都是开启自动复制选中内容,不过不同的版本加了各自其它功能,个人推荐在ithinc、iwo版随便选一个 3 | 4 | **autoCopy.uc.js** 是 [zbinlin版](https://bitbucket.org/zbinlin/autocopy/src/ab709015680a?at=default),开启“clipboard.autocopy”时,使非 *unix 系统也支持自动复制 5 | 6 | **autoCopyBtn.uc.js** 是 ithinc、iwo版,可控自动复制,我精简为地址栏按钮显示自动复制开启与否 7 | 8 | **autoCopyMenu.uc.js** 是 ithinc、iwo版,可控自动复制,我精简为工具栏菜单按钮显示自动复制开启与否 -------------------------------------------------------------------------------- /autoCopy/autoCopy.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name autoCopy.uc.js 3 | // @namespace autoCopy@zbinlin 4 | // @description 开启“clipboard.autocopy”时,使非 *unix 系统也支持自动复制 5 | // @author zbinlin 6 | // @homepage http://blog.mozcp.com/ 7 | // @version 0.0.5 修复 Firefox 22 会出现 event.view 在第二次访问时值为 null 8 | // @version 0.0.4 修改 取消在 contenteditable 特性的标签内按 Ctrl+A 自动复制 9 | // @version 0.0.3 修改 取消在文本框中按 Ctrl+A 自动复制 10 | // @version 0.0.2 添加 按下 Ctrl+A (全选)快捷键时自动复制 11 | // @version 0.0.1 12 | // ==/UserScript== 13 | 14 | (function () { 15 | var {classes: Cc, interfaces: Ci, utils: Cu} = Components; 16 | Cu.import("resource://gre/modules/Services.jsm"); 17 | var AutoCopy = { 18 | init: function () { 19 | var prefs = Services.prefs; 20 | prefs.addObserver("clipboard.", this, false); 21 | if (prefs.getBoolPref("clipboard.autocopy")) { 22 | document.addEventListener("mouseup", this, false); 23 | document.addEventListener("keyup", this, false); 24 | } 25 | window.addEventListener("unload", this, false); 26 | }, 27 | handleEvent: function (e) { 28 | switch (e.type) { 29 | case "unload" : 30 | window.removeEventListener("unload", this, false); 31 | this.uninit(); 32 | break; 33 | case "mouseup" : 34 | if (e.button != 0) return; 35 | this.getText(e); 36 | break; 37 | case "keyup" : 38 | var keyCode = e.keyCode; 39 | /* 40 | * 如果按下以下快捷键,将自动复制选中文本: 41 | * Shift+Home Shift+End Shift+Left Shift+Right 42 | * Shift+Up Shift+Down Ctrl+A 43 | */ 44 | isKC = keyCode == 35 || keyCode == 36 || keyCode == 37 || 45 | keyCode == 39 || keyCode == 38 || keyCode == 40; 46 | if ((e.shiftKey && isKC) || (e.ctrlKey && keyCode == 65)) { 47 | this.getText(e); 48 | } 49 | break; 50 | } 51 | }, 52 | getText: function (event) { 53 | var text = ""; 54 | var win = event.view; 55 | var doc = win.document; 56 | var elem = doc.activeElement || event.target; 57 | var isCopyInEditor = event.type == "mouseup" && (event.altKey || event.ctrlKey); 58 | if (elem.localName == "input" || elem.localName == "textarea") { 59 | if (!isCopyInEditor) return; 60 | // 在文本框中按 Ctrl+A 无效 61 | // 如果需要按 Ctrl+A 自动复制,可以先按住鼠标左键,再按 Ctrl+A,并同时松开 62 | if (event.type == "keyup" && event.keyCode == 65) return; 63 | text = elem.value.substring(elem.selectionStart, elem.selectionEnd); 64 | } else { 65 | if ((doc.designMode == "on" || elem.isContentEditable) && !isCopyInEditor) return; 66 | text = win.getSelection().toString(); 67 | } 68 | if (text) { 69 | // 直接复制密码框中的原始字符串到剪贴板里 70 | if (elem.localName == "input") return this.toClipboard(text); 71 | this.toCopy(text); 72 | } 73 | }, 74 | toCopy: function (text) { 75 | try { 76 | var command = "cmd_copy"; 77 | var controller = top.document.commandDispatcher 78 | .getControllerForCommand(command); 79 | if (controller && controller.isCommandEnabled(command)) { 80 | controller.doCommand(command); 81 | return; 82 | } 83 | } catch (ex) { 84 | } 85 | // 上面的复制命令失败后,直接将字符串复制到剪贴板里 86 | this.toClipboard(text); 87 | }, 88 | toClipboard: function (text) { 89 | var clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"] 90 | .getService(Ci.nsIClipboardHelper); 91 | clipboard.copyString(text); 92 | }, 93 | observe: function (aSubject, aTopic, aData) { 94 | if (aTopic != "nsPref:changed") return; 95 | aSubject.QueryInterface(Ci.nsIPrefBranch); 96 | if (aData == "clipboard.autocopy") { 97 | var autocopy = aSubject.getBoolPref(aData); 98 | if (autocopy) { 99 | document.addEventListener("mouseup", this, false); 100 | document.addEventListener("keyup", this, false); 101 | } else { 102 | document.removeEventListener("mouseup", this, false); 103 | document.removeEventListener("keyup", this, false); 104 | } 105 | } 106 | }, 107 | uninit: function () { 108 | var prefs = Services.prefs; 109 | prefs.removeObserver("clipboard.", this); 110 | document.removeEventListener("mouseup", this, false); 111 | document.removeEventListener("keyup",this, false); 112 | } 113 | }; 114 | AutoCopy.init(); 115 | })(); 116 | -------------------------------------------------------------------------------- /autoCopy/autoCopyBtn.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name autoCopyBtn.uc.js 3 | // @namespace ithinc#mozine.cn 4 | // @description 可控自动复制,地址栏按钮版 5 | // @include main 6 | // @compatibility Firefox 3.0.x 7 | // @author ithinc, iwo 8 | // @charset UTF-8 9 | // @version LastMod 2014-08-31 by defpt 10 | // @note 2014-08-31 修正一下某些输入框也复制的问题 11 | // @note 2014-04-12 修改原脚本为自用版 12 | // @Note https://g.mozest.com/redirect.php?goto=findpost&pid=299093&ptid=42980 13 | // @homepageURL https://github.com/defpt/userChromeJs/tree/master/autoCopy 14 | // ==/UserScript== 15 | 16 | (function () { 17 | var lastSelection = ""; 18 | var autocopyImages = ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAADtElEQVQ4jQXBfWjUdRwH8Pfn+/ves7u73blH3E031x6c2zQcw52NQJGIsakVVNiDsyAJyQYFZaBZYQWB2T8FCTIZQkJIjdYDoa2ZtIfMsbbmRpvNbXe3dbvb3e9+9/v9vt9vrxct1NeTyueVMxzeHOruttfdnnUjm6ZKj1Mt/jaK5Qdr8JGNi/VV21ssVLYWVm8+WX3yx/eS15Idvd3gcduGIIIVj58r1LMFfc7Qmwtr8xVv1zTpk4+9vOlu7cGK1MpcJDjxU0fjwKU9ZduM4urI0hdZQb1QKsNJKWUTRd2gZ8QvQ/7GQ8dbJupeC51gBdwhZIBNJZzF6ys4MHwD1alVWTyzgcPlg10VLVX9IMdNDgB5KbVCt8vjfLCodv1wrWHjlb1khiT8Xk05Mmnb99EFVTd/m7n9YWamk6rtj+tF0mjoUJ3tQ0wRaR7Im1Nw9c75Cqlwckx0fXdePPuwSx4sz2Bn3xlee2/c4fYGNaZvyNmiKuqte3VyZGT+a0qtSi5II5/5H4a2P31ntKY2cWr44yLv4M/S3vo5W15dBV0fRCAUgkVA6pEovqo6hCGjLfuE9+oqCOAujaOECRRtrBWln3w+mI1qMM6co+CVKwgHA6CAH3pZKWTPMeDRfVjvn4XLsjgzTQ4FML8wKB7YhvHqA5GylRlHaHnR1rmDGAE8FoPZ2gr7s4twHDkCkclAmBaUFIp5PBKaBu4SeXvCVw+fpjfs+/INWHN31Ba3D7lcDgTAaxiwl1ZgFpfClAqWVJBGVvpaWxUCQXCde/wPrc/2vjty/mhISTCnl+edTpivn4I+PAz+zbfgS0vw9hyD2t0MQygoywYLeAlcA1uw7C6S4p0S7nBBEgyvh+zTp+E5+hzwwouI1dVBxWJQFz5Faf9VVLkldKWEMC0BpaB1+gO24lpXhRD+jfJSJc6eJbRHYSaTcEUiSAaDsH4fgc+2wKf+UrtdOkuVbEk3+ozvI207YtqJcDDlzm3UJbc27eIfvC8dzU3MyuhQRBB6Dr6GHUgLG46xMXC3lzyz02jHv+ECGPc3RaO3WNBfZF6uf+nGre4euCpDIhe7r/L6mtJTcZVOJdTqPzMyG90rZ1r3SKeRts2CAH0om6fv3p4eID2t+LrJMFDfVR5fmMX8pV8pa2kkBGAKBVMwGBbIlAysYD86g2m1Fozgcs3jybbERALCBs2N38PhT/58ShmJt/KKx4iYCWIGSNMBlSWiPMCyipDxkZXSXK5cPMf/7jteOxrdv9P6H00LytiG/sXgAAAAAElFTkSuQmCC", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAADeUlEQVQ4jQXBSWicZRgH8P/zfu83S7aZzGSyTCZLY1IySdSDlkADHrzpoaAtCAUFIxQR8WqXU/HgTRB6VqhCe+lBa22LBEMQreLSkIjN5kzWcTLJ7DPf9r7v4+9He8ceLt7MgbXBXDZBQ+37XPh7CdnXrqIrnoYQAq3SNraWP58emDjnZeYXvTtLef3J22eKCzM9kDvOE8RGD9DZ4aE3cZ7DB5H+3r7UZDQSapIUXYGhEVdEx6zJN16pJsakV3ZjbZ/+OnWOrhWdgxpd/ulF9Ma0oOpZE2xeX+SKuuKHe8aN7CHNFNckQ9Q+QiI5Ch1qajd6x2rtnFubOvvsgkys5GWPGCToCudWX7Ja+ZHLC3O5+Uy6T3VHSHbahrujluqyU1zKrwkxXOPH7Udqor8xMxTOZGsqnZcaAdnCGITa6fEBxN5ZiCEernL/0LAxRhOBJIlO7Hc5+PbkIUJigPfUMpGa/YrboUUJQBAZE+jwaDwqR0YzaWhDVrWtBQAwDGwwcmYb/zo7oJAmVyu9Vnia9MqqSzBAxhBEyBtNxkwfg8GGiAgQBEgCHFXHj4V7iITDKPslJX1peXX/FgtzVwQNP6gVxeRgZv16dmbLMoE0DEMEQLOCpDAeHdxFQD4aqmqg2/J060xZuUNfyIgyolltTYWD+K10PDp3bD/WjnGFIAnNCp1WN9ZPf8Ozxh/whYtGUOTa7gBON97dMMFAEfAgvJpOmTZerrsN/Hq8JNYrT8AGkAjjqLmLpaN7EFLgxCsAhSii+2/CccaEIBdEFgQr/vnosPLRfq4MTzX5+/2vudDcRcur4bvd26hzGSXvEHRq4/XEFaA9CIYDggAASMtuolmd+NM6uZDv6PxyfNNdMw8Ob1PCGsCBt42aX4F7Qnhv+gYi7S64/i6IDZgZACAkkqifZuPPxRfSb41fQybI0g873+D3ygoqrSrsWjc+mLmJqb5peNqBrxTYKGMJi6UIQRbLFvzjS6n4ZD50fmQ2SIgP5cr+fd4urWFYTODV4UtsORJbuU0U/isbpckiZq66ZTSah6AHT5fx8We1qzOp1qfpuBdoDttGWyg2T9BhJ+EpQsNzYYxAoIx2tG2V6qFfbryfvDj/gl2Qz6fnAX64889eY3U1L4oM5RNZrm31tgPjtJjIk8JuMbgpyKp1RIQT6GBjsm+2NJ1M4X84vtmKnywkowAAAABJRU5ErkJggg=="]; 19 | var autocopyTooltips = ["autoCopy \u5DF2\u7981\u7528", "autoCopy \u5DF2\u542F\u7528"]; 20 | var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch); 21 | if (!prefs.getPrefType("userChrome.autocopy.autocopyState")) 22 | prefs.setIntPref("userChrome.autocopy.autocopyState", 1); 23 | 24 | function autocopyStart(e) { 25 | lastSelection = getBrowserSelection(); 26 | } 27 | 28 | function autocopyStop(e) { 29 | var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch); 30 | var autocopyState = prefs.getIntPref("userChrome.autocopy.autocopyState"); 31 | var selection = getBrowserSelection(); 32 | //增加判断是否在输入框或按下功能键 33 | var exceptTarget = (e.target.localName == "textarea" || e.target.type == "input" || e.target.type == "text" || e.target.type == "password" || e.target.type == "email" || e.target.contentEditable == "true"); 34 | var exceptoriginalTarget = (!e.originalTarget.ownerDocument || e.originalTarget.ownerDocument.designMode == "off" || e.originalTarget.ownerDocument.designMode == "undefined"); 35 | var exceptAlternativeKey = (e.ctrlKey || e.altKey); 36 | var except = (exceptTarget && exceptoriginalTarget && !exceptAlternativeKey); 37 | 38 | if (autocopyState > 0 && selection && selection != lastSelection && !except) { 39 | goDoCommand('cmd_copy'); 40 | } 41 | } 42 | 43 | gBrowser.mPanelContainer.addEventListener("mousedown", autocopyStart, false); 44 | gBrowser.mPanelContainer.addEventListener("mouseup", autocopyStop, false); 45 | 46 | var statusbarpanel = document.getElementById("urlbar-icons").appendChild(document.createElement("statusbarpanel")); ; 47 | statusbarpanel.setAttribute("id", "autocopy-statusbarpanel"); 48 | statusbarpanel.setAttribute("class", "statusbarpanel-iconic"); 49 | statusbarpanel.setAttribute("onclick", '\ 50 | if(event.button==0) {\ 51 | var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);\ 52 | var autocopyState = prefs.getIntPref("userChrome.autocopy.autocopyState");\ 53 | prefs.setIntPref("userChrome.autocopy.autocopyState", (autocopyState+1)%2);\ 54 | }\ 55 | '); 56 | 57 | function refreshStatus() { 58 | var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch); 59 | var autocopyState = prefs.getIntPref("userChrome.autocopy.autocopyState"); 60 | var statusbarpanel = document.getElementById("autocopy-statusbarpanel"); 61 | 62 | statusbarpanel.setAttribute("src", autocopyImages[autocopyState % 2]); 63 | statusbarpanel.tooltipText = autocopyTooltips[autocopyState % 2]; 64 | } 65 | refreshStatus(); 66 | 67 | var observer = { 68 | observe : function (subject, topic, prefName) { 69 | refreshStatus(); 70 | } 71 | }; 72 | prefs.QueryInterface(Ci.nsIPrefBranchInternal).addObserver("userChrome.autocopy.autocopyState", observer, false); 73 | })(); -------------------------------------------------------------------------------- /autoCopy/autoCopyMenu.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name autoCopy_menu.uc.js 3 | // @namespace ithinc#mozine.cn 4 | // @description 可控自动复制,工具栏菜单版 5 | // @include main 6 | // @compatibility Firefox 3.0.x 7 | // @author ithinc, iwo 8 | // @charset UTF-8 9 | // @version LastMod 2014-08-31 by defpt 10 | // @note 2014-08-31 修正一下某些输入框也复制的问题 11 | // @note 2014-04-12 修改原脚本为自用版 12 | // @Note https://g.mozest.com/redirect.php?goto=findpost&pid=299093&ptid=42980 13 | // @homepageURL https://github.com/defpt/userChromeJs/tree/master/autoCopy 14 | // ==/UserScript== 15 | 16 | (function () { 17 | var lastSelection = ""; 18 | var autocopyImages = ["data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAADtElEQVQ4jQXBfWjUdRwH8Pfn+/ves7u73blH3E031x6c2zQcw52NQJGIsakVVNiDsyAJyQYFZaBZYQWB2T8FCTIZQkJIjdYDoa2ZtIfMsbbmRpvNbXe3dbvb3e9+9/v9vt9vrxct1NeTyueVMxzeHOruttfdnnUjm6ZKj1Mt/jaK5Qdr8JGNi/VV21ssVLYWVm8+WX3yx/eS15Idvd3gcduGIIIVj58r1LMFfc7Qmwtr8xVv1zTpk4+9vOlu7cGK1MpcJDjxU0fjwKU9ZduM4urI0hdZQb1QKsNJKWUTRd2gZ8QvQ/7GQ8dbJupeC51gBdwhZIBNJZzF6ys4MHwD1alVWTyzgcPlg10VLVX9IMdNDgB5KbVCt8vjfLCodv1wrWHjlb1khiT8Xk05Mmnb99EFVTd/m7n9YWamk6rtj+tF0mjoUJ3tQ0wRaR7Im1Nw9c75Cqlwckx0fXdePPuwSx4sz2Bn3xlee2/c4fYGNaZvyNmiKuqte3VyZGT+a0qtSi5II5/5H4a2P31ntKY2cWr44yLv4M/S3vo5W15dBV0fRCAUgkVA6pEovqo6hCGjLfuE9+oqCOAujaOECRRtrBWln3w+mI1qMM6co+CVKwgHA6CAH3pZKWTPMeDRfVjvn4XLsjgzTQ4FML8wKB7YhvHqA5GylRlHaHnR1rmDGAE8FoPZ2gr7s4twHDkCkclAmBaUFIp5PBKaBu4SeXvCVw+fpjfs+/INWHN31Ba3D7lcDgTAaxiwl1ZgFpfClAqWVJBGVvpaWxUCQXCde/wPrc/2vjty/mhISTCnl+edTpivn4I+PAz+zbfgS0vw9hyD2t0MQygoywYLeAlcA1uw7C6S4p0S7nBBEgyvh+zTp+E5+hzwwouI1dVBxWJQFz5Faf9VVLkldKWEMC0BpaB1+gO24lpXhRD+jfJSJc6eJbRHYSaTcEUiSAaDsH4fgc+2wKf+UrtdOkuVbEk3+ozvI207YtqJcDDlzm3UJbc27eIfvC8dzU3MyuhQRBB6Dr6GHUgLG46xMXC3lzyz02jHv+ECGPc3RaO3WNBfZF6uf+nGre4euCpDIhe7r/L6mtJTcZVOJdTqPzMyG90rZ1r3SKeRts2CAH0om6fv3p4eID2t+LrJMFDfVR5fmMX8pV8pa2kkBGAKBVMwGBbIlAysYD86g2m1Fozgcs3jybbERALCBs2N38PhT/58ShmJt/KKx4iYCWIGSNMBlSWiPMCyipDxkZXSXK5cPMf/7jteOxrdv9P6H00LytiG/sXgAAAAAElFTkSuQmCC", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsSAAALEgHS3X78AAADeUlEQVQ4jQXBSWicZRgH8P/zfu83S7aZzGSyTCZLY1IySdSDlkADHrzpoaAtCAUFIxQR8WqXU/HgTRB6VqhCe+lBa22LBEMQreLSkIjN5kzWcTLJ7DPf9r7v4+9He8ceLt7MgbXBXDZBQ+37XPh7CdnXrqIrnoYQAq3SNraWP58emDjnZeYXvTtLef3J22eKCzM9kDvOE8RGD9DZ4aE3cZ7DB5H+3r7UZDQSapIUXYGhEVdEx6zJN16pJsakV3ZjbZ/+OnWOrhWdgxpd/ulF9Ma0oOpZE2xeX+SKuuKHe8aN7CHNFNckQ9Q+QiI5Ch1qajd6x2rtnFubOvvsgkys5GWPGCToCudWX7Ja+ZHLC3O5+Uy6T3VHSHbahrujluqyU1zKrwkxXOPH7Udqor8xMxTOZGsqnZcaAdnCGITa6fEBxN5ZiCEernL/0LAxRhOBJIlO7Hc5+PbkIUJigPfUMpGa/YrboUUJQBAZE+jwaDwqR0YzaWhDVrWtBQAwDGwwcmYb/zo7oJAmVyu9Vnia9MqqSzBAxhBEyBtNxkwfg8GGiAgQBEgCHFXHj4V7iITDKPslJX1peXX/FgtzVwQNP6gVxeRgZv16dmbLMoE0DEMEQLOCpDAeHdxFQD4aqmqg2/J060xZuUNfyIgyolltTYWD+K10PDp3bD/WjnGFIAnNCp1WN9ZPf8Ozxh/whYtGUOTa7gBON97dMMFAEfAgvJpOmTZerrsN/Hq8JNYrT8AGkAjjqLmLpaN7EFLgxCsAhSii+2/CccaEIBdEFgQr/vnosPLRfq4MTzX5+/2vudDcRcur4bvd26hzGSXvEHRq4/XEFaA9CIYDggAASMtuolmd+NM6uZDv6PxyfNNdMw8Ob1PCGsCBt42aX4F7Qnhv+gYi7S64/i6IDZgZACAkkqifZuPPxRfSb41fQybI0g873+D3ygoqrSrsWjc+mLmJqb5peNqBrxTYKGMJi6UIQRbLFvzjS6n4ZD50fmQ2SIgP5cr+fd4urWFYTODV4UtsORJbuU0U/isbpckiZq66ZTSah6AHT5fx8We1qzOp1qfpuBdoDttGWyg2T9BhJ+EpQsNzYYxAoIx2tG2V6qFfbryfvDj/gl2Qz6fnAX64889eY3U1L4oM5RNZrm31tgPjtJjIk8JuMbgpyKp1RIQT6GBjsm+2NJ1M4X84vtmKnywkowAAAABJRU5ErkJggg=="]; 19 | var autocopyTooltips = ["autoCopy \u5DF2\u7981\u7528", "autoCopy \u5DF2\u542F\u7528"]; 20 | var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch); 21 | if (!prefs.getPrefType("userChrome.autocopy.autocopyState")) 22 | prefs.setIntPref("userChrome.autocopy.autocopyState", 1); 23 | 24 | function autocopyStart(e) { 25 | lastSelection = getBrowserSelection(); 26 | } 27 | 28 | function autocopyStop(e) { 29 | var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch); 30 | var autocopyState = prefs.getIntPref("userChrome.autocopy.autocopyState"); 31 | var selection = getBrowserSelection(); 32 | //增加判断是否在输入框或按下功能键 33 | var exceptTarget = (e.target.localName == "textarea" || e.target.type == "input" || e.target.type == "text" || e.target.type == "password" || e.target.type == "email" || e.target.contentEditable == "true"); 34 | var exceptoriginalTarget = (!e.originalTarget.ownerDocument || e.originalTarget.ownerDocument.designMode == "off" || e.originalTarget.ownerDocument.designMode == "undefined"); 35 | var exceptAlternativeKey = (e.ctrlKey || e.altKey); 36 | var except = (exceptTarget && exceptoriginalTarget && !exceptAlternativeKey); 37 | 38 | if (autocopyState > 0 && selection && selection != lastSelection && !except) { 39 | goDoCommand('cmd_copy'); 40 | } 41 | } 42 | 43 | gBrowser.mPanelContainer.addEventListener("mousedown", autocopyStart, false); 44 | gBrowser.mPanelContainer.addEventListener("mouseup", autocopyStop, false); 45 | 46 | var menuitem = document.getElementById("menu_ToolsPopup").appendChild(document.createElement("menuitem")); ; 47 | menuitem.setAttribute("id", "autocopy-menuitem"); 48 | menuitem.setAttribute("label", "自动复制开/关"); 49 | menuitem.setAttribute("class", "menuitem-iconic"); 50 | menuitem.setAttribute("onclick", '\ 51 | if(event.button==0) {\ 52 | var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch);\ 53 | var autocopyState = prefs.getIntPref("userChrome.autocopy.autocopyState");\ 54 | prefs.setIntPref("userChrome.autocopy.autocopyState", (autocopyState+1)%2);\ 55 | }\ 56 | '); 57 | 58 | function refreshStatus() { 59 | var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch); 60 | var autocopyState = prefs.getIntPref("userChrome.autocopy.autocopyState"); 61 | var menuitem = document.getElementById("autocopy-menuitem"); 62 | 63 | menuitem.setAttribute("src", autocopyImages[autocopyState % 2]); 64 | menuitem.tooltipText = autocopyTooltips[autocopyState % 2]; 65 | } 66 | refreshStatus(); 67 | 68 | var observer = { 69 | observe : function (subject, topic, prefName) { 70 | refreshStatus(); 71 | } 72 | }; 73 | prefs.QueryInterface(Ci.nsIPrefBranchInternal).addObserver("userChrome.autocopy.autocopyState", observer, false); 74 | })(); -------------------------------------------------------------------------------- /contextSearcher.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name contextSearcher.uc.js 3 | // @namespace http://d.hatena.ne.jp/Griever/ 4 | // @description 右键搜索增强 5 | // @author Griever 6 | // @include main 7 | // @compatibility Firefox 4 8 | // @version 基于原版 v0.0.9 9 | // @note 修改自用版:添加搜索完成后自动清空搜索栏并切回默认搜索引擎 10 | // ==/UserScript== 11 | 12 | if (window.contextSearcher) { 13 | window.contextSearcher.destroy(); 14 | delete window.contextSearcher; 15 | } 16 | 17 | window.contextSearcher = { 18 | NEW_TAB: Services.prefs.getBoolPref("browser.search.openintab"), 19 | 20 | _regexp: { 21 | hiragana: "[\\u3040-\\u309F]+", 22 | katakana: "[\\u30A0-\\u30FA\\u30FC-\\u30FE]+", 23 | kanji : "[\\u3005\\u4E00-\\u9FA0]+", 24 | suuji : "[0-9_./,%-]+", 25 | eisu_han: "\\w[\\w\\-]*", 26 | eisu_zen: "[\\uFF41-\\uFF5A\\uFF21-\\uFF3A\\uFF10-\\uFF19]+", 27 | hankaku : "[\\uFF00-\\uFFEF]+", 28 | hangul : "[\\u1100-\\u11FF\\uAC00-\\uD7AF\\u3130-\\u318F]+", 29 | }, 30 | 31 | get startReg() { 32 | let reg = {}; 33 | for(let n in this._regexp) { 34 | reg[n] = new RegExp('^' + this._regexp[n]); 35 | } 36 | delete this.startReg; 37 | return this.startReg = reg; 38 | }, 39 | get endReg() { 40 | let reg = {}; 41 | for(let n in this._regexp) { 42 | reg[n] = new RegExp(this._regexp[n] + '$'); 43 | } 44 | delete this.endReg; 45 | return this.endReg = reg; 46 | }, 47 | getCharType: function(aChar) { 48 | var c = aChar.charCodeAt(0); 49 | //if (c >= 0x30 && c <= 0x39) return "suuji"; 50 | if (c >= 0x30 && c <= 0x39 || c >= 0x41 && c <= 0x5A || c >= 0x61 && c <= 0x7A || c === 0x5F) return "eisu_han"; 51 | if (c >= 0x30A0 && c <= 0x30FA || c >= 0x30FC && c <= 0x30FE) return "katakana"; 52 | if (c >= 0x3040 && c <= 0x309F) return "hiragana"; 53 | if (c >= 0x4E00 && c <= 0x9FA0 || c === 0x3005) return "kanji"; 54 | if (c >= 0xFF41 && c <= 0x9F5A || c >= 0xFF21 && c <= 0xFF3A || c >= 0xFF10 && c <= 0xFF19) return "eisu_zen"; 55 | if (c >= 0xFF00 && c <= 0xFFEF) return "hankaku"; 56 | if (c >= 0x1100 && c <= 0x11FF || c >= 0xAC00 && c <= 0xD7AF || c >= 0x3130 && c <= 0x318F) return "hangul"; 57 | return ""; 58 | }, 59 | 60 | searchText: '', 61 | searchEngines: [], 62 | init: function(){ 63 | this.isMac = navigator.platform.indexOf("Mac") == 0; 64 | this.searchService = Cc["@mozilla.org/browser/search-service;1"].getService(Ci.nsIBrowserSearchService); 65 | this.context = document.getElementById('contentAreaContextMenu'); 66 | var searchselect = document.getElementById('mason-fcd-r1'); 67 | 68 | this.menu = this.context.insertBefore(document.createElement('menu'), searchselect); 69 | this.menu.setAttribute('id', 'context-searcher'); 70 | this.menu.setAttribute('class', 'menu-iconic'); 71 | //this.menu.setAttribute('accesskey', searchselect.accessKey); 72 | this.menu.setAttribute('onclick', 'if (event.target == this) { contextSearcher.command(event); closeMenus(this); }'); 73 | 74 | this.popup = this.menu.appendChild( document.createElement('menupopup') ); 75 | 76 | this.context.addEventListener('popupshowing', this, false); 77 | this.menu.addEventListener('DOMMouseScroll', this, false); 78 | gBrowser.mPanelContainer.addEventListener(this.isMac ? 'mousedown' : 'click', this, false); 79 | window.addEventListener('unload', this, false); 80 | }, 81 | 82 | uninit: function() { 83 | this.context.removeEventListener('popupshowing', this, false); 84 | this.menu.removeEventListener('DOMMouseScroll', this, false); 85 | gBrowser.mPanelContainer.removeEventListener('click', this, false); 86 | gBrowser.mPanelContainer.removeEventListener('mousedown', this, false); 87 | window.removeEventListener('unload', this, false); 88 | }, 89 | 90 | destroy: function(){ 91 | this.uninit(); 92 | document.getElementById('context-searchselect').style.removeProperty('display'); 93 | var m = document.getElementById('context-searcher'); 94 | if (m) 95 | m.parentNode.removeChild(m); 96 | }, 97 | 98 | handleEvent: function(event) { 99 | if (this[event.type]) 100 | this[event.type](event); 101 | }, 102 | 103 | unload: function(e){ 104 | this.uninit(); 105 | }, 106 | 107 | DOMMouseScroll: function(e) { 108 | if (this.searchEngines.length === 0) 109 | this.searchEngines = this.searchService.getVisibleEngines({}); 110 | if (!this.searchEngines || this.searchEngines.length == 0) 111 | return; 112 | 113 | var index = this.searchEngines.indexOf(this.searchService.currentEngine); 114 | var newEngine = e.detail > 0? this.searchEngines[index+1] : this.searchEngines[index-1]; 115 | if (!newEngine) 116 | return; 117 | this.searchService.currentEngine = newEngine; 118 | this.setMenuitem(); 119 | }, 120 | 121 | command: function(e){ 122 | var target = e.target; 123 | var engine = e.target.engine || this.menu.engine; 124 | 125 | var submission = engine.getSubmission(this.searchText, null); 126 | if (!submission) 127 | return; 128 | 129 | var where = whereToOpenLink(e); 130 | if (this.NEW_TAB && where === 'current' || where === 'save') 131 | where = 'tab'; 132 | 133 | openLinkIn(submission.uri.spec, where, { 134 | postData: submission.postData, 135 | relatedToCurrent: true 136 | }); 137 | }, 138 | 139 | click: function(event) { 140 | if (event.button === 2) { 141 | this._clickNode = event.rangeParent; 142 | this._clickOffset = event.rangeOffset; 143 | this._clientX = event.clientX; 144 | } else { 145 | this._clickNode = null; 146 | this._clickOffset = 0; 147 | this._clientX = 0; 148 | } 149 | }, 150 | 151 | mousedown: function(event) { 152 | this.click(event); 153 | }, 154 | 155 | setMenuitem: function() { 156 | var currentEngine = this.searchService.currentEngine; 157 | var l = this.searchText.length > 6? this.searchText.substr(0, 6) + '...' : this.searchText; 158 | this.menu.engine = currentEngine; 159 | //this.menu.setAttribute('label', gNavigatorBundle.getFormattedString("contextMenuSearchText", [currentEngine.name, l])); 160 | this.menu.setAttribute('label', '搜索 "' + l + '"'); 161 | //this.menu.setAttribute('tooltiptext', currentEngine.name); 162 | if (currentEngine.iconURI) 163 | this.menu.style.listStyleImage = 'url("' + currentEngine.iconURI.spec + '")'; 164 | else 165 | this.menu.style.removeProperty('list-style-image'); 166 | }, 167 | 168 | popupshowing: function(e){ 169 | if (e.target != this.context) return; 170 | 171 | this.searchText = 172 | gContextMenu.onTextInput? this.getTextInputSelection() : 173 | gContextMenu.isTextSelected? this.getBrowserSelection() : 174 | gContextMenu.onImage? gContextMenu.target.getAttribute('alt') : 175 | gContextMenu.onLink? gContextMenu.linkText() : 176 | this.getCursorPositionText(); 177 | 178 | if (!this.searchText || !/\S/.test(this.searchText)) { 179 | this.menu.hidden = true; 180 | return; 181 | } 182 | if (this.searchText.length > 256) 183 | this.searchText = this.searchText.substr(0, 256); 184 | this.menu.hidden = false; 185 | 186 | if (!this.popup.hasChildNodes() || e.ctrlKey) 187 | this.createMenuitem(); 188 | 189 | this.setMenuitem(); 190 | }, 191 | 192 | createMenuitem: function(){ 193 | this.searchEngines = this.searchService.getVisibleEngines({}); 194 | if (!this.searchEngines || this.searchEngines.length == 0) 195 | return; 196 | 197 | var f; 198 | while (f = this.popup.firstChild) { 199 | this.popup.removeChild(f); 200 | } 201 | 202 | this.menu.engine = this.searchService.currentEngine; 203 | if (this.menu.engine.iconURI) 204 | this.menu.style.listStyleImage = 'url("' + this.menu.engine.iconURI.spec + '")'; 205 | else 206 | this.menu.style.removeProperty('list-style-image'); 207 | for (var i = 0, s = this.searchEngines, l = s.length; i < l; i++) { 208 | var engine = s[i]; 209 | var m = document.createElement('menuitem'); 210 | m.setAttribute('label', engine.name); 211 | m.setAttribute('class', 'menuitem-iconic bookmark-item'); 212 | if (engine.iconURI) { 213 | m.setAttribute('image', engine.iconURI.spec); 214 | } 215 | m.setAttribute('oncommand', 'contextSearcher.command(event);'); 216 | m.setAttribute('onclick', 'checkForMiddleClick(this, event);'); 217 | m.engine = engine; 218 | this.popup.appendChild(m); 219 | } 220 | }, 221 | 222 | getBrowserSelection: function () { 223 | var win = document.commandDispatcher.focusedWindow; 224 | var sel = win.getSelection(); 225 | var str = ''; 226 | if (sel.isCollapsed) 227 | return str; 228 | 229 | for(var i = 0, l = sel.rangeCount; i < l; i++) { 230 | str += sel.getRangeAt(i) + ' '; 231 | } 232 | return str.replace(/^\s*|\s*$/g, '').replace(/\s+/g, ' '); 233 | }, 234 | 235 | getTextInputSelection: function () { 236 | var elem = document.commandDispatcher.focusedElement; 237 | var str = elem.value.slice(elem.selectionStart, elem.selectionEnd); 238 | return str.replace(/^\s*|\s*$/g, '').replace(/\s+/g, ' '); 239 | }, 240 | 241 | getCursorPositionText: function() { 242 | var node = this._clickNode; 243 | var offset = this._clickOffset; 244 | if (!node || node.nodeType !== Node.TEXT_NODE) 245 | return ""; 246 | 247 | var text = node.nodeValue; 248 | 249 | // 文字の右半分をクリック時に次の文字を取得する対策 250 | var range = node.ownerDocument.createRange(); 251 | range.setStart(node, offset); 252 | var rect = range.getBoundingClientRect(); 253 | range.detach(); 254 | if (rect.left >= this._clientX) 255 | offset--; 256 | 257 | if (!text[offset]) return ""; 258 | var type = this.getCharType(text[offset]); 259 | if (!type) return ""; 260 | 261 | var mae = text.substr(0, offset); 262 | var ato = text.substr(offset); // text[offset] はこっちに含まれる 263 | var ato_word = (this.startReg[type].exec(ato) || [""])[0]; 264 | var str = this.endReg[type].test(mae) ? RegExp.lastMatch + ato_word : ato_word; 265 | 266 | if (str.length === 1) { 267 | if (type === "kanji") { 268 | if (this.startReg["hiragana"].test(ato.substr(ato_word.length))) 269 | str += RegExp.lastMatch; 270 | } else { 271 | return ""; 272 | } 273 | } 274 | 275 | return str; 276 | }, 277 | 278 | log: function() { 279 | Application.console.log("[contextSearcher] " + Array.slice(arguments)); 280 | } 281 | } 282 | 283 | window.contextSearcher.init(); 284 | 285 | //搜索完成后自动清空搜索栏并切回默认搜索引擎 286 | (function() { 287 | var searchbar = document.getElementById("searchbar"); 288 | searchbar._doSearchInternal = searchbar.doSearch; 289 | searchbar.doSearch = function(aData, aInNewTab) { 290 | this._doSearchInternal(aData, aInNewTab); 291 | // 清空搜索栏 292 | this.value = ""; 293 | // 切回默认引擎 294 | this.currentEngine = this.engines ? this.engines[0] : this._engines[1]; 295 | }; 296 | }()); -------------------------------------------------------------------------------- /myNewTab.md: -------------------------------------------------------------------------------- 1 | 2 | # myNewTab.xpi使用说明: # 3 | 首发在卡饭:[一键安装myNewTab.xpi](http://bbs.kafan.cn/thread-1759418-1-1.html) 4 | 5 | 安装后新建标签即可看到效果。在导航面板右上角有三个按钮,分别是定位、切换、编辑,其对应作用分别是打开扩展路径、切换或重新下载背景图片、编辑站点。 6 | ###效果图如下: 7 | ![mynewtab](https://github.com/defpt/userChromeJs/blob/master/Picture/mynewtab.png?raw=true) 8 | ##可设置参数: 9 | 点击定位,编辑index.js,可以按需设置以下内容 10 | 11 | var useBingImage = 1; // 1:使用 bing 的背景图片? 0:不使用 12 | var updateImageTime = 12; // 更新 bing 背景图片的间隔(单位:小时) 13 | var bingImageSize = 0; // bing 图片的尺寸,0 为默认的 1366x768,1 为 1920x1080(大很多,可能会加载慢些) 14 | var bingMaxHistory = 10; // 最大历史天数,可设置[2, 16] 15 | var isNewTab = 0; // 1:强制新标签页打开导航链接或搜索结果 0:在当前标签打开导航链接或搜索结果 16 | ###切换按钮释疑: 17 | 18 | - 1、用于切换背景,默认用的是每天微软bing的壁纸,如果当天壁纸不喜欢,那么这时候切换就有用了,点一下切换,即可使用过去10天内bing的壁纸(定位到bingimg文件夹会发现里面有10张壁纸),可以在index.js中设置这个最大历史参数,个人觉得其实有那么三五张备份就够了,如果10天内的壁纸都不能看,那微软也太失败了…… 19 | 20 | - 2、用于下载背景图片,有时候由于网络原因会出现下载图片失败从而导致背景为灰色的情况,这时候可通过点击切换按钮重新下载图片,然后刷新即可 21 | 22 | ###bing图片说明: 23 | 24 | - 默认使用 bing 的背景图片,如果不喜欢bing背景图片,可从定位路径编辑 index.js 文件,搜索 var usebingimage = 1; 把其改为 var usebingimage = 0; 同时自己选择一张图片重命名为 default.jpg 放入img文件内替换原图片。 25 | 26 | - 默认下载的 bing 图片为 1366x768,适合15英寸左右笔记本,如果使用的是大显示器,请编辑 index.js 搜索 var bingimagesize = 0; 改为 var bingimagesize = 1;这样下载的是1920x1080的大图 27 | 28 | - 使用大显示器可能背景没有拉伸到全屏,可点击定位打开以后,编辑 style.css 样式文件。 搜索:background-size:auto; 把其改为形如:background-size:1280px 800px;(数字设置为你的分辨率) 29 | 30 | ###搜索引擎设置: 31 | 点击定位,用编辑器(比如notepad++)打开 index.html 以及 data.js 即可随意定制自己常用的搜索引擎,照猫画虎应该不难。。。 32 | 33 | 34 | - 在 index.html 中搜索引擎列表中带**class="active"**为默认激活的搜索引擎,比如安装后默认就是百度,可以自己把其添加到其它搜索引擎上,**注意只能设置一个默认搜索引擎** 35 | - 是否开启搜索提示?默认设置为开启。在 index.html 中搜索 **baiduSug** 当设置baiduSug=1时,用户选中sug词条时默认执行表单提交动作;当设置baiduSug=2时,用户选中sug词条时不执行表单提交动作;删除该属性时,不显示搜索提示。 36 | - 是否自动聚焦到搜索框?默认设置为自动聚焦在搜索框。在 index.html 中搜索 **autofocus="autofocus"** 删除即可取消自动聚焦到搜索框 37 | 38 | ###站点设置: 39 | **通过点击编辑,可进行站点配置,设置范例如下:** 40 | 41 | 新闻资讯 42 | feedly, http://cloud.feedly.com/, http://feedly.com/favicon.ico 43 | it 资讯, http://www.ithome.com/list/, img/ithome.ico 44 | 凤凰网, http://www.ifeng.com/, img/ifeng.png 45 | 新浪网, http://www.sina.com.cn/ 46 | 47 | 最上面的新闻资讯是分类,其下是站点,一般来说不用设置图标,打开的时候会自动补上站点默认图标,鉴于有些站点没有图标或者图标不好看,可以自己设置为喜欢的图标,建议图标放置在img文件夹内,调用方式如上图,可以是在线或本地的ico、png等格式。 48 | 49 | ###天气预报 50 | 喜欢天气预报的还可以加上天气预报代码,[天气预报代码定制](http://www.tianqi.com/plugin/) 51 | 个人觉得加在默认左上角就不错。**点击定位编辑index.html** 把定制的代码添加到下图中所示位置,效果图如下: 52 | 53 | ![tqyb](https://github.com/defpt/userChromeJs/blob/master/Picture/tqyb.png?raw=true) 54 | -------------------------------------------------------------------------------- /openImgRar.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @include chrome://browser/content/browser.xul 3 | // ==/UserScript== 4 | location == "chrome://browser/content/browser.xul" && (function () { 5 | (function (m) { 6 | m.id = "openImgRar"; 7 | m.addEventListener("command", function () { 8 | var imageUrl = (gContextMenu.mediaURL || gContextMenu.imageURL); 9 | imageUrl = imageUrl.replace(/\.jpg\.thumb\.jpg$/, '.jpg'); 10 | 11 | var file = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("TmpD", Ci.nsILocalFile); 12 | file.append(new Date().getTime() + ".rar"); 13 | 14 | Cc["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"].createInstance(Ci.nsIWebBrowserPersist) 15 | .saveURI(Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService) 16 | .newURI(imageUrl, null, null), null, null, null, null, file, null); 17 | setTimeout(function() { 18 | file.launch(); 19 | }, 100); 20 | }, false); 21 | m.setAttribute("label", "\u6253\u5F00\u56FE\u7247rar"); 22 | })(document.getElementById("contentAreaContextMenu").insertBefore(document.createElement("menuitem"), document.getElementById("context-openlinkintab"))); 23 | document.getElementById("contentAreaContextMenu").addEventListener("popupshowing", function () { 24 | gContextMenu.showItem("openImgRar", gContextMenu.onImage); 25 | }, false); 26 | })() -------------------------------------------------------------------------------- /quickProxyMod.uc.js: -------------------------------------------------------------------------------- 1 | // ==UserScript== 2 | // @name quickProxyMod.uc.js 3 | // @namespace http://space.geocities.yahoo.co.jp/gl/alice0775 4 | // @description 快速代理设置,带GAE启动按钮 5 | // @include main 6 | // @compatibility 7 | // @charset UTF-8 8 | // @author Alice0775 9 | // @version v2014.08.10 10 | // @note 2014-08-10 变化无常,还是默认goagent.exe好了 11 | // @note 2014-07-25 修复对老版本FF的支持 by ywzhaiqi 12 | // @note 2014-07-22 使用bat、vbs代码代替startgoa.exe,实现单文件版uc脚本 by ywzhaiqi 13 | // @note 2014-07-21 默认设置gae放置在chrome/local,自动判断系统是否win8+ 启动不同程序 by defpt 14 | // @note 2014-04-26 左键:开关代理+首次点击启动GAE 中键:启动GAE 右键:代理设置UI by defpt 15 | // @note 2012-01-31 11:00 by Alice0775 16 | // @homepageURL https://github.com/defpt/userChromeJs/blob/master/quickProxyMod.uc.js 17 | // @reviewURL http://bbs.kafan.cn/thread-1724548-1-1.html 18 | // ==/UserScript== 19 | /*******===代理相关说明===== 20 | 脚本里面放置了两种路径写法,请自己设置适合路径 21 | 默认路径如下: 22 | 相对路径是:配置下chrome\Local\GoAgent\ 23 | 绝对路径是:D:\Program Files\GoAgent\ 24 | 0: 表示不使用代理 25 | 1:表示手动设置代理 26 | 2:表示自动代理配置 27 | 4:自动检测此网络代理配置 28 | 5:表示使用系统代理设置 29 | */ 30 | (function (css) { 31 | Components.utils.import("resource://gre/modules/FileUtils.jsm"); 32 | //相对路径 33 | //var GAEPath = FileUtils.getFile('UChrm', ['local','GoAgent',]).path; 34 | //绝对路径 35 | var GAEPath = "D:\\Program Files\\GoAgent"; 36 | 37 | var Proxytye_startFF = 0; //0 1 2 4 5 设置FF启动时代理状态 38 | var GAE_on = false; 39 | 40 | //-- config end-- 41 | var quickProxy = { 42 | _init : function () { 43 | var overlay = '\ 44 | \ 46 | \ 47 | \ 50 | \ 51 | \ 52 | '; 53 | overlay = "data:application/vnd.mozilla.xul+xml;charset=utf-8," + encodeURI(overlay); 54 | window.userChrome_js.loadOverlay(overlay, quickProxy); 55 | addStyle(css); 56 | 57 | quickProxy.addPrefListener(quickProxy.buttonPrefListener); // 登録処理 58 | window.addEventListener('unload', function () { 59 | quickProxy.removePrefListener(quickProxy.buttonPrefListener); 60 | }, false); 61 | }, 62 | 63 | observe : function (subject, topic, data) { 64 | if (topic == "xul-overlay-merged") { 65 | var icon = document.getElementById("quickproxy-status"); 66 | var Is_Proxy_On = quickProxy.getPref("network.proxy.type", 'int', 0); 67 | quickProxy.addPrefListener(quickProxy.buttonPrefListener); // 登録処理 68 | window.addEventListener('unload', function () { 69 | quickProxy.removePrefListener(quickProxy.buttonPrefListener); 70 | }, false); 71 | quickProxy.setPref("network.proxy.type", 'int', Proxytye_startFF); 72 | quickProxy._updateUI(); 73 | } 74 | }, 75 | 76 | _switch : function () { 77 | var Is_Proxy_On = this.getPref("network.proxy.type", 'int', 0); 78 | var Proxy_Type = this.getPref("quickproxy.type", 'int', 1); //初始代理设置 79 | if (Is_Proxy_On == 0) { 80 | Is_Proxy_On = Proxy_Type; 81 | } else { 82 | Is_Proxy_On = 0; 83 | } 84 | this.setPref("network.proxy.type", 'int', Is_Proxy_On); 85 | this._updateUI(); 86 | }, 87 | 88 | _goagent:function(e){ 89 | var batText = '\ 90 | @Echo Off\n\ 91 | SET exeName=goagent.exe\n\ 92 | TaskList|Findstr /i %exeName% > Nul\n\ 93 | If ErrorLevel 1 (\n\ 94 | START "" "{GOAGENT}\\%exeName%"\n\ 95 | )\ 96 | '; 97 | batText = batText.replace('{GOAGENT}', GAEPath); 98 | var batFile = this.createTempFile(batText, "startGoagent.bat"); 99 | 100 | var vbsText = 'set ws=wscript.createobject("wscript.shell")\n' + 101 | 'ws.run "' + batFile + ' /start",0'; 102 | var vbsFile = this.createTempFile(vbsText, 'startGoagent.vbs') 103 | 104 | this.runNative(vbsFile, []); 105 | }, 106 | 107 | runNative: function(exePath, args, blocking) { 108 | if (typeof blocking == 'undefined') blocking = false; 109 | var exeFile = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsILocalFile); 110 | exeFile.initWithPath(exePath); 111 | if (exeFile.exists()) { 112 | var proc = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); 113 | proc.init(exeFile); 114 | proc["runw" in proc ? "runw" : "run"](blocking, args, args.length); 115 | return 0; 116 | } else { 117 | return -1; 118 | } 119 | }, 120 | createTempFile : function(data, filename, charset) { 121 | var file = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties).get("TmpD", Ci.nsIFile); 122 | file.append(filename); 123 | if (file.exists()) { 124 | file.remove(false); 125 | } 126 | file.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE); 127 | 128 | var foStream = Cc["@mozilla.org/network/file-output-stream;1"].createInstance(Ci.nsIFileOutputStream); 129 | foStream.init(file, 0x02 | 0x08 | 0x20, 0700, 0); 130 | var converter = Cc["@mozilla.org/intl/converter-output-stream;1"].createInstance(Ci.nsIConverterOutputStream); 131 | converter.init(foStream, charset || "gbk", 0, "?".charCodeAt(0)); 132 | converter.writeString(data); 133 | converter.close(); 134 | 135 | return file.path; 136 | }, 137 | 138 | _click : function (e) { 139 | if (e.button == 0) { 140 | if(GAE_on == false){ 141 | this._goagent(); 142 | GAE_on = true; 143 | } 144 | this._switch(); 145 | } 146 | if (e.button == 1) { 147 | this._goagent(); 148 | } 149 | if (e.button == 2) { 150 | gBrowser.selectedTab = gBrowser.addTab("chrome://browser/content/preferences/connection.xul"); 151 | } 152 | e.preventDefault(); 153 | }, 154 | 155 | _updateUI : function () { 156 | var Is_Proxy_On = this.getPref("network.proxy.type", 'int', 0); 157 | var icon = document.getElementById("quickproxy-status"); 158 | var text1 = ""; 159 | switch (Is_Proxy_On) { 160 | case 0: 161 | case 3: 162 | icon.setAttribute("state", "disable"); 163 | icon.setAttribute("tooltiptext", "代理已关闭\n左键:打开代理\n中键:启动 GAE\n右键:代理设置 UI"); 164 | return; 165 | case 1: 166 | var ip = this.getPref("network.proxy.http", "str", ""); 167 | var port = this.getPref("network.proxy.http_port", "int", 0); 168 | text1 = "\n当前代理:" + ip + ":" + port; 169 | break; 170 | case 2: 171 | text1 = "\n当前状态:自动代理配置(PAC)"; 172 | break; 173 | case 4: 174 | text1 = "\n当前状态:自动检测此网络的代理设置"; 175 | break; 176 | case 5: 177 | text1 = "\n当前状态:使用系统代理设置"; 178 | break; 179 | } 180 | icon.setAttribute("state", "enable"); 181 | icon.setAttribute("tooltiptext", "代理已打开" + text1 + "\n左键:关闭代理\n中键:启动 GAE\n右键:代理设置 UI"); 182 | }, 183 | 184 | getPref : function (aPrefString, aPrefType, aDefault) { 185 | var xpPref = Components.classes["@mozilla.org/preferences-service;1"] 186 | .getService(Components.interfaces.nsIPrefBranch); 187 | try { 188 | switch (aPrefType) { 189 | case "str": 190 | return xpPref.getCharPref(aPrefString).toString(); 191 | break; 192 | case "int": 193 | return xpPref.getIntPref(aPrefString); 194 | break; 195 | case "bool": 196 | default: 197 | return xpPref.getBoolPref(aPrefString); 198 | break; 199 | } 200 | } catch (e) {} 201 | return aDefault; 202 | }, 203 | 204 | setPref : function (aPrefString, aPrefType, aValue) { 205 | var xpPref = Components.classes["@mozilla.org/preferences-service;1"] 206 | .getService(Components.interfaces.nsIPrefBranch); 207 | try { 208 | switch (aPrefType) { 209 | case "str": 210 | return xpPref.setCharPref(aPrefString, aValue); 211 | break; 212 | case "int": 213 | aValue = parseInt(aValue); 214 | return xpPref.setIntPref(aPrefString, aValue); 215 | break; 216 | case "bool": 217 | default: 218 | return xpPref.setBoolPref(aPrefString, aValue); 219 | break; 220 | } 221 | } catch (e) {} 222 | return null; 223 | }, 224 | // 开始监测 225 | addPrefListener : function (aObserver) { 226 | try { 227 | var pbi = Components.classes['@mozilla.org/preferences;1'].getService(Components.interfaces.nsIPrefBranch2); 228 | pbi.addObserver(aObserver.domain, aObserver, false); 229 | } catch (e) {} 230 | }, 231 | 232 | // 监测结束 233 | removePrefListener : function (aObserver) { 234 | try { 235 | var pbi = Components.classes['@mozilla.org/preferences;1'].getService(Components.interfaces.nsIPrefBranch2); 236 | pbi.removeObserver(aObserver.domain, aObserver); 237 | } catch (e) {} 238 | }, 239 | 240 | buttonPrefListener : { 241 | domain : 'network.proxy.type', 242 | observe : function (aSubject, aTopic, aPrefstring) { 243 | if (aTopic == 'nsPref:changed') { 244 | var type = quickProxy.getPref(aPrefstring, 'int', 0); 245 | if (type != 0) 246 | quickProxy.setPref("quickproxy.type", 'int', type); 247 | quickProxy._updateUI(); 248 | } 249 | } 250 | } 251 | } 252 | 253 | quickProxy._init(); 254 | window.quickProxy = quickProxy; 255 | 256 | function addStyle(css) { 257 | var pi = document.createProcessingInstruction( 258 | 'xml-stylesheet', 259 | 'type="text/css" href="data:text/css;utf-8,' + encodeURIComponent(css) + '"'); 260 | return document.insertBefore(pi, document.documentElement); 261 | } 262 | })('\ 263 | #quickproxy-status {\ 264 | list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACtSURBVDhPtZLRDcIwDEQzBFOwRCrEJkh8lVHYCJHRii7xpc7FleCDJ0XN3dluUjX9hbUsG5bJAWZryVezZvaiNuTxupy911Yw4F7yybYVDgDIvP4avIknaHo/2SFawCa/LBqJ7gofT16v+u/lhn3FF+uykqAmPy1q+NDrGv5K1Oy9KO8wxLcwq3tsUt05CtRX3YmCqUgIczU5lL7qCQT+l9YG1RP4STT0DWNzSh+/vPJ+zsBLfwAAAABJRU5ErkJggg==");\ 265 | }\ 266 | #quickproxy-status[state="disable"] {\ 267 | list-style-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAACpSURBVDhPtZLRDcIwDEQ9BFPwVVFG6CbM05FpwOZsOWdXgg+eFMl3Z6dJFfkLY5WhC3LCs3GXDVYlmrDJscg1e7a6Dd7BBaWhjSgty/pr9Et+AtM4gYVncIMP5YVoprur+qjtelofqzy0NryxW2gpPc+b7Ig+5DBrC3+lG85elwce6r+AFZ4PsQ7OAvZZB11Qmog2Z9M3dZ91AWE8aR5gXdBHwmEemIdFXgyA2y0tFxR1AAAAAElFTkSuQmCC");\ 268 | }\ 269 | '); -------------------------------------------------------------------------------- /userChrome/README.md: -------------------------------------------------------------------------------- 1 | ###说明文档: 2 | UC脚本相关脚本 3 | 4 | **userChrome.js** 是UC脚本引导器,这里是y大修正版,我添加了两个文件夹分类:BtnScript(表示带按钮的脚本)、PteScript(表示是私用脚本) 5 | 6 | **rebuild_userChrome.uc.xul** 是我自用的精简版UC管理器,可在脚本 51 行处设置按钮位置,1:表示按钮在地址栏,0:表示按钮在三道杠前面 7 | --------------------------------------------------------------------------------