Skip to content

Instantly share code, notes, and snippets.

@mbjordan
Forked from FND/jQuery.mintip.js
Created January 12, 2012 03:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mbjordan/1598309 to your computer and use it in GitHub Desktop.
Save mbjordan/1598309 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? - no, deprecated.
$(document).on('mouseenter', this, function () {
onEnter
}).on('mouseleave', this, function () {
onLeave
});
$(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