私は同じ問題を抱えていましたが、最終的にこの解決策を思いつきました:
var opendelay = 500;
var closedelay = 500;
var target = $('.selector');
target.tooltip({ /* ... */ });
target.off('mouseover mouseout');
target.on('mouseover', function(event) {
event.stopImmediatePropagation();
clearTimeout(target.data('closeTimeoutId'));
target.data('openTimeoutId', setTimeout(function() { target.tooltip('open'); }, opendelay));
});
target.on('mouseout', function(event) {
event.stopImmediatePropagation();
clearTimeout(target.data('openTimeoutId'));
target.data('closeTimeoutId', setTimeout(function() { target.tooltip('close'); }, closedelay));
});
基本的にそれが行うことは次のとおりです。
- ツールチップのデフォルトの onMouseOver イベントを無効にする
- setTimeout() を使用して遅延されるツールチップの新しい mouseOver イベントを追加します。
- タイムアウトをキャンセルする新しい mouseOut イベントを追加します (これにより、遅延が経過する前にマウスがターゲット領域を離れた場合にツールチップが表示されなくなります)。
- ボーナス:同じ手法を使用して、「opendelay」別名「predelay」に似た「closedelay」も追加します
event.stopImmediatePropagation();
一部の場合にのみ必要です。例えば。ITをホバリングしている間(開いた後)、ツールチップ要素を表示したままにする場合。これが必要な場合は、ツールチップに同じホバー イベントを登録します。target.tooltip({ open: function (event, ui) { ui.tooltip.hover(..., ...); } });
- ps や のように、これらの呼び出しをいくつか連鎖させることもでき
on
ますoff
。
- イベント関数内をまたはに置き換えることは可能かもしれません。しかし、よくわかりませんし、試したこともありません。結局うまくいかないかもしれません。
target
this
$(this)
- closeDelay が必要ない場合は、 or を含む行を削除して、
closeTimeoutId
inclosedelay
を削除mouseout
するtarget.off('mouseover mouseout');
か、0 に設定します。
- openDelay が必要ない場合も同様です...その逆です