I've been working on a hover-preview Tampermonkey script. It's always bugged me that r3v doesn't even have title attribute tooltips.

You can has. Just install Tampermonkey and paste it in.
Version 0.2 - 3/2/13 - Features added:

You can has. Just install Tampermonkey and paste it in.
Version 0.2 - 3/2/13 - Features added:
- Smart hover placement
- Image scaling
- Ability to flip through current page of posts (N and P keys)
- "Last post" view (hover over the arrow image)
Code:
// ==UserScript== // @name r3vlimited hover tips // @namespace http://www.r3vlimited.com/ // @version 0.2 // @description does neat things // @match http://www.r3vlimited.com/board/* // @copyright 2013+, Fourbanger // @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js // ==/UserScript== var scaleFactor = .75; var delay = 375; $(document).ready(function(){ var html = '\ <div id="hoverBoundary">\ <div id="hoverContainer">\ </div>\ <div>'; var styles = '<style>\ #hoverBoundary {\ -webkit-touch-callout: none;\ -webkit-user-select: none;\ user-select: none;\ pointer-events: none;\ position: fixed;\ top: 0;\ left: 0;\ height: auto;\ width: 50%;\ border-radius: 25px;\ display: none;\ z-index: 999;\ /*border: 1px solid red;*/\ }\ #hoverContainer{\ width: '+ ((1/scaleFactor)*100) +'%;\ -webkit-transform: scale(' + scaleFactor + ');\ -webkit-transform-origin: 0 0 0;\ }\ #hoverContainer table {\ table-layout: fixed;\ overflow: hidden;\ }\ #hoverContainer table td:first-of-type{\ width: 20%;\ overflow: hidden;\ }\ #hoverContainer .bigusername {\ font-size: 115%;\ }\ #hoverContainer .page > div,\ #hoverContainer .page > div > div {\ padding: 0 !important;\ }\ #hoverContainer .page img {\ max-width: 100%;\ }\ </style>'; $('body').append(html); $('head').append(styles); var hoverBoundary = $('#hoverBoundary'); var hoverContainer = $('#hoverContainer'); $(document).mousemove(function(event){ mouseX = event.pageX; mouseY = event.pageY; if ($(hoverBoundary).is(':visible')) { positionHover(); } }); $(document).on('keyup', function(event){ if ($(hoverBoundary).is(':visible')) { event.preventDefault(); switch (event.which) { case 78: if ($(hoverContainer).find('> div:visible').next().length > 0 && !$(hoverContainer).find('div').is(':animated')) { $(hoverContainer).find('> div:visible').next().slideDown(); $(hoverContainer).find('> div:visible:first').slideUp(); } break; case 80: if ($(hoverContainer).find('> div:visible').prev().length > 0 && !$(hoverContainer).find('div').is(':animated')) { $(hoverContainer).find('> div:visible').prev().slideDown(); $(hoverContainer).find('> div:visible:last').slideUp(); } break; } } }); function positionHover(){ var scrollPos = $('body').scrollTop(); if ((mouseY - scrollPos) + ($(hoverBoundary).height() * scaleFactor) > $(window).height()) { var top = $(window).height() - ($(hoverBoundary).height() * scaleFactor); if (top < 0) var top = 0; } else { var percentY = (mouseY - scrollPos) / $(window).height(); var offsetY = percentY * $(hoverBoundary).height() * scaleFactor; var top = Math.round((mouseY - scrollPos) - offsetY); } var percentX = mouseX / $(window).width(); var offsetX = percentX * $(hoverBoundary).width(); var left = Math.round(mouseX - offsetX); $(hoverBoundary).css({'top':top, 'left':left}); } var hoverDelay = null; var request; $('a[href*="showthread.php"]').not('[href*="page="]').hover(function(){ var context = $(this); hoverDelay = setTimeout(function(){ var href = $(context).attr('href'); var last = false; if (href.indexOf('#post') !== -1 || href.indexOf('goto=newpost') !== -1) var last = true; /*var post = href.match(/\#(.*)/)[1];*/ request = $.ajax({ type: "GET", url: href, dataType: 'html', success: function(data){ $(hoverContainer).empty(); var scripts = '<script>function vbmenu_register(){return null;}</script>' var content = scripts + $(data).filter('#posts').html().replace('<div id="lastpost"></div>', ''); $(hoverContainer).html(content); if (!last) $(hoverContainer).find('> div:not(:first-of-type)').hide(); else $(hoverContainer).find('> div:not(:last-of-type)').hide(); $(hoverBoundary).show().promise().done(function(){ positionHover(); }); $(hoverContainer).find('img').load(function(){positionHover();}); } }); }, delay); }, function(){ if (request) request.abort(); clearTimeout(hoverDelay); $(hoverBoundary).hide(); }); });
Comment