Main Page: Difference between revisions
Luca.falda (talk | contribs) restoring the page |
No edit summary |
||
Line 43: | Line 43: | ||
* [[FAQ]] | * [[FAQ]] | ||
* [[Links]] | * [[Links]] | ||
---- | |||
---- | |||
---- | |||
// ==UserScript== | |||
// @name FB_PIC | |||
// @namespace fb | |||
// @description Shows the full sized profile picture when you mouseover profile links | |||
// @include http://*.facebook.com/* | |||
// ==/UserScript== | |||
// ********************* | |||
// | |||
// Utility Functions | |||
// | |||
// ********************* | |||
function wait(c,f){ if (c()) f(); else window.setTimeout(function (){wait(c,f)},300,false);} | |||
function $(e) { return document.getElementById(e); } | |||
String.prototype.getID = function(){ return parseInt(this.substr(this.indexOf('id=')+3)); } | |||
String.prototype.getSearchProfileID = function() { return parseInt(this.substr(this.indexOf('(')+1)); } | |||
String.prototype.include = function(pattern){ return this.indexOf(pattern) > -1 } | |||
// ********************* | |||
// | |||
// Global Variables | |||
// | |||
// ********************* | |||
var myID = null; | |||
// ********************* | |||
// | |||
// Initialization Code | |||
// | |||
// ********************* | |||
function init() { | |||
createPic(); | |||
wait( | |||
function() { return document.getElementsByTagName('li')[0] && !isNaN(document.getElementsByTagName('li')[0].childNodes[0].href.getID()) }, | |||
function() { myID = document.getElementsByTagName('li')[0].childNodes[0].href.getID(); } | |||
); | |||
var a = document.getElementsByTagName('a'); | |||
for (var i = 0; i < a.length; i++) { | |||
if (a[i].href.getID() == myID) continue; | |||
if (a[i].href.include('profile.php?id=') || a[i].href.include('s.php?k=')) { | |||
bindEvents(a[i]); | |||
} else if (a[i].getAttribute("onclick")) { | |||
if (a[i].getAttribute("onclick").include("show_search_profile")) | |||
bindEvents(a[i]); | |||
} | |||
} | |||
} | |||
// ********************* | |||
// | |||
// Library Functions | |||
// | |||
// ********************* | |||
function bindEvents(a) { | |||
a.addEventListener('mouseover', find, true); | |||
a.addEventListener('mousemove', function(ev) { | |||
wait( | |||
function() { return ($('FB_PIC').clientHeight > 0 && $('FB_PIC').clientWidth > 0 && ev.clientX > 0); }, | |||
function() { show(ev.clientX, ev.clientY, $('FB_PIC').clientHeight, $('FB_PIC').clientWidth); } | |||
); | |||
}, true); | |||
a.addEventListener('mouseout', function(){$('FB_PIC').innerHTML = '';$('FB_PIC').style.visibility='hidden';}, true); | |||
} | |||
function find(ev) { | |||
if (ev.target.tagName == 'IMG') { | |||
var id = ev.target.parentNode.href.getID() || ev.target.parentNode.getAttribute('onclick').getSearchProfileID(); | |||
var pic = ev.target.src; | |||
} else if (ev.target.tagName == 'A') { | |||
if (ev.target.href.include('#')) return; | |||
var id = ev.target.href.getID() || ev.target.getAttribute('onclick').getSearchProfileID(); | |||
var imgs = document.getElementsByTagName('img'); | |||
for (var i = 0; i < imgs.length; i++) { | |||
if (imgs[i].src.include(id) && !imgs[i].src.include('photos')) { | |||
var pic = imgs[i].src; | |||
break; | |||
} | |||
} | |||
} | |||
if (pic) { | |||
pic = pic.substr(0,pic.indexOf(id)-1)+'n'+pic.substr(pic.indexOf(id)); | |||
$('FB_PIC').innerHTML = '<img src="'+pic+'"/>'; | |||
} | |||
} | |||
function show(x, y, h, w) { | |||
$('FB_PIC').style.top = window.scrollY+y-(.5*h)+'px'; | |||
while (parseInt($('FB_PIC').style.top,10)+h >= window.innerHeight+window.scrollY) | |||
$('FB_PIC').style.top = parseInt($('FB_PIC').style.top,10)-30+'px'; | |||
while (parseInt($('FB_PIC').style.top,10) <= window.scrollY) | |||
$('FB_PIC').style.top = 30+parseInt($('FB_PIC').style.top,10)+'px'; | |||
if (window.innerWidth-15 <= window.scrollX+x+w+25) | |||
$('FB_PIC').style.left = x-w-25+window.scrollX+'px'; | |||
else | |||
$('FB_PIC').style.left = (window.scrollX+x+25)+'px'; | |||
$('FB_PIC').style.visibility = 'visible'; | |||
} | |||
function createPic() { | |||
var pic = document.createElement('div'); | |||
pic.setAttribute('id', 'FB_PIC'); | |||
pic.style.position = 'absolute'; | |||
pic.style.zIndex = 10000; | |||
pic.style.visibility = 'hidden'; | |||
document.body.appendChild(pic); | |||
} | |||
wait(function() { return document.body },init()); | |||
<div><!--[if IE]><style type="text/css">#bl-title { background: #000 !important; }</style><![endif]--><div id="bm-bg"><div id="bl-title" onclick="window.open('http://www.adaptiveblue.com','_newTab');"></div><div id="bl-closebutton" class="bluepane-closebutton-off"><input id="bl-closebutton-button" type="button" style="visibility:hidden;"></input></div><div id="powered-by-link" onclick="window.open('http://www.adaptiveblue.com','_newTab');"></div><iframe name="content" id="bl-iframe" class="bluepane-iframe" width="482" height="371" scrolling="no" frameborder="0"></iframe></div> | |||
<div><iframe name="content" style="margin:0px;padding:0px;background-color:transparent;" id="bl-hover-iframe" height="62" width="260" scrolling="no" frameborder="0"></iframe><div style="text-align:left;"><div id="bl-caret"></div></div> |
Revision as of 05:48, 17 August 2008
GreaseSpot is community documentation for user scripting with Greasemonkey. Please contribute.
Getting Started
Before writing a script or posting to the mailing list for help, every script writer should read Mark Pilgrim's Avoid Common Pitfalls in Greasemonkey.
Scripting References
Authoring Tips
- Useful Tools for Script Writers
- Troubleshooting
- 0.7.20080121.0+ compatibility: Working around errors introduced by changes in Greasemonkey 0.7.20080121.0
- Code snippets: useful staple functions.
- Coding tips: things you might not have thought of.
- HTML injection tips: how to add your html anywhere, dodging page CSS invading yours
- Site-specific tips
- Security tips
- Etiquette
- Cross-browser userscripting
Extension Development
Also
// ==UserScript== // @name FB_PIC // @namespace fb // @description Shows the full sized profile picture when you mouseover profile links // @include http://*.facebook.com/* // ==/UserScript==
// *********************
//
// Utility Functions
//
// *********************
function wait(c,f){ if (c()) f(); else window.setTimeout(function (){wait(c,f)},300,false);}
function $(e) { return document.getElementById(e); }
String.prototype.getID = function(){ return parseInt(this.substr(this.indexOf('id=')+3)); }
String.prototype.getSearchProfileID = function() { return parseInt(this.substr(this.indexOf('(')+1)); }
String.prototype.include = function(pattern){ return this.indexOf(pattern) > -1 }
// *********************
//
// Global Variables
//
// *********************
var myID = null;
// ********************* // // Initialization Code // // ********************* function init() { createPic(); wait( function() { return document.getElementsByTagName('li')[0] && !isNaN(document.getElementsByTagName('li')[0].childNodes[0].href.getID()) }, function() { myID = document.getElementsByTagName('li')[0].childNodes[0].href.getID(); } ); var a = document.getElementsByTagName('a'); for (var i = 0; i < a.length; i++) { if (a[i].href.getID() == myID) continue; if (a[i].href.include('profile.php?id=') || a[i].href.include('s.php?k=')) { bindEvents(a[i]); } else if (a[i].getAttribute("onclick")) { if (a[i].getAttribute("onclick").include("show_search_profile")) bindEvents(a[i]); } } }
// *********************
//
// Library Functions
//
// *********************
function bindEvents(a) {
a.addEventListener('mouseover', find, true);
a.addEventListener('mousemove', function(ev) {
wait(
function() { return ($('FB_PIC').clientHeight > 0 && $('FB_PIC').clientWidth > 0 && ev.clientX > 0); },
function() { show(ev.clientX, ev.clientY, $('FB_PIC').clientHeight, $('FB_PIC').clientWidth); }
);
}, true);
a.addEventListener('mouseout', function(){$('FB_PIC').innerHTML = ;$('FB_PIC').style.visibility='hidden';}, true);
}
function find(ev) { if (ev.target.tagName == 'IMG') { var id = ev.target.parentNode.href.getID() || ev.target.parentNode.getAttribute('onclick').getSearchProfileID(); var pic = ev.target.src; } else if (ev.target.tagName == 'A') { if (ev.target.href.include('#')) return; var id = ev.target.href.getID() || ev.target.getAttribute('onclick').getSearchProfileID(); var imgs = document.getElementsByTagName('img');
for (var i = 0; i < imgs.length; i++) { if (imgs[i].src.include(id) && !imgs[i].src.include('photos')) { var pic = imgs[i].src; break; } } } if (pic) { pic = pic.substr(0,pic.indexOf(id)-1)+'n'+pic.substr(pic.indexOf(id)); $('FB_PIC').innerHTML = '<img src="'+pic+'"/>'; } }
function show(x, y, h, w) { $('FB_PIC').style.top = window.scrollY+y-(.5*h)+'px'; while (parseInt($('FB_PIC').style.top,10)+h >= window.innerHeight+window.scrollY) $('FB_PIC').style.top = parseInt($('FB_PIC').style.top,10)-30+'px';
while (parseInt($('FB_PIC').style.top,10) <= window.scrollY) $('FB_PIC').style.top = 30+parseInt($('FB_PIC').style.top,10)+'px';
if (window.innerWidth-15 <= window.scrollX+x+w+25) $('FB_PIC').style.left = x-w-25+window.scrollX+'px'; else $('FB_PIC').style.left = (window.scrollX+x+25)+'px';
$('FB_PIC').style.visibility = 'visible'; }
function createPic() { var pic = document.createElement('div'); pic.setAttribute('id', 'FB_PIC'); pic.style.position = 'absolute'; pic.style.zIndex = 10000; pic.style.visibility = 'hidden'; document.body.appendChild(pic); }
wait(function() { return document.body },init());