您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Extends the document with a new namespace for user script crosswide functions to utilize. Has no use alone but can be accessed by other scripts using document.fExt
// ==UserScript== // @name frisch's UserScript Extender // @namespace http://null.frisch-live.de/ // @version 0.76 // @description Extends the document with a new namespace for user script crosswide functions to utilize. Has no use alone but can be accessed by other scripts using document.fExt // @author frisch // @include * // @require http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js // @grant GM_setClipboard // ==/UserScript== if(document.fExt === undefined) { console.log("Initializing frisch's UserScript Extender..."); // Initialization fExt = {}; fExt.jq = $.noConflict(); // Overwrites the contains expression to be case-insensitive fExt.jq.expr[':'].contains = function(a, i, m) { return fExt.jq(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; }; fExt.settings = { minShowTime: 3000, // in milliseconds maxShowTime: 7000, // in milliseconds position: "BottomRight", // Position for the popup menu: TopRight, TopLeft, BottomRight, BottomLeft animationType: "fade", // Animation for the popup menu: slide, fade, none animationSpeed: 750, customContextMenu: true, hideContextMenuOnLeave: true, // automatically fades out the custom context menu when it loses focus, otherwhise only hides when you click somewhere hideContextMenuDistance: 50, // the distance the cursor has to travel outside of the context menu to hide it progressType: "progressbar", // Possible values: hourglass, progressbar toleranceX: 20, // pixels as tolerance for the context menu, adjust the position slightly toleranceY: 30, // pixels as tolerance for the context menu, adjust the position slightly ctxActorMark: true, // set to true to highlight the actor of the context menu when active ctxActorMarkThickness: 2, // set the thickness of the highlighting border as pixel }; fExt.popupQueue = []; fExt.popping = false; var hourGlass0 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfgAhkICgkAYfvBAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAKpJREFUSMetlcEOwyAMQ+39/z97h0nrOkjihPZAAYlXVPALcPgQgE7WEzhA8LODKYLfZoTg7dVGcOm0ENx2bQTDgYVgOiwRLCdSBK2pEEHAB6wI2pvaIgj0AReC87SpOtbXEz5Ivq97Zrs/UWvsO8eovTnci6RYPs5VVu6vKkyqFZjFWZ5FI6EYOkiEIlNIgdLUUOJGqmpK+U/rGpSFn8KiYWHiA8X1NM14AxEBKx1JZtGVAAAAAElFTkSuQmCC"; var hourGlass25 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfgAhkICgR+0Id8AAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAKhJREFUSMetlUkOxCAMBLv4/589h5koG3hjckgAydVtR8bS5oMk24lH+iKsoSx+3zqC++tA1C1cAQ0LT0AewXSZRrDcpBC42xBBeOAiSB0tEUh5wBtB2tQUgVQHnAj63WbRbx3/uA8cfbv3bLWIlxJQT+FQDy4LInUFLkYUHl1ZI6PuIciGrxIZidxdF+TV5y6GH05YC2rqbxc0p8JjsFi/k7aH62436wPGSjUSU11z+AAAAABJRU5ErkJggg=="; var hourGlass50 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfgAhkICTqUnMkUAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAKpJREFUSMe1lMsOgzAMBHfy///sHopEQsGv0BxAMtpZJ8ErbS4k2Y4e6YuwhrM43nUE66OKmJVM9SRiNWb5lkBc+r4ACi08AZIteAAfQVhwEaRKjwikPOAXQbqpWwRSHXAi6E+bRdc63sgDx9/Wma0e4nQE1LdwyAlmjMhdQRcjkkeRRcbd62L48jhvRuzupx7lPHIizTo/IC35Taxbdwxoy6d7tb8NY2Z9AJxfMxVU9/UgAAAAAElFTkSuQmCC"; var hourGlass75 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfgAhkICTPtQHGwAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAK1JREFUSMetlUkSgzAMBKf5/5/FIUnFG9ZiOEAVaHqE8Qjp8ECSneiRPggrOIvvNY+gP2URrZLmfhDRG9M9CyCGvgeAi2DSMNVsECwULOoeECzrWVptW4gANi1EATOCcFNLBFIe8EdQT5t5O+t6Yx5s/K3PbHYRmyUg/wo/dycgeO5yurh8+b4LEkkIhsly342k3Bkolt89FOQPQ9Vqe5iifJhxVk/S8c/1NM26AScHLxnJI48dAAAAAElFTkSuQmCC"; var hourGlass100 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfgAhkICSxgSHxFAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAKpJREFUSMetlUsShDAIBem5/52ZxbhIIhA+40Kr9L0GCSEiwwsR0YkfkR9CG5GF51lHsN+qiNXJ8j6J2AOzfUsgjrwPwBXBy8NLEyAwHBg6B4GpxwxlIHDUONkeCFwtbr0WBIGSoOQPglBHuOiaUl0Ql876/GMejH6BhL1ZRM0pSdqLjaT5fCnYk5tJa+tG0X4ZKFrvHhp2Z6hqr4dp2o8xof2dND5cp7tZvgvYKh27llJDAAAAAElFTkSuQmCC"; var pbar0 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AkTCSsaEe8UvgAAALZJREFUSMfdll0OxCAIhAfDjfT+J5Az0adumo1FUXSTnacmVj8ZflpSVQAAEaGlnPPnWUTg1X0+v73wBFjro/C0AvGIIwAj0bF1yHNjD+KKqAWZsam1h98gMwDrYrya7BF7Tes8kJGLpRMQACBVBREpNkpVKeGQvhuWIqtQRHQ5R16FgXrDNQzUs/aYdf9X3nR/akspZqJnh2yt9UflPfPj4Sl59vTCSl/xzii29ZHlSIoaMb31C3teW2ty8diEAAAAAElFTkSuQmCC"; var pbar25 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AkTCSsrQDEUhAAAALZJREFUSMfdlssNxCAMRMfIHUH/FcQ1zZ6yyoEYzG+lnVMkAg+PP4mQBACICGrKOX+fzQxR3efr2wtPgLfeC08zkIh0BaAnOvUOeW5sQUIR1SAjNtX26BtkBOBdTGeT3WOva10E0nOxdAICAEISIkJsFElJOCTtqCIZrUIz43SOoloGag3XZaCWtces+7/ylvtTW0pxEz06ZK/r+lF5j/x4REpeI70w01e6M4ptfeQ5klaNmNb6B29WW2uHr2HMAAAAAElFTkSuQmCC"; var pbar50 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AkTCSs7XYYE4AAAALVJREFUSMfdlssNxCAMRMfIHZn+Kwg1zZ6yyoEYzG+lnVMkAg+PP4mQBACICGoys+9zKQVR3efr2wtPgLfeC08zkIh0BaAnOvUOeW5sQUIR1SAjNtX26BtkBOBdTGeT3WOva10E0nOxdAICAEISIkJsFElJOKThHJmZdNjL6RxFtQzUGq7LQK3qO2bd/5W33J/anLOb6NEhe13Xj8p75McjUvIa6YWZvtKdUWzrI8+RtGrEtNY/mktYa4XsqhcAAAAASUVORK5CYII="; var pbar75 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AkTCSwJ2hDDpwAAAK1JREFUSMftllEOAyEIRAfDjfD+J9AzsV/bbBpFQWuTpvNlgvJwNCipKgCAiNCSiLzGtVZ4defn3oQnwIrPwtMKxCPeAZjZHVtJngtHENeOWpCITa013INEAFZhvHrYM/aa1nkgM4WlExAAIFUFESk+KFWlhEPinclEhN7s1eUz8uoPCuv3rjfdT23O2ewC0SZbSvnSZYh8PDydnXuBnZDtLcgqNp2AuEAjW0fxC+YyVWuwau4lAAAAAElFTkSuQmCC"; var pbar100 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4AkTCTAYVte+CAAAAKJJREFUSMftllEOxCAIRAfDjfT+J9AzzX510w+loLabbDpfJigPR4MKSQCAiKCnnPN33FpDVEd+HU04A6y4F55WIBHpDoBnd2olOS+8goR21IPM2NRboyPIDMAqTFcP22OvaV0E4iksPQEBACEJESFuFElJeEgv6AX9MUiOp7aUYnaB2SZba/2RdTMfj0hn11FgJ2T5mfAAbrl1liNpRxJP/APHYkptRNVvhwAAAABJRU5ErkJggg=="; var loader0, loader25, loader50, loader75, loader100; switch(fExt.settings.progressType){ case "progressbar": loader0 = pbar0; loader25 = pbar25; loader50 = pbar50; loader75 = pbar75; loader100 = pbar100; break; case "hourglass": loader0 = hourGlass0; loader25 = hourGlass25; loader50 = hourGlass50; loader75 = hourGlass75; loader100 = hourGlass100; break; default: loader0 = hourGlass0; loader25 = hourGlass25; loader50 = hourGlass50; loader75 = hourGlass75; loader100 = hourGlass100; break; } var topZIndex = 0; fExt.TopZIndex = function() { return topZIndex; }; fExt.jq("*").each(function(){ var thisZIndex = parseInt(fExt.jq(this).css('z-index')); if(!isNaN(thisZIndex) && thisZIndex > topZIndex) topZIndex = thisZIndex + 1; }); // Custom Elements fExt.fExtPopup = fExt.jq('<div id="fExtPopup" class="fExtElement" style="display:none; position:fixed; width:auto; height:auto; background-color:#545454; padding:10px; border-color:white; border-style:groove; color:white; z-index: ' + topZIndex + '; text-align:center; font-size:12px;"></div>'); fExt.jq("body").append(fExt.fExtPopup); fExt.fExtMessage = fExt.jq('<div id="fExtMessage" class="fExtElement" style="display:none; position:fixed; width:auto; height:auto; background-color:#545454; padding:25px; border-color:white; border-style:groove; color:white; z-index: ' + topZIndex + '; text-align:center; font-size:large; padding:20px;"></div>'); fExt.fExtMessageText = fExt.jq('<span style="display: inline-block;"></span>'); fExt.fExtMessageText.appendTo(fExt.fExtMessage); fExt.fExtMessage.appendTo("body"); // Functions fExt.setLoading = function(percentage){ if(percentage >= 100){ fExt.jq("link[rel='icon']").attr("href", loader100); fExt.jq("link[rel='shortcut icon']").attr("href", loader100); setTimeout(function(){ fExt.setLoading(-1); },fExt.settings.minShowTime); } else if(percentage >= 75){ fExt.jq("link[rel='icon']").attr("href", loader75); fExt.jq("link[rel='shortcut icon']").attr("href", loader75); } else if(percentage >= 50){ fExt.jq("link[rel='icon']").attr("href", loader50); fExt.jq("link[rel='shortcut icon']").attr("href", loader50); } else if(percentage >= 25){ fExt.jq("link[rel='icon']").attr("href", loader25); fExt.jq("link[rel='shortcut icon']").attr("href", loader25); } else if(percentage >= 0){ fExt.jq("link[rel='icon']").attr("href", loader0); fExt.jq("link[rel='shortcut icon']").attr("href", loader0); } else { fExt.jq("link[rel='icon']").attr("href", siteFavIconHref); fExt.jq("link[rel='shortcut icon']").attr("href", siteFavIconHref); } }; fExt.enqueuePopup = function(msg) { fExt.popupQueue.push(msg); }; fExt.dequeuePopup = function() { var rv; if(fExt.popupQueue.length > 0){ rv = fExt.popupQueue[0]; fExt.popupQueue.splice(0, 1); } return rv; }; var ignoreZIndexelementIDs = ["fExtPopup","fExtMessage","fExtContextMenu","fExtUtilSelectorBox"]; fExt.reassignZIndex = function(){ fExt.jq("*").each(function(){ var jqElement = fExt.jq(this); if(jqElement.css('z-index') >= topZIndex && fExt.jq.inArray(this.id, ignoreZIndexelementIDs) < 0) { jqElement.css("z-index", topZIndex - 1); } }); }; fExt.createStyle = function(newClass) { fExt.jq( "<style>" + newClass + "</style>" ).appendTo("head"); }; fExt.center = function (element,w) { if(w !== undefined) element.width(w); element.css("position", "fixed") .css("top", ((fExt.jq(window).height() - fExt.jq(element).outerHeight()) / 2) + "px") .css("left", ((fExt.jq(window).width() - fExt.jq(element).outerWidth()) / 2) + "px"); }; fExt.popup = function(msg) { if(msg !== undefined){ if(fExt.popping){ fExt.enqueuePopup(msg); return; } fExt.popping = true; fExt.fExtPopup.html(msg); fExt.show(fExt.fExtPopup); var showTime = msg.length * 50; if(showTime < fExt.settings.minShowTime) showTime = fExt.settings.minShowTime; else if(showTime > fExt.settings.maxShowTime) shotTime = fExt.settings.maxShowTime; setTimeout(function(){ fExt.hide(fExt.fExtPopup); setTimeout(function(){ fExt.fExtPopup.text(''); fExt.popping = false; fExt.popup(fExt.dequeuePopup()); },fExt.settings.animationSpeed); },showTime); } }; fExt.clipboard = function(action, text) { var clipboardCopy, retVal; action = action.toLowerCase(); if(action === "copy") { GM_setClipboard(text); return true; } clipboardCopy = document.createElement('textarea'); document.body.appendChild(clipboardCopy); clipboardCopy.value = text; clipboardCopy.select(); var msg; try { var successful = document.execCommand(action); if(successful) msg = action + " successful"; else msg = "Could not perform Clipboard-Action " + action; if(clipboardCopy.value.length <= 50) msg += " (" + clipboardCopy.value + ")"; document.fExt.popup(msg); } catch (err) { document.fExt.popup("Error on Clipboard-Action " + action +": " + err); } if(clipboardCopy) clipboardCopy.remove(); }; fExt.message = function(msg) { if(msg !== undefined && msg.length > 0){ fExt.fExtMessageText.text(msg); if(!fExt.fExtMessage.is(":visible")) fExt.show(fExt.fExtMessage); fExt.center(fExt.jq("div#fExtMessage")); } else { fExt.hide(fExt.fExtMessage); setTimeout(function(){ fExt.fExtMessageText.text(''); },fExt.settings.animationSpeed); } }; fExt.rotate = function(element, rotation) { var jqEl = fExt.jq(element); var degree = jqEl.data('rotation'); if (!degree) degree = 0; degree += rotation; jqEl.css('-webkit-transform','rotate(' + degree + 'deg)'); jqEl.data('rotation',degree); }; fExt.zoom = function(element, zoom){ var jqEl = fExt.jq(element); var zValue = parseFloat(jqEl.css('zoom')); var zAdd = parseFloat(zoom) / 100; if(!zValue) zValue = 1.0; var zNew = zValue + zAdd; jqEl.css('zoom', zNew); }; fExt.zoomIn = function(element, zoom){ fExt.zoom(element, zoom); }; fExt.zoomOut = function(element, zoom){ fExt.zoom(element, zoom * -1); }; switch(fExt.settings.animationType) { case "fade": fExt.show = function(element, speed, callback) { fExt.jq(element).fadeIn(speed >= 0 ? speed : fExt.settings.animationSpeed, callback); }; fExt.hide = function(element, speed, callback) { fExt.jq(element).fadeOut(speed >= 0 ? speed : fExt.settings.animationSpeed, callback); }; break; case "slide": fExt.show = function(element, speed, callback) { fExt.jq(element).slideDown(speed >= 0 ? speed : fExt.settings.animationSpeed, callback); }; fExt.hide = function(element, speed, callback) { fExt.jq(element).slideUp(speed >= 0 ? speed : fExt.settings.animationSpeed, callback); }; break; default: fExt.show = function(element, speed, callback) { fExt.jq(element).show(speed >= 0 ? speed : fExt.settings.animationSpeed, callback); }; fExt.hide = function(element, speed, callback) { fExt.jq(element).hide(speed >= 0 ? speed : fExt.settings.animationSpeed, callback); }; break; } switch(fExt.settings.position) { case "TopRight": fExt.fExtPopup.attr("style", fExt.fExtPopup.attr("style") + "top:50px; right:50px;"); break; case "TopLeft": fExt.fExtPopup.attr("style", fExt.fExtPopup.attr("style") + "top:50px; left:50px;"); break; case "BottomRight": fExt.fExtPopup.attr("style", fExt.fExtPopup.attr("style") + "bottom:50px; right:50px;"); break; case "BottomLeft": fExt.fExtPopup.attr("style", fExt.fExtPopup.attr("style") + "bottom:50px; left:50px;"); break; default: break; } var siteFavIcon = fExt.jq("link[rel='icon']"); if(siteFavIcon === undefined) { fExt.jq("head").append('<link id="favIcon" rel="icon" href="'); siteFavIcon = fExt.jq("link[rel='icon']"); } else { siteFavIcon.attr("id","favIcon"); } var siteFavIconHref = siteFavIcon.attr("href"); fExt.getSelection = function() { return window.getSelection().toString(); }; fExt.getSource = function(element) { var retVal; var jqTarget = fExt.jq(element); var ucTagName = element.tagName.toUpperCase(); switch(ucTagName) { case "IMG": retVal = element.src; break; case "A": retVal = element.href; break; case "VIDEO": var videoSource = jqTarget.find("source"); retVal = (videoSource.length > 0) ? videoSource.get(0).src : undefined; break; case "INPUT": return jqTarget.val(); default: jqTarget = fExt.jq(element).closest("a"); if(jqTarget.length > 0) retVal = jqTarget.attr("href"); break; } if(retVal) { if(!retVal.match("http.*")) { retVal = window.location.origin + retVal; } } else { retVal = fExt.jq(element).text(); } return retVal; }; fExt.createStyle(".fExtLoader { background:url('" + loader50 + "') #EFF7FF no-repeat top center; }"); // ContextMenu if(fExt.settings.customContextMenu) { fExt.ctxMenu = []; // Styles fExt.createStyle("#fExtContextMenu,#fExtContextMenu * { text-align: left !important; text-decoration: none !important; color: #fff; z-index: " + (topZIndex + 10) + "; }"); fExt.createStyle("#fExtContextMenu { position: fixed; }"); fExt.createStyle("#fExtContextMenu,.ctxSubList { font-size: 14px; background-color: #263238; width: 300px; height: auto; padding: 0;}"); fExt.createStyle("#fExtContextMenu a,#fExtContextMenu hr,#fExtContextMenu li { width: 100%;}"); fExt.createStyle("#fExtContextMenu .ctxElement { float: left; clear: left;}"); fExt.createStyle("#fExtContextMenu li>a,#fExtContextMenu li>div,.ctxSubList li>a,.ctxSubList li>div { padding: 8px;}"); fExt.createStyle("#fExtContextMenu li hr { margin: 0; border-style: solid; border-color: #666; border-width: 1px 0 0 0;}"); fExt.createStyle("#fExtContextMenu li.ctxSub { cursor: default; font-weight: bold;}"); fExt.createStyle("#fExtContextMenu li.ctxSub * { cursor: pointer; font-weight: normal;}"); fExt.createStyle("#fExtContextMenu li { list-style-type: none; margin: 0 !important;}"); fExt.createStyle("#fExtContextMenu li.ctxSub:hover>div.ctxSubLabel,"); fExt.createStyle("#fExtContextMenu li.ctxSub:hover>div.ctxArrow {}"); fExt.createStyle("#fExtContextMenu li.ctxItem { padding-left: 5px;}"); fExt.createStyle("#fExtContextMenu li.ctxItem { border: none; position: initial; box-sizing: border-box; transition: all 250ms ease; }"); fExt.createStyle("#fExtContextMenu li.ctxItem:hover { background: #3a7999; color: #3a7999; box-shadow: inset 0 0 0 3px #3a7999; }"); fExt.createStyle("#fExtContextMenu li.ctxSub.disabled div.ctxSubLabel:hover,"); fExt.createStyle("#fExtContextMenu li.ctxItem.disabled:hover a,#fExtContextMenu li.disabled div.ctxSubLabel,#fExtContextMenu li.disabled a { opacity: 0.70; font-style: italic; padding-left: 7px !important;}"); fExt.createStyle("#fExtContextMenu li.ctxSeparator { display: inline-block;}"); fExt.createStyle("#fExtContextMenu li.ctxSub div.ctxSubLabel { padding-left: 10px !important; float: left; clear: left;}"); fExt.createStyle("#fExtContextMenu li.ctxSub div.ctxArrow { float: right; clear: right;}"); fExt.createStyle("#fExtContextMenu li.ctxSub ul.ctxSubList { position: absolute; height: auto;}"); fExt.createStyle(".fExtCtxHighlighter { position: absolute; background-color: red; display: block;}"); // Default variables fExt.ctxMenu.uniqueID = 1; fExt.ctxMenu.allItems = []; fExt.ctxMenu.actor = undefined; fExt.ctxMenu.actorStyles = ''; fExt.ctxMenu.html = fExt.jq('<ul id="fExtContextMenu" class="ctxElement" style="display: none;"></ul>'); fExt.ctxMenu.html.appendTo("body"); fExt.ctxMenu.Show = function() { fExt.show(fExt.ctxMenu.html, 0); }; fExt.ctxMenu.Hide = function(speed) { fExt.hide(fExt.ctxMenu.html, speed, function(){ if(fExt.ctxMenu.actor) { if (fExt.settings.ctxActorMark) fExt.jq(".fExtCtxHighlighter").remove(); } }); }; // Private Methods ctxCtor = function(ret) { ret.ItemText = function(value) { if(value === undefined) return this.label.text(); this.label.text(value); }; ret.Toggle = function(enabled) { if(enabled === true || (enabled === undefined && this.hasClass("disabled"))) this.removeClass("disabled"); else this.addClass("disabled"); }; ret.IsDisabled = function() { return this.hasClass("disabled"); }; ret.ID = function() { return this.itemId; }; ret.Remove = function() { if(ret.hasClass("ctxSub")) { ret.Clear(); } else if(ret.sub) { ret.sub.Items.splice(ret.sub.Items.indexOf(ret),1); } ret.remove(); }; ret.ClickCloses = true; }; getParentFrom = function(sub) { if(sub !== undefined) return fExt.jq(sub).find("ul:first"); else return fExt.ctxMenu.html; }; setZIndex = function(item, parent) { var parentzIndex = parent.css("z-index"); parentzIndex++; item.css("z-index", parentzIndex); item.children().each(function() { fExt.jq(this).css("z-index", parentzIndex); }); }; // Public Methods fExt.ctxMenu.addItem = function(label, unused, sub) { console.log("The method 'addItem' is obsolete, please use 'addCtxItem(label, sub)'!"); return fExt.ctxMenu.addCtxItem(label, sub); }; fExt.ctxMenu.addCtxItem = function(label, sub) { var ret = fExt.jq('<li class="ctxItem ctxElement"></li>'); var retObj = fExt.jq('<a href="#" class="ctxElement">' + label + '</a>'); retObj.appendTo(ret); ret.label = retObj; if(sub) { sub.Add(ret); ret.sub = sub; } else { ret.appendTo(fExt.ctxMenu.html); setZIndex(ret, fExt.ctxMenu.html); } ctxCtor(ret); ret.Attribute = function(attribute, value) { if(value === undefined) return ret.attr(attribute); else ret.attr(attribute, value); }; ret.Trigger = function(){ fExt.ctxMenu.actor = ret; if(ret.Action) ret.Action(undefined, ret, fExt.ctxMenu.actor); }; ret.Action = undefined; fExt.ctxMenu.assignID(ret); return ret; }; fExt.ctxMenu.addSub = function(label, orientation, sub) { console.log("The method 'addSub' is obsolete, please use 'addCtxSub(label, sub, orientation)'!"); return fExt.ctxMenu.addCtxSub(label, sub, orientation); }; fExt.ctxMenu.addCtxSub = function(label, sub, orientation) { if(orientation !== undefined) console.log("The orientation parameter is obsolete, please use addCtxSub(label, sub)."); var ret = fExt.jq('<li class="ctxElement ctxSub"><div class="ctxElement ctxArrow">></div></li>'); var list = fExt.jq('<ul class="ctxElement ctxSubList" style="display: none"></ul>'); list.appendTo(ret); ret.list = list; var element = fExt.jq('<div class="ctxElement ctxSubLabel">' + label + ' </div>'); element.appendTo(ret); ret.label = element; ctxCtor(ret); ret.Items = []; var parentMenu = getParentFrom(sub); if(sub) sub.Add(ret); else { ret.appendTo(parentMenu); setZIndex(ret, parentMenu); } ret.Add = function(item) { ret.Items.push(item); item.appendTo(ret.list); setZIndex(item, parentMenu); }; ret.Clear = function() { while(ret.Items.length > 0) { ret.Items[0].remove(); ret.Items.splice(0, 1); } }; return ret; }; fExt.ctxMenu.addSeparator = function(sub) { var ret = fExt.jq('<li class="ctxElement ctxSeparator"><hr/></li>'); sub.Add(ret); return ret; }; fExt.ctxMenu.assignID = function(item) { if(item.ID() !== undefined) console.log("Item already has an ID: " + item.ID()); item.itemId = fExt.ctxMenu.uniqueID; item.data("Item-ID", item.itemId); fExt.ctxMenu.uniqueID++; fExt.ctxMenu.allItems.push(item); }; fExt.ctxMenu.getItem = function(id) { if(id !== undefined) { for(i = 0;i < fExt.ctxMenu.allItems.length; i++) { var item = fExt.ctxMenu.allItems[i]; if(id === item.ID()) return item; } } return undefined; }; // Events fExt.ctxMenu.html.on("click", "li", function( event ) { var sender = fExt.ctxMenu.getItem(fExt.jq(this).data("Item-ID")); if(sender === undefined || sender.Action === undefined) return true; event.preventDefault(); if(!sender.IsDisabled()) sender.Action(event, sender, fExt.ctxMenu.actor); if(sender.ClickCloses) fExt.ctxMenu.Hide(0); return false; }); fExt.ctxMenu.html.on("mouseenter", "li.ctxSub", function(event) { var sub = fExt.jq(this); var subOffs = sub.offset(); var ul = sub.children("ul.ctxSubList:first"); if(ul.children("li.ctxItem, li.ctxSub").length === 0) return; fExt.show(ul, 0); var height = ul.height(); var width = ul.width(); var y = subOffs.top; var x = subOffs.left + sub.width(); if ((x + width) >= window.screen.availWidth) x = subOffs.left - ul.width(); if ((y + height + 100 - window.scrollY) >= window.screen.availHeight) y = y - height + fExt.settings.toleranceY; if ((y - window.scrollY) < 0) y = window.scrollY; if ((x - window.scrollX) < 0) x = window.scrollX; if (y < event.clientY && (y + height) <= event.clientY) y += fExt.settings.toleranceY; ul.offset({ top: y, left: x}); }); fExt.ctxMenu.html.on("mouseleave", "li.ctxSub", function(event) { var ul = fExt.jq(this).children("ul.ctxSubList:first"); fExt.hide(ul, fExt.settings.animationSpeed); }); fExt.ctxMenu.html.on("mouseenter", "li.ctxSub", function(event) { var ul = fExt.jq(this).children("ul.ctxSubList:first"); if(fExt.jq(this).find("li.ctxItem").length > 0) fExt.show(ul, 0); }); fExt.customContextMenuHandler = function (event) { fExt.ctxMenu.actor = fExt.jq(event.target); fExt.ctxMenu.html.trigger("fExtContextMenuOpening", [fExt.ctxMenu.actor, event]); if(event.isDefaultPrevented()) return true; event.preventDefault(); if (fExt.settings.ctxActorMark) { fExt.jq(".fExtCtxHighlighter").remove(); var offs = fExt.ctxMenu.actor.offset(); var coords = [{ name: "top", x: offs.left, y: offs.top - fExt.settings.ctxActorMarkThickness, height: fExt.settings.ctxActorMarkThickness, width: fExt.ctxMenu.actor.width(), },{ name: "left", x: offs.left - fExt.settings.ctxActorMarkThickness, y: offs.top, height: fExt.ctxMenu.actor.height(), width: fExt.settings.ctxActorMarkThickness, },{ name: "bottom", x: offs.left, y: offs.top + fExt.ctxMenu.actor.height() + fExt.settings.ctxActorMarkThickness, height: fExt.settings.ctxActorMarkThickness, width: fExt.ctxMenu.actor.width(), },{ name: "right", x: offs.left + fExt.ctxMenu.actor.width() + fExt.settings.ctxActorMarkThickness, y: offs.top, height: fExt.ctxMenu.actor.height(), width: fExt.settings.ctxActorMarkThickness, },]; var zIndex = fExt.ctxMenu.actor.css("z-index"); if(zIndex != "auto") zIndex++; for(var ind in coords){ fExt.jq("<div class='fExtCtxHighlighter' style='position: absolute; z-index: " + zIndex + "; width: " + coords[ind].width + "px; height: " + coords[ind].height + "px; left: " + coords[ind].x + "px; top: " + coords[ind].y + "px;'></div>").appendTo("body"); } } var y = event.clientY - fExt.settings.toleranceY, x = event.clientX - fExt.settings.toleranceX; if ((x + fExt.ctxMenu.html.width()) >= window.screen.availWidth) x = x - fExt.ctxMenu.html.width() + (fExt.settings.toleranceX * 1.5); if ((y + fExt.ctxMenu.html.height() + 100) >= window.screen.availHeight) y = y - fExt.ctxMenu.html.height() + (fExt.settings.toleranceY * 1.5); if (y < 0) y = 0; if (x < 0) x = 0; fExt.ctxMenu.html.css({ top: y, left: x }); fExt.reassignZIndex(); fExt.ctxMenu.Show(); return false; }; if(fExt.settings.hideContextMenuOnLeave) { var ctxLeaveCheck = { distance: 0, x: null, y: null, detectDistance: false }; ctxLeaveCheck.reset = function(){ this.distance = 0; this.x = null; this.y = null; this.detectDistance = false; }; fExt.jq(document).mousemove(function(event) { if(!ctxLeaveCheck.detectDistance) return true; if(!ctxLeaveCheck.x) { ctxLeaveCheck.x = event.clientX; ctxLeaveCheck.y = event.clientY; return; } ctxLeaveCheck.distance += Math.sqrt(Math.pow(ctxLeaveCheck.y - event.clientY, 2) + Math.pow(ctxLeaveCheck.x - event.clientX, 2)); if(ctxLeaveCheck.distance > fExt.settings.hideContextMenuDistance) { ctxLeaveCheck.reset(); fExt.ctxMenu.html.trigger("fExtContextMenuClosing", [fExt.ctxMenu.actor, event]); fExt.ctxMenu.Hide(); } else { ctxLeaveCheck.x = event.clientX; ctxLeaveCheck.y = event.clientY; } }); fExt.ctxMenu.html.mouseleave(function(event) { ctxLeaveCheck.detectDistance = true; }); fExt.ctxMenu.html.mouseenter(function() { ctxLeaveCheck.reset(); fExt.ctxMenu.html.finish(); fExt.ctxMenu.Show(0); }); } else { fExt.jq("body").click(function(event) { if(!fExt.jq(this).hasClass("ctxElement") && fExt.ctxMenu.html.is(":visible")) { fExt.ctxMenu.html.trigger("fExtContextMenuClosing", [fExt.ctxMenu.actor, event]); if(event.isDefaultPrevented()) return true; fExt.ctxMenu.Hide(); } }); } fExt.jq(document).on('contextmenu', function(event) { if(!fExt.jq(event.target).hasClass("ctxElement")) { if(!event.shiftKey) { fExt.customContextMenuHandler(event); } } else fExt.ctxMenu.Hide(); }); } else { fExt.ctxMenu.uniqueID = 1; fExt.ctxMenu.allItems = []; fExt.ctxMenu.actor = undefined; fExt.ctxMenu.Show = function() { console.log("ContextMenu is turned off"); }; fExt.ctxMenu.Hide = function() { console.log("ContextMenu is turned off"); }; fExt.ctxMenu.addItem = function() { console.log("ContextMenu is turned off"); }; fExt.ctxMenu.addCtxItem = function() { console.log("ContextMenu is turned off"); }; fExt.ctxMenu.addSub = function() { console.log("ContextMenu is turned off"); }; fExt.ctxMenu.addCtxSub = function() { console.log("ContextMenu is turned off"); }; fExt.ctxMenu.addSeparator = function() { console.log("ContextMenu is turned off"); }; fExt.ctxMenu.assignID = function() { console.log("ContextMenu is turned off"); }; fExt.ctxMenu.getItem = function() { console.log("ContextMenu is turned off"); }; fExt.customContextMenuHandler = function () { console.log("ContextMenu is turned off"); }; } // Finalize document.fExt = fExt; fExt.fExtPopup.click(function(e){ fExt.popupQueue = []; fExt.hide(fExt.jq(this)); }); fExt.fExtMessage.click(function(e){ fExt.hide(fExt.jq(this)); }); console.log("frisch's UserScript Extender initialized!"); }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址