MediaWiki:Tooltips.js: различия между версиями

Нет описания правки
Нет описания правки
Строка 1: Строка 1:
$(document).ready(function() {
/**
$("[data-tooltip]").unwrap()
* 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, https://github.com/matthias-schuetz
*
* Copyright (C) Matthias Schuetz
* Free to use under the MIT license
*/


$("[data-tooltip]").mousemove(function (eventObject) {
(function (root, factory) {
$(this).children().find('a').removeAttr('title')
if (typeof define === "function" && define.amd) {
// AMD. Register as an anonymous module.
var pos = $(this).position();
define(factory);
    var width = $(this).outerWidth();
} else if (!root.tooltip) {
   
// Browser globals
    if ($(window).width() < 1023)
root.tooltip = factory(root);
    return;
}
   
}(this, function() {
    $(this).next('.tooltip')
    .css({  
"top" : (pos.top + 20) + "px",
"left" : (pos.left + width + 5) + "px"
})
.show();


    }).mouseout(function () {
var _options = {
tooltipId: "tooltip",
offsetDefault: 15
};


        $(".tooltip").hide()
var _tooltips = [];
.css({
var _tooltipsTemp = null;
"top" : 0,
 
"left" : 0
function _bindTooltips(resetTooltips) {
});
if (resetTooltips) {
});
_tooltipsTemp = _tooltips.concat();
_tooltips = [];
}
 
Array.prototype.forEach.call(document.querySelectorAll("[data-tooltip]"), function(elm, idx) {
var tooltipBlock = elm.nextElementSibling;
var options;
 
if (resetTooltips && _tooltipsTemp.length && _tooltipsTemp[idx]) {
if (tooltipBlock.length === 0) {
return;
}
 
elm.removeEventListener("mousemove", _onElementMouseMove);
elm.removeEventListener("mouseout", _onElementMouseOut);
elm.removeEventListener("mouseover", _onElementMouseOver);
}
 
if (tooltipBlock) {
options = _parseOptions(elm.getAttribute("data-tooltip"));
_tooltips[idx] = {
options: options
};
 
elm.addEventListener("mousemove", _onElementMouseMove);
elm.addEventListener("mouseout", _onElementMouseOut);
elm.addEventListener("mouseover", _onElementMouseOver);
}
});
 
if (resetTooltips) {
_tooltipsTemp = null;
}
}
 
function _getTooltipElm() {
return document.querySelector("." + _options.tooltipId);
}
 
function _onElementMouseMove(evt) {
var tooltipId = this.getAttribute("data-tooltip-id");
var tooltipElm = _getTooltipElm();
var options = tooltipId && _tooltips[tooltipId] && _tooltips[tooltipId].options;
var offset = options && options.offset || _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";
}
}
 
function _onElementMouseOut(evt) {
var tooltipElm = _getTooltipElm();
 
if (tooltipElm) {
tooltipElm.style.display ='none';
}
}
 
function _onElementMouseOver(evt) {
var tooltipElm = _getTooltipElm();
if (tooltipElm) {
tooltipElm.style.display ='block';
}
}
 
function _parseOptions(options) {
var optionsObj;
 
if (options.length) {
try {
optionsObj = JSON.parse(options.replace(/'/ig, "\""));
} catch(err) {
console.log(err);
}
}
 
return optionsObj;
}
 
function _init() {
window.addEventListener("load", _bindTooltips);
}
 
_init();
 
return {
setOptions: function(options) {
for (var option in options) {
if (_options.hasOwnProperty(option)) {
_options[option] = options[option];
}
}
},
refresh: function() {
_bindTooltips(true);
}
};
}));

Версия от 12:59, 21 мая 2023

/**
 * 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, https://github.com/matthias-schuetz
 *
 * Copyright (C) Matthias Schuetz
 * Free to use under the MIT license
 */

(function (root, factory) {
	if (typeof define === "function" && define.amd) {
		// AMD. Register as an anonymous module.
		define(factory);
	} else if (!root.tooltip) {
		// Browser globals
		root.tooltip = factory(root);
	}
}(this, function() {

	var _options = {
		tooltipId: "tooltip",
		offsetDefault: 15
	};

	var _tooltips = [];
	var _tooltipsTemp = null;

	function _bindTooltips(resetTooltips) {
		if (resetTooltips) {
			_tooltipsTemp = _tooltips.concat();
			_tooltips = [];
		}

		Array.prototype.forEach.call(document.querySelectorAll("[data-tooltip]"), function(elm, idx) {
			var tooltipBlock = elm.nextElementSibling;
			var options;

			if (resetTooltips && _tooltipsTemp.length && _tooltipsTemp[idx]) {
				if (tooltipBlock.length === 0) {
					return;
				}

				elm.removeEventListener("mousemove", _onElementMouseMove);
				elm.removeEventListener("mouseout", _onElementMouseOut);
				elm.removeEventListener("mouseover", _onElementMouseOver);
			}

			if (tooltipBlock) {
				options = _parseOptions(elm.getAttribute("data-tooltip"));
				
				_tooltips[idx] = {
					options: options
				};

				elm.addEventListener("mousemove", _onElementMouseMove);
				elm.addEventListener("mouseout", _onElementMouseOut);
				elm.addEventListener("mouseover", _onElementMouseOver);
			}
		});

		if (resetTooltips) {
			_tooltipsTemp = null;
		}
	}

	function _getTooltipElm() {
		return document.querySelector("." + _options.tooltipId);
	}

	function _onElementMouseMove(evt) {
		var tooltipId = this.getAttribute("data-tooltip-id");
		var tooltipElm = _getTooltipElm();
		var options = tooltipId && _tooltips[tooltipId] && _tooltips[tooltipId].options;
		var offset = options && options.offset || _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";
		}
	}

	function _onElementMouseOut(evt) {
		var tooltipElm = _getTooltipElm();

		if (tooltipElm) {
			tooltipElm.style.display ='none';
		}
	}

	function _onElementMouseOver(evt) {
		var tooltipElm = _getTooltipElm();
		
		if (tooltipElm) {
			tooltipElm.style.display ='block';
		}
	}

	function _parseOptions(options) {
		var optionsObj;

		if (options.length) {
			try {
				optionsObj = JSON.parse(options.replace(/'/ig, "\""));
			} catch(err) {
				console.log(err);
			}
		}

		return optionsObj;
	}

	function _init() {
		window.addEventListener("load", _bindTooltips);
	}

	_init();

	return {
		setOptions: function(options) {
			for (var option in options) {
				if (_options.hasOwnProperty(option)) {
					_options[option] = options[option];
				}
			}
		},
		refresh: function() {
			_bindTooltips(true);
		}
	};
}));