您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Preview Finya userimages without leaving a trace in the "last visited by" section of that user
// ==UserScript== // @name Finya XL Image Previewer // @include http://*.finya.de/* // @description Preview Finya userimages without leaving a trace in the "last visited by" section of that user // @version 4.00 // @namespace https://greasyfork.org/users/8629 // ==/UserScript== var allIMGs, thisIMG, xTop, leftOffset, topOffset; matchRegEx = /_1[0-2].jpg/i; // Identifies image sources for small images replaceString = '_4.jpg' // Replacement so we can find the large images leftOffset = 20; // X-axis offset to the mouse pointer topOffset = -50; // Y-axis offset to the mouse pointer borderWidth = 1; // Large image border width toWatch = new Array('appstage','content','sidebar','list-online','searchbar-wrapper','voting-history-wrapper','header-content'); // Elements which have dynamic img content toWatchClasses = new Array('userpic','searchbar-thumb'); // Image style classes containing relevant images toWatchParentClasses = new Array('morepics'); // Style classes of parent elements containing relevant images imgCache = new Object(); // Used for pre-loading images // Event functions function animate (e, tagetXL) { xTop = (document.documentElement.scrollTop || document.body.scrollTop); // cross-browser top // horizontal position if ((e.pageX + leftOffset + (2 * borderWidth))>(document.documentElement.clientWidth + document.documentElement.scrollLeft - targetXL.width)) { if ((e.pageX + (2 * borderWidth) + 2)<(document.documentElement.clientWidth + document.documentElement.scrollLeft - targetXL.width)) { targetXL.style.left = document.documentElement.clientWidth + document.documentElement.scrollLeft - targetXL.width - (2 * borderWidth) + 'px'; } else { targetXL.style.left = e.pageX - targetXL.width - leftOffset + 'px'; } } else { targetXL.style.left = e.pageX + leftOffset + 'px'; } // vertical position if ((e.pageY - topOffset + (2 * borderWidth))>(document.documentElement.clientHeight + xTop)) { targetXL.style.top = document.documentElement.clientHeight + xTop - targetXL.height - (2 * borderWidth) + 'px'; } else if ((e.pageY - targetXL.height - topOffset)<xTop) { targetXL.style.top = xTop + 'px'; } else { targetXL.style.top = e.pageY - targetXL.height - topOffset + 'px'; } } function mouseOver(e) { targetXL = document.getElementById('ImgElem'); if (targetXL.src != this.getAttribute('targetSrc')) { targetXL.src = this.getAttribute('targetSrc'); } animate (e, targetXL); targetXL.style.display='block'; } function mouseMove(e) { targetXL = document.getElementById('ImgElem'); if (targetXL.src != this.getAttribute('targetSrc')) { targetXL.src = this.getAttribute('targetSrc'); } animate (e, targetXL); } function mouseOut() { document.getElementById('ImgElem').style.display='none'; document.getElementById('ImgElem').src=''; } // Add big-sized preview images for all small preview images function addPrvImg() { var smallIMGs = new Array(); var usedIMGs = new Array(); // identify all relevant small images // a) search for images via their classes for (var i = 0; i < toWatchClasses.length; i++) { var possibleImages = document.getElementsByClassName(toWatchClasses[i]); for (var j = 0; j < possibleImages.length; j++) { if (possibleImages[j].nodeName == 'IMG' && possibleImages[j].src.search(matchRegEx)>0) { smallIMGs.push(possibleImages[j]); } } } // b) search for images via their parents' classes for (var i = 0; i < toWatchClasses.length; i++) { possibleParents = document.getElementsByClassName(toWatchParentClasses[i]); for (var j = 0; j < possibleParents.length; j++) { var possibleImages = possibleParents[j].getElementsByTagName('IMG'); for (var k = 0; k < possibleImages.length; k++) { if (possibleImages[k].src.search(matchRegEx)>0) { smallIMGs.push(possibleImages[k]); } } } } // loop small images for (var i = 0; i < smallIMGs.length; i++) { var thisIMG = smallIMGs[i]; // get target source from image source file name var targetSrc = thisIMG.src.replace(matchRegEx,replaceString); // Collect target sources for images which are still active in the document usedIMGs.push(targetSrc); if (thisIMG.getAttribute("targetSrc")!=targetSrc) { // set "targetSrc" attribute to the target's source. it will be used by the event functions to locate the big preview image thisIMG.setAttribute("targetSrc", targetSrc); // only cache preview image if it does not already exist (somewhere else in the document) if (!(imgCache.hasOwnProperty(targetSrc))) { imgCache[targetSrc] = new Image(); imgCache[targetSrc].src = targetSrc; } // activate event listeners for small preview image thisIMG.title = thisIMG.alt; thisIMG.addEventListener('mouseover', mouseOver, false); thisIMG.addEventListener('mousemove', mouseMove, false); thisIMG.addEventListener('mouseout', mouseOut, false); // (Re-)activate pointer events in case there were disabled (as is the case for the favorites submenu) if (thisIMG.style.pointerEvents = "none") { thisIMG.style.pointerEvents = "auto"; } } } // remove unused images from imgCache for (image in imgCache) { if (usedIMGs.indexOf(image)<0) { delete imgCache[image]; } } } // initial execution addPrvImg(); // Create blank image element. It will be filled with actual XL images and unhidden during execution var imgXL = document.createElement('img'); imgXL.setAttribute('style', 'z-index:10000; overflow:hidden; position:absolute; display:none; border-width:' + borderWidth + 'px; box-shadow: 0px 0px 16px #036; border-style:solid; border-color:#FFF;'); imgXL.setAttribute('id', 'ImgElem'); document.body.insertBefore(imgXL, document.body.firstChild); // add event listeners to dynamic elements for (var i = 0; i < toWatch.length; i++) { if (thisElem = document.getElementById(toWatch[i])) { thisElem.addEventListener('DOMSubtreeModified', addPrvImg, false); } }