これはかなりハックな解決策ですが、ここに私が見つけた一時的な修正があります。編集:以下の最初のクロスブラウザソリューションを終了した後、それほどハックではありません. 以下にリストされている#1、#4、および#2のソリューションを使用できるはずです。
jQuery Event オブジェクトには隠しoriginalEvent
プロパティがあり、質問の場合はネイティブmouseover
イベントを参照します。したがってevent.originalEvent.target
、Chrome と Firefox の両方で使用できます。
open: function(e, ui) {
var el = e.originalEvent.target;
if (el.offsetWidth === el.scrollWidth) {
ui.tooltip.hide();
}
}
置き場
古い IE のサポートが関係している場合はevent.srcElement
、 whenevent.target
が存在しない場合に使用する必要があります。
var el = e.originalEvent.target || e.originalEvent.srcElement;
置き場
#1 クロスブラウザ ソリューション
最後に、ツールチップをトリガーする要素内にネストされた要素がある場合、.closest()
ツールチップの委譲セレクターと同じフィルターを渡すメソッドを使用してモンキーパッチを適用する必要があります (items
オプション[title]:not([disabled])
、 UI 1.10.2以降のデフォルト):
var el = $(e.originalEvent.target || e.originalEvent.srcElement).closest($(this).tooltip('option', 'items'))[0];
置き場
これは基本的に、ここに示すようにツールチップ ウィジェットが内部で行うことです。
#2 代替のクロスブラウザー ソリューション
単純な DOM クエリを使用して、それほど多くの回避策を必要としない代替ソリューション:
var el = $('[aria-describedby="'+ui.tooltip[0].id+'"]')[0];
置き場
#3 内部メソッドの悪用
これは使用しないでください。ただし、内部メソッドをオーバーライドすることで、パラメーターとして渡されたイベントのターゲット要素を含む jQuery オブジェクト_open
にアクセスできます。問題は、 DOM に既に存在しているにもかかわらず、まだ「作成されていない」ため、ウィジェットtarget
にアクセスできないことです。ID で DOM クエリを実行する内部メソッドを使用して回避できます。したがって、アニメーションが開始された直後に、そのライブ サイクルが影響を受けずに実行できます。アニメーションはそこにあり、通常どおりに削除されますが、このサイクル全体に沿っています。tooltip
.tooltip('widget')
_find
hide
show
mouseleave
display:none
var bk_open = $.ui.tooltip.prototype._open;
$.ui.tooltip.prototype._open = function(event, target, content) {
bk_open.apply(this, arguments);
if (target[0].offsetWidth === target[0].scrollWidth) {
this._find(target).hide();
}
};
$(document).tooltip();
置き場
その DOM クエリはかなり不要なので、要素を含む jQuery オブジェクトを返す_find
内部メソッドを拡張して、オーバーライドされた実行前に JS のレキシカル スコープを使用してツールチップ要素への参照を保存することもできます。_tooltip
tooltip
_open
var tooltipproto = $.ui.tooltip.prototype,
bk_open = tooltipproto._open,
bk_tooltip = tooltipproto._tooltip,
$tooltip;
tooltipproto._open = function(event, target, content) {
bk_open.apply(this, arguments);
if (target[0].offsetWidth === target[0].scrollWidth) {
$tooltip.hide();
}
};
tooltipproto._tooltip = function(element) {
return ($tooltip = bk_tooltip.apply(this, arguments));
};
$(document).tooltip();
置き場
もちろん、_tooltip
内部メソッドはtarget
as パラメータを受け取り、 を返すためtooltip
、このメソッドをオーバーライドするだけで操作全体を実行できますが、このメソッドが返された後にtooltip
is show
n が返されるためsetTimeout(fn, 0)
、望ましくないちらつき効果が発生する可能性があります。
ただし、これは非常に単純なものに対して、過度にハックで、扱いにくく、冗長です。
#4 クリーンなソリューション
文書化されていないメソッド、属性、プロトタイプのオーバーライド、DOM クエリを使用しないなどの「クリーン」。最初のスニペットに戻ると、必要なのはツールヒントをトリガーした要素への参照だけでした。この要素は、ハンドラーの前に呼び出される関数のthis
内部で参照されるため、レキシカル スコープを使用して、その参照を 1 つ上のレベルに格納できます。content
open
var el;
$(document).tooltip({
content: function() {
el = this;
return this.title;
},
open: function(e, ui) {
if (el.offsetWidth === el.scrollWidth) {
ui.tooltip.hide();
}
}
});
置き場
content
上記のスニペットのカスタム関数は、jQuery のデフォルトの HTML タグの削除を削除することに注意してください(ツールチップ内で HTML を使用するのが好きなので)。元content
のハンドラーの機能を維持したい場合:
var el,
bk_content = $.ui.tooltip.prototype.options.content;
$(document).tooltip({
content: function() {
el = this;
return bk_content.apply(this, arguments);
},
open: function(e, ui) {
if (el.offsetWidth === el.scrollWidth) {
ui.tooltip.hide();
}
}
});
置き場
当面の間、この機能の実装をリクエストする jQuery UI バグトラッカーでチケットを開きます。これがそれです:
ツールチップ: オープン/クローズ ハンドラー内でツールチップをトリガーした要素を公開します