Skip to content

Instantly share code, notes, and snippets.

@FND
Created August 27, 2011 11:06
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save FND/1175253 to your computer and use it in GitHub Desktop.
Save FND/1175253 to your computer and use it in GitHub Desktop.
jQuery MinTip: minimal tooltips
/*jslint vars: true, unparam: true, browser: true, white: true */
/*global jQuery */
(function($) {
"use strict";
var onEnter, onLeave, startTimer, stopTimer, remove, getPos;
var defaults = {
delay: 500,
content: null,
allowHTML: false // XXX: rename
};
$.fn.mintip = function(options) {
options = $.extend({}, defaults, options);
var tips = this.map(function(i, node) {
var origin = $(node);
var tip = $('<div class="mintip" />');
var content = options.content || origin.data("tooltip"); // XXX: precedence?
var method = options.allowHTML ? "html" : "text";
tip[method](content);
tip.data("delay", options.delay);
origin.data("mintip", tip);
return tip[0];
});
this.live("mouseenter", onEnter).live("mouseleave", onLeave); // XXX: `live` appropriate?
$(tips).mouseenter(stopTimer).mouseleave(onLeave); // XXX: regular bind inefficient?
};
onEnter = function(ev) {
var origin = $(this);
var tip = origin.data("mintip");
stopTimer(tip);
var pos = $.extend({ position: "absolute" }, getPos(origin));
tip.removeAttr("style").css(pos).appendTo(document.body);
var rightEdge = tip.offset().left + tip.outerWidth(true);
if(rightEdge >= $(document).width()) {
delete pos.left;
pos.right = 0;
tip.removeAttr("style").css(pos);
}
};
// NB: magically handles both origins' and tooltips' event
onLeave = function(ev) {
var node = $(this);
var tip = node.data("mintip") || node;
startTimer(tip);
};
startTimer = function(el) {
var delay = el.data("delay");
var timer = setTimeout(remove(el), delay);
el.data("timer", timer);
};
// NB: can also be used as event handler
stopTimer = function(el) {
el = el.originalEvent ? $(this) : el; // event handler overloading
var timer = el.data("timer");
clearTimeout(timer);
el.removeData("timer");
};
// proxy for deferred removal
remove = function(el) {
return function(timeoutID) { // NB: timeoutID must not be passed on
el.detach(); // needs to retain attached delay data
};
};
// determine tooltip position based on origin
getPos = function(el) {
var pos = el.offset();
pos.top += el.height();
pos.left += el.width() / 2;
return pos;
};
}(jQuery));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment