コードを更新しています...ほとんどの問題は解決しています。問題が残っています:
要素 (1 と 2) の間でマウスを速く動かすと、ツールチップが表示されません。
これは、要素のマウスを離すのが遅れているために発生すると思います。
$this.mouseleave(function (e) {
tooltip.timer = setTimeout(function () {
$("." + options.class).detach();
}, !options.mouse || options.static ? options.delay || 0 : 0);
}), // Mouse leave
リンクが含まれている場合に、マウスがツールチップ上を移動できるようにしています。
アイデアは、マウスが別の要素の上に移動したときに非表示の遅延をキャンセルすることです。
プラグインはhttp://jsfiddle.net/mdmoura/RPUX6/でテストできます
そして、コード全体は次のとおりです。
(function ($) {
$.fn.Tooltip = function (options) {
var defaults = {
class: 'Tooltip',
content: '',
delay: 120,
mouse: false,
offset: [0, -20],
static: true,
effect: function ($element, $tooltip) {
$tooltip.fadeIn(200);
}
};
options = $.extend({}, defaults, options);
$(this).each(function (e) {
var $this = $(this);
var tooltip = { timer: null, title: $this.attr('title') };
$this.mouseenter(function (e) {
var $tooltip =
$("<div>")
.attr("class", options.class)
.html(options.content !== '' ? (typeof options.content === 'string' ? options.content : options.content($this, $tooltip)) : tooltip.title)
.appendTo('body');
$this.attr('title', '');
var position = [0, 0];
if (options.mouse) {
position = [e.clientX + options.offset[0] + $(window).scrollLeft(), e.clientY + options.offset[1] + $(window).scrollTop()];
} else {
var coordinates = $this[0].getBoundingClientRect();
position = [
(function () {
if (options.offset[0] < 0)
return coordinates.left - Math.abs(options.offset[0]) - $tooltip.outerWidth() + $(window).scrollLeft();
else if (options.offset[0] === 0)
return coordinates.left - (($tooltip.outerWidth() - $this.outerWidth()) / 2) + $(window).scrollLeft();
else
return coordinates.left + $this.outerWidth() + options.offset[0] + $(window).scrollLeft();
})(),
(function () {
if (options.offset[1] < 0)
return coordinates.top - Math.abs(options.offset[1]) - $tooltip.outerHeight() + $(window).scrollTop();
else if (options.offset[1] === 0)
return coordinates.top - (($tooltip.outerHeight() - $this.outerHeight()) / 2) + $(window).scrollTop();
else
return coordinates.top + $this.outerHeight() + options.offset[1] + $(window).scrollTop();
})()
];
}
$tooltip.css({ left: position[0] + 'px', top: position[1] + 'px' });
options.effect($this, $tooltip.stop(true, true));
$tooltip.mouseenter(function () {
window.clearTimeout(tooltip.timer);
tooltip.timer = null;
}); // Tooltip enter
$tooltip.mouseleave(function () {
tooltip.timer = setTimeout(function () {
$tooltip.remove();
}, !options.mouse || options.static ? options.delay || 0 : 0);
});
}), // Mouse enter
$this.mouseleave(function (e) {
tooltip.timer = setTimeout(function () {
$("." + options.class).remove();
}, !options.mouse || options.static ? options.delay || 0 : 0);
}), // Mouse leave
$this.mousemove(function (e) {
if (options.mouse && !options.static) {
$("." + options.class).css({ left: e.clientX + options.offset[0] + $(window).scrollLeft() + 'px', top: e.clientY + options.offset[1] + $(window).scrollTop() + 'px' });
}
}); // Mouse move
}); // Each
}; // Tooltip
})(jQuery); // JQuery
タイムアウトを使用して、マウスがツールチップ上を移動できるようにしています。
現在の問題を解決する方法を知っている人はいますか?
ありがとう!