Index.phpという名前のファイルがあり、file1.phpという名前の別のファイルが含まれています(index.phpには、jQuery、jsなどに必要なすべてのファイルが含まれています)。 file1.phpには、それぞれがモーダルを開くボタンのあるテーブルがあります。モーダルの情報は、file2.phpのajax呼び出しからのものです。 file2.phpにテーブルを作成します。表にはセルがあります:
<button class='btn btn-default tooltip-default' data-toggle='tooltip' data-trigger='hover' data-placement='top' data-content='content' data-original-title='Twitter Bootstrap Popover'>AAA</button>
そして、まあ、ツールチップは機能しません。しかし、これをコピーしてfile1.phpに取得すると、表の下にあり、ツールチップは機能します。
誰かがツールチップを修正するのを手伝ってもらえますか?どうも。
新しく到着したデータのツールチップを初期化する必要があると思います。
$('[data-toggle="tooltip"]').tooltip();
DOM操作の後、このコードをAJAX成功ハンドラーに配置します。
本体などの既存の要素でセレクターを使用する
$('body').tooltip({selector: '[data-toggle="tooltip"]'});
私はすべてを試しましたが、何もうまくいきませんでした。そこで、クリック*したときにツールチップを詳しく調べたところ、shown.bs.tooltipが起動されるたびに、aria-describebyプロパティが表示され、その値が毎回変化することがわかりました。
したがって、私のアプローチ(およびそれは機能します)は、この動的要素のコンテンツを変更することです。
私はこのコードを手に入れました:
$('body').on('shown.bs.tooltip', function(e) {
var $element = $(e.target);
var url = $element.data('url');
if (undefined === url || url.length === 0) {
return true;
}
var $describedByContent = $('#' + $element.attr('aria-describedby')).find('.tooltip-inner');
if ($element.attr('title').length > 1) {
$describedByContent.html($element.attr('title'));
return true;
}
$.ajax({
url: url,
method: 'GET',
beforeSend: function () {
$element.attr('title', 'Cargando... espere por favor.');
$describedByContent.html($element.attr('title'));
}
}).done(function (data) {
$element.attr('title', JSON.stringify(data));
$describedByContent.html($element.attr('title'));
});
return true;
});
私の場合、ツールチップには、タイトルのデータを取得するためのdata-url属性があります。元のタイトルは「-」であり、要素をクリック*するたびにajaxを呼び出す必要はありません。
私にとって、データがそれほど速く変化するとは思わないので、毎回ajaxを作成することは役に立ちません。
動的に作成された要素には、クラス.tooltip-innerの要素があるため、そのコンテンツを置き換える必要があります。
これがお役に立てば幸いです。
* click:デフォルトのホバーでシステムがおかしくなることがあり、show.bs.tooltipが永久に起動され、デフォルト値と新しい値が切り替わるため、クリックイベントを選択しました。
これは、次の2つの方法のいずれかで実行できます。
ajaxComplete
関数を記述して、ajax呼び出しが完了するたびに、ツールチップを何度も再初期化することができます。これは、ほとんどのページにデータテーブルがあり、ajaxデータテーブルを呼び出すたびにツールチップを初期化する場合に便利です。$(document).ajaxComplete(function() {
$("[data-toggle="tooltip"]").tooltip();
});
function tool_tip() {
$('[data-toggle="tooltip"]').tooltip()
}
tool_tip(); // Call in document ready for elements already present
$.ajax({
success : function(data) {
tool_tip(); // Call function again for AJAX loaded content
}
})
ツールチップの初期化をAjaxコールバック関数に入れる必要があります。
$.ajax({
method: "POST",
url: "some.php"
}).done(function( msg ) {
$('[data-toggle="tooltip"]').tooltip();
});
-または-
すべてのAjaxコールバック関数に初期化コードを配置する代わりに、ajaxCompleteイベントを使用してグローバルに実装できます。
/* initializate the tooltips after ajax requests, if not already done */
$( document ).ajaxComplete(function( event, request, settings ) {
$('[data-toggle="tooltip"]').not( '[data-original-title]' ).tooltip();
});
このコードは、data-toggle = "tooltip"属性が定義されているが、属性 "data-original-title"がない(つまり、ツールチップが初期化されていない)すべてのノードのツールチップを初期化します。
次のように配置してツールチップを設定します。
function setUpToolTipHelpers() {
$(".tip-top").tooltip({
placement: 'top'
});
$(".tip-right").tooltip({
placement: 'right'
});
$(".tip-bottom").tooltip({
placement: 'bottom'
});
$(".tip-left").tooltip({
placement: 'left'
});
}
ドキュメントレディコールでこれを初期化します。
$(document).ready(function () {
setUpToolTipHelpers();
});
このようにして、ツールチップの配置を決定でき、クラスとタイトルを使用してチップを割り当てるだけで済みます。
<td class = "tip-top", title = "Some description">name</td>
次に、成功したajax関数内で「setUpToolTipHelpers()」を呼び出します。または、完全な関数で呼び出すこともできます。これは私にとってはうまくいくようです。
これは完璧に機能しました。
$('body').tooltip({selector: '[data-toggle="tooltip"]'});