MediaWiki:Gadget-tooltip.js
Note: After publishing, you may have to bypass your browser's cache to see the changes.
- Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
- Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
- Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
- Opera: Press Ctrl-F5.
/**
* Tooltip.js
* A basic script that applies a mouseover tooltip functionality to all elements of a page that have a data-tooltip attribute
* Matthias Schuetz, http://matthiasschuetz.com
*
* Copyright (C) Matthias Schuetz
* Free to use under the MIT license
*
* --------
*
* This is a modified version not using text but spans inside so I can display some more complex nodes.
*/
if (!window.tooltipGadget) {
var tooltipEngine = {};
tooltipEngine._options = {
tooltipId: "tooltip",
offsetDefault: 15
};
tooltipEngine._tooltips = [];
tooltipEngine._tooltipsTemp = null;
tooltipEngine._bindTooltips = function(resetTooltips) {
console.log("Booting up tooltips.");
if (resetTooltips) {
tooltipEngine._tooltipsTemp = tooltipEngine._tooltips.concat();
tooltipEngine._tooltips = [];
}
var tooltippedElements = document.querySelectorAll("[data-tooltip]");
console.log("Tooltip element count: ", tooltippedElements.length);
Array.prototype.forEach.call(tooltippedElements, function(elm, idx) {
var tooltipText = null;
var contents = elm.getElementsByClassName("tooltip-content");
if (contents.length > 0) {
tooltipText = contents[0];
elm.removeChild(contents[0]);
console.log("Tooltip set up for", elm);
} else {
console.log("No content found for tooltipped element:", elm);
}
var options;
if (resetTooltips && tooltipEngine._tooltipsTemp.length && tooltipEngine._tooltipsTemp[idx] && tooltipEngine._tooltipsTemp[idx].text) {
if (tooltipText.length === 0) {
tooltipText = _tooltipsTemp[idx].text;
}
elm.removeEventListener("mousemove", tooltipEngine._onElementMouseMove);
elm.removeEventListener("mouseout", tooltipEngine._onElementMouseOut);
elm.removeEventListener("mouseover", tooltipEngine._onElementMouseOver);
}
if (tooltipText) {
elm.setAttribute("data-tooltip-id", idx);
options = tooltipEngine._parseOptions(elm.getAttribute("data-tooltip"));
tooltipEngine._tooltips[idx] = {
text: tooltipText,
options: options
};
elm.addEventListener("mousemove", tooltipEngine._onElementMouseMove);
elm.addEventListener("mouseout", tooltipEngine._onElementMouseOut);
elm.addEventListener("mouseover", tooltipEngine._onElementMouseOver);
}
});
if (resetTooltips) {
tooltipEngine._tooltipsTemp = null;
}
};
tooltipEngine._createTooltip = function(text, tooltipId) {
var tooltipElm = document.createElement("div");
var tooltipText = text;
var options = tooltipId && tooltipEngine._tooltips[tooltipId] && tooltipEngine._tooltips[tooltipId].options;
if (options && options["class"]) {
tooltipElm.setAttribute("class", options["class"]);
}
tooltipElm.setAttribute("id", tooltipEngine._options.tooltipId);
tooltipElm.appendChild(tooltipText);
document.querySelector("body").appendChild(tooltipElm);
};
tooltipEngine._getTooltipElm = function() {
return document.querySelector("#" + tooltipEngine._options.tooltipId);
};
tooltipEngine._onElementMouseMove = function(evt) {
var tooltipId = this.getAttribute("data-tooltip-id");
var tooltipElm = _getTooltipElm();
var options = tooltipId && tooltipEngine._tooltips[tooltipId] && tooltipEngine._tooltips[tooltipId].options;
var offset = options && options.offset || tooltipEngine._options.offsetDefault;
var scrollY = window.scrollY || window.pageYOffset;
var scrollX = window.scrollX || window.pageXOffset;
var tooltipTop = evt.pageY + offset;
var tooltipLeft = evt.pageX + offset;
if (tooltipElm) {
tooltipTop = (tooltipTop - scrollY + tooltipElm.offsetHeight + 20 >= window.innerHeight ? (tooltipTop - tooltipElm.offsetHeight - 20) : tooltipTop);
tooltipLeft = (tooltipLeft - scrollX + tooltipElm.offsetWidth + 20 >= window.innerWidth ? (tooltipLeft - tooltipElm.offsetWidth - 20) : tooltipLeft);
tooltipElm.style.top = tooltipTop + "px";
tooltipElm.style.left = tooltipLeft + "px";
}
};
tooltipEngine._onElementMouseOut = function(evt) {
var tooltipElm = tooltipEngine._getTooltipElm();
if (tooltipElm) {
document.querySelector("body").removeChild(tooltipElm);
}
};
tooltipEngine._onElementMouseOver = function(evt) {
var tooltipId = this.getAttribute("data-tooltip-id");
var tooltipText = tooltipId && tooltipEngine._tooltips[tooltipId] && tooltipEngine._tooltips[tooltipId].text;
if (tooltipText) {
tooltipEngine._createTooltip(tooltipText, tooltipId);
}
};
tooltipEngine._parseOptions = function(options) {
var optionsObj;
if (options.length) {
try {
optionsObj = JSON.parse(options.replace(/'/ig, "\""));
} catch(err) {
console.log(err);
}
}
return optionsObj;
};
tooltipEngine._init = function() {
console.log("Loading tooltips...");
try {
document.addEventListener("DOMContentLoaded", tooltipEngine._bindTooltips);
} catch(err) {
console.log(err);
}
}
window.tooltipGadget = tooltipEngine;
}
window.tooltipGadget._init();