NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Next Image/Previous Image // @author arty <me@arty.name> // @namespace http://arty.name/ // @version 2.0.5 // @description Quick scroll to next/previous image on a page with n/p buttons // @include * // ==/UserScript== // This is a minor adaptation of arty's original, by joeytwiddle // 2012/10 - Now sorting positions so out-of-order images do not break the sequence. (function(){ // var forwardButton = 102; // F // var backwardButton = 114; // R var forwardButton = 110; // N var backwardButton = 112; // P var leeway = 2; // This is needed if you have zoomed out the page. (We might try to set scrollTop to 100, but it will only move to 99.) var positions = []; document.addEventListener('keypress', function(event){ if (event.ctrlKey || event.shiftKey || event.altKey) return; var code = event.keyCode || event.which; if (code != backwardButton && code != forwardButton) return; if (event.target.tagName && event.target.tagName.match(/input|select|textarea/i) || event.target.getAttribute('contenteditable')==="true") return; // We force a rescan of the page's images every time, for dynamic pages. positions = []; if (positions.length === 0) { for (var index = 0; index < document.images.length; index++) { var image = document.images[index]; if (image.width * image.height < 200*200) continue; var ytop = getYOffset(image); // Vertically centralise smaller images. if (image.height && image.height < window.innerHeight) { ytop -= (window.innerHeight - image.height)/2 | 0; } positions.push([index, ytop]); } } positions.sort(function(a,b) { return a[1] - b[1]; }); var scroll = Math.max(document.documentElement.scrollTop, document.body.scrollTop); if (code === forwardButton) { for (index = 0; index < positions.length; index++) { if (positions[index][1] <= scroll + leeway) continue; // Hard to detect which one our browser is using when we are at the top of the document. // Because Chrome presents documentElement.scrollTop = 0 all the time! // Likewise Firefox presents document.body.scrollTop = 0 all the time! // Solution? Just set both of them! document.body.scrollTop = positions[index][1]; document.documentElement.scrollTop = positions[index][1]; return; } } else if (code === backwardButton) { for (index = positions.length - 1; index >= 0; index--) { if (positions[index][1] >= scroll - leeway) continue; document.body.scrollTop = positions[index][1]; document.documentElement.scrollTop = positions[index][1]; return; } } }, false); function getYOffset(node) { for (var offset = 0; node; offset += node.offsetTop, node = node.offsetParent); return offset; } })();