AJAXを使用してBootstrapポップオーバーコンテンツをロードします。これは可能ですか?


90

私が試したことの適切なビットはここにあります:

<a href="#" data-content="<div id='my_popover'></div>"> Click here </a>

$(".button").popover({html: true})

$(".button").click(function(){
    $(this).popover('show');
    $("#my_popover").load('my_stuff')
})

クリックすると、リクエストが行われるのがわかりますが、ポップオーバーにデータが入力されません。ポップオーバーのHTMLがDOMに追加されることすらありませんが、それはファイアバグである可能性があります。

誰かがこれを試しましたか?


1
私はブートストラップを使ったことがありませんが、コンテンツを追加しようとしているときに要素が存在しない可能性があると思いますが、それは推測です。javascriptエラーが発生していますか?
セス

複数のポップオーバーがあり、ポップオーバーごとに異なるコンテンツをロードしたい場合、この答えは非常にきちんとしていて、ポップオーバーのすぐに使えるセットアップの多くを保持することができます-あなたがする必要があるのは、ポップオーバーのIDを保存することだけですリンクの属性について、'shown.bs.popover'ハンドラーでそれらを読み取ります:stackoverflow.com/a/39028723/1371408
MattyJ19年

回答:


105

実用的なソリューションについては、私のブログ投稿を参照してください:https//medium.com/cagataygurturk/load-a-bootstrap-popover-content-with-ajax-8a95cd34f6a4

まず、ポップオーバーを追加する要素にdata-poload属性を追加する必要があります。この属性の内容は、ロードされるURL(絶対または相対)である必要があります。

<a href="#" title="blabla" data-poload="/test.php">blabla</a>

そしてJavaScriptでは、できれば$(document).ready();

$('*[data-poload]').hover(function() {
    var e=$(this);
    e.off('hover');
    $.get(e.data('poload'),function(d) {
        e.popover({content: d}).popover('show');
    });
});

off('hover')データの複数回のロードを防ぎpopover()、新しいホバーイベントをバインドします。ホバーイベントごとにデータを更新する場合は、オフを削除する必要があります。

例の動作中のJSFiddleを参照してください。


4
ajaxの呼び出しが完了する前に2回マウスオーバーすると、奇妙なことが起こりました...私のポッパーは「くっついた」状態で開きました。「el.unbind( 'hover')」を$ .get()の直前に移動することで解決しました。
Luke The Obscure 2012

1
これは機能しますが、アンバインドが取得前であっても、ポップオーバーも私に固執します
Androme 2013年

2
外部URLを読み込もうとすると、クロスドメインアクセス制限が発生します。これを回避するには、ポップオーバーのhtmlプロパティをtrueに設定してcontentから、プロパティをのようなiframeHTMLタグに設定しますcontent: '<iframe src="http://www.google.com"></iframe>'。またmax-width、CSSを使用してポップオーバーのプロパティをオーバーライドする必要があり、CSSを使用してiframeのスタイルも削除する可能性があります。
Gavin

1
あなたが使用することができます@FrzKhane.off('hover')方法
codenamev

3
stackoverflow.com/questions/4111194/….hover(function (){})への変更が機能するため、これは機能しません。
arisalexis 2014

132

私にとっては問題ありません:

$('a.popup-ajax').popover({
    "html": true,
    "content": function(){
        var div_id =  "tmp-id-" + $.now();
        return details_in_popup($(this).attr('href'), div_id);
    }
});

function details_in_popup(link, div_id){
    $.ajax({
        url: link,
        success: function(response){
            $('#'+div_id).html(response);
        }
    });
    return '<div id="'+ div_id +'">Loading...</div>';
}

1
天才の答え!そしてそれがそれをより読みやすくするために編集した理由です
itsazzad 2014

2
素晴らしいソリューション。ただし、現在のバージョンのブートストラップでは、derがこのメソッドgithub.com/twbs/bootstrap/issues/12563に問題があるようです。2回の問題があり、迅速な解決策は、各ポップオーバーでタイトルを確保することでした。これは、使用している読み込み中のテキストが実際に表示されないことも意味します。
ラスムスクリステンセン2014

hrefの代わりにdata-linkを使用する必要があったことを除いて、動作します。hrefを使用すると、ブラウザは新しいウィンドウでhrefのurlを開くだけでした。
TinusSky 2014年

20
これはアライメントの問題を引き起こしませんか?3.3.1でこのアプローチを使用する場合(およびChromeを使用する場合)、「読み込み中...」が表示されたときにポップオーバーは自動的に位置合わせされますが、ポップオーバーの実際のコンテンツが読み込まれるとすぐに、位置合わせはそれに応じて調整されません。 。
マット

5
素晴らしい解決策。このソリューションの欠点の1つは、ajax呼び出しが2回行われることです。ポップオーバーコンポーネントは、最初にhasContentを使用してコンテンツをチェックし、次にsetContentを使用してコンテンツを取得するツールチップです。
リアム

24

これらすべてのソリューションを読んだので、同期ajax呼び出しを使用すると、ソリューションがはるかに簡単になると思います。次に、次のようなものを使用できます。

  $('#signin').popover({
    html: true,
    trigger: 'manual',
    content: function() {
      return $.ajax({url: '/path/to/content',
                     dataType: 'html',
                     async: false}).responseText;
    }
  }).click(function(e) {
    $(this).popover('toggle');
  });

1
これは、ajaxがコンテンツを返す前に特定の位置でポップオーバーのレンダリングに問題があったため(画面からロードされてしまうため)、非常に役立ちました。ありがとうございます!
デレク

単純かもしれませんが、@ IvanKlassによって投稿されたソリューションよりもエレガントではありません。
イアンケンプ2015

6
async: false私のためにこれを殺します
mxmissile 2016年

確かに簡単ですが、JavaScriptと同期コードは実際にはうまく連携しません。JavaScriptはシングルスレッドであるため、リクエストがかかる限り、コードの実行がブロックされます。
IluTov

1
同期AJAXは非推奨です。
バーマー

10

最も人気のある回答を更新しました。しかし、私の変更が承認されない場合に備えて、ここに別の回答を入れます。

違いは次のとおりです。

  • コンテンツの読み込み中に表示されるLOADINGテキスト。遅い接続に非常に適しています。
  • マウスが最初にポップオーバーを離れるときに発生するちらつきを削除しました。

まず、ポップオーバーを追加する要素にdata-poload属性を追加する必要があります。この属性の内容は、ロードされるURL(絶対または相対)である必要があります。

<a href="#" data-poload="/test.php">HOVER ME</a>

そしてJavaScriptでは、できれば$(document).ready();

 // On first hover event we will make popover and then AJAX content into it.
$('[data-poload]').hover(
    function (event) {
        var el = $(this);

        // disable this event after first binding 
        el.off(event);

        // add initial popovers with LOADING text
        el.popover({
            content: "loading…", // maybe some loading animation like <img src='loading.gif />
            html: true,
            placement: "auto",
            container: 'body',
            trigger: 'hover'
        });

        // show this LOADING popover
        el.popover('show');

        // requesting data from unsing url from data-poload attribute
        $.get(el.data('poload'), function (d) {
            // set new content to popover
            el.data('bs.popover').options.content = d;

            // reshow popover with new content
            el.popover('show');
        });
    },
    // Without this handler popover flashes on first mouseout
    function() { }
);

off('hover')データの複数回のロードを防ぎpopover()、新しいホバーイベントをバインドします。ホバーイベントごとにデータを更新する場合は、オフを削除する必要があります。

例の動作中のJSFiddleを参照してください。


7

ÇağatayGürtürkのコードのバリエーションで、代わりにデリゲート関数を使用して、ホバーアウト時にポップオーバーを強制的に非表示にすることができます。

$('body').delegate('.withajaxpopover','hover',function(event){
    if (event.type === 'mouseenter') {
        var el=$(this);
        $.get(el.attr('data-load'),function(d){
            el.unbind('hover').popover({content: d}).popover('show');
        });
    }  else {
        $(this).popover('hide');
    }
});

最近のjqueryの場合:$( '* [data-poload]')。on( 'mouseenter mouseleave'、function(event){
jpprade 2015

7

チャガタイ・ウルチュルクの解決策は素晴らしいですが、私はルーク・ザ・オブスキュアによって説明されたのと同じ奇妙さを経験しました:

ajaxの読み込みが長すぎる場合(またはマウスイベントが速すぎる場合)、特定の要素に.popover( 'show')があり、.popover( 'hide')がないため、ポップオーバーは開いたままになります。

私はこの大規模なプリロードソリューションを好みました。すべてのポップオーバーコンテンツがロードされ、イベントは通常の(静的)ポップオーバーのようにブートストラップによって処理されます。

$('.popover-ajax').each(function(index){

    var el=$(this);

    $.get(el.attr('data-load'),function(d){
        el.popover({content: d});       
    });     

});

7

2015年には、これがベストアンサーです

$('.popup-ajax').mouseenter(function() {
   var i = this
   $.ajax({
      url: $(this).attr('data-link'), 
      dataType: "html", 
      cache:true, 
      success: function( data{
         $(i).popover({
            html:true,
            placement:'left',
            title:$(i).html(),
            content:data
         }).popover('show')
      }
   })
});

$('.popup-ajax').mouseout(function() {
  $('.popover:visible').popover('destroy')
});

6

別の解決策:

$target.find('.myPopOver').mouseenter(function()
{
    if($(this).data('popover') == null)
    {
        $(this).popover({
            animation: false,
            placement: 'right',
            trigger: 'manual',
            title: 'My Dynamic PopOver',
            html : true,
            template: $('#popoverTemplate').clone().attr('id','').html()
        });
    }
    $(this).popover('show');
    $.ajax({
        type: HTTP_GET,
        url: "/myURL"

        success: function(data)
        {
            //Clean the popover previous content
            $('.popover.in .popover-inner').empty();    

            //Fill in content with new AJAX data
            $('.popover.in .popover-inner').html(data);

        }
    });

});

$target.find('.myPopOver').mouseleave(function()
{
    $(this).popover('hide');
});

ここでの考え方は、mouseenterイベントとmouseleaveイベントを使用してPopOverの表示を手動でトリガーすることです。

のMouseEnter(、何もポップオーバーがない場合は、あなたの商品のために作成($(この).dataセクション( 'ポップオーバー')== nullの)場合は、それを作成し、)。興味深いのは、独自のPopOverコンテンツを引数(テンプレート)としてpopover()関数に渡すことで定義できることです。htmlパラメータをtrueに設定することを忘れないでくださいも。

ここでは、popovertemplateという非表示のテンプレートを作成し、JQueryで複製します。クローンを作成したら、id属性を削除することを忘れないでください。そうしないと、DOM内でIDが重複してしまいます。また、ページ内のテンプレートを非表示にするには、style = "display:none"であることに注意してください。

<div id="popoverTemplateContainer" style="display: none">

    <div id="popoverTemplate">
        <div class="popover" >
            <div class="arrow"></div>
            <div class="popover-inner">
                //Custom data here
            </div>
        </div>
    </div>
</div>

作成ステップの後(またはすでに作成されている場合)、popOverを$(this).popover( 'show');で表示するだけです。

次に、古典的なAjax呼び出し。成功したら、サーバーから新しい新しいデータを配置する前に、古いポップオーバーコンテンツクリーンアップする必要があります。現在のポップオーバーコンテンツを取得するにはどうすればよいですか?.popover.inセレクタ!.INクラスは、ここでのトリックだと、ポップオーバーが現在表示されていることを示し!

終了するには、mouseleaveイベントで、ポップオーバーを非表示にします。


私にとっても同じこと、最もシンプルで最高のもの;-)
Thomas Decaux 2012年

これに関する問題は、サーバーにデータを要求しているすべてのホバーにあります。データを1回だけロードする必要があります。
リチャードトルカト2013年

2
@Richard Torcato一方で、あなたは正しいです。ただし、結果をキャッシュに入れるのは非常に簡単です。一方、ホバーするたびに新しいデータをロードするためにサーバーにアクセスしたい場合もあります。したがって、キャッシングを実装するのはあなた次第です
doanduyhai 2013年

これは今では古いと思いますが、誰かがこれを見ている場合、複数のポップオーバーがあり、それぞれをスクロールした場合のように、これがうまく機能することは想像できません。Aにカーソルを合わせる、Aにカーソルを合わせる、Bにカーソルを合わせてカーソルを合わせる、Bにリクエストを送信、Bからの応答が到着、Bのポップオーバーを更新、Aの応答が到着、Bのポップオーバーを更新(成功関数がそのクラスで何かをクリアするだけです。上記を補足するためにこれを見ると、stackoverflow.com
a / 34030999/2524589

3

これは、ajaxがロードされたコンテンツでも正常に機能する私のソリューションです。

/*
 * popover handler assigned document (or 'body') 
 * triggered on hover, show content from data-content or 
 * ajax loaded from url by using data-remotecontent attribute
 */
$(document).popover({
    selector: 'a.preview',
    placement: get_popover_placement,
    content: get_popover_content,
    html: true,
    trigger: 'hover'
});

function get_popover_content() {
    if ($(this).attr('data-remotecontent')) {
        // using remote content, url in $(this).attr('data-remotecontent')
        $(this).addClass("loading");
        var content = $.ajax({
            url: $(this).attr('data-remotecontent'),
            type: "GET",
            data: $(this).serialize(),
            dataType: "html",
            async: false,
            success: function() {
                // just get the response
            },
            error: function() {
                // nothing
            }
        }).responseText;
        var container = $(this).attr('data-rel');
        $(this).removeClass("loading");
        if (typeof container !== 'undefined') {
            // show a specific element such as "#mydetails"
            return $(content).find(container);
        }
        // show the whole page
        return content;
    }
    // show standard popover content
    return $(this).attr('data-content');
}

function get_popover_placement(pop, el) {
    if ($(el).attr('data-placement')) {
        return $(el).attr('data-placement');
    }
    // find out the best placement
    // ... cut ...
    return 'left';
}

3

ポップオーバーのコンテンツが変更される可能性が低い場合は、1回だけ取得するのが理にかなっています。また、ここでの解決策のいくつかには、複数の「プレビュー」をすばやく移動すると、複数の開いているポップアップが表示されるという問題があります。このソリューションは、これらの両方に対処します。

$('body').on('mouseover', '.preview', function() 
{
    var e = $(this);
    if (e.data('title') == undefined)
    {
        // set the title, so we don't get here again.
        e.data('title', e.text());

        // set a loader image, so the user knows we're doing something
        e.data('content', '<img src="/images/ajax-loader.gif" />');
        e.popover({ html : true, trigger : 'hover'}).popover('show');

        // retrieve the real content for this popover, from location set in data-href
        $.get(e.data('href'), function(response)
        {
            // set the ajax-content as content for the popover
            e.data('content', response.html);

            // replace the popover
            e.popover('destroy').popover({ html : true, trigger : 'hover'});

            // check that we're still hovering over the preview, and if so show the popover
            if (e.is(':hover'))
            {
                e.popover('show');
            }
        });
    }
});

3

私のソリューションはデフォルトの機能でよりシンプルだと思います。

http://jsfiddle.net/salt/wbpb0zoy/1/

$("a.popover-ajax").each(function(){
		 $(this).popover({
			trigger:"focus",
			placement: function (context, source) {
                  var obj = $(source);
				  $.get(obj.data("url"),function(d) {
                        $(context).html( d.titles[0].title)
                  });	
			},
			html:true,
			content:"loading"
		 });
});
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/js/bootstrap.min.js"></script>


<ul class="list-group">
  <li class="list-group-item"><a href="#" data-url="https://tr.instela.com/api/v2/list?op=today" class="popover-ajax">Cras justo odio</a></li>
  <li class="list-group-item"><a href="#" data-url="https://tr.instela.com/api/v2/list?op=today" class="popover-ajax">Dapibus ac facilisis in</a></li>
  <li class="list-group-item"><a href="#" data-url="https://tr.instela.com/api/v2/list?op=today" class="popover-ajax">Morbi leo risus</a></li>
  <li class="list-group-item"><a href="#" data-url="https://tr.instela.com/api/v2/list?op=today" class="popover-ajax">Porta ac consectetur ac</a></li>
  <li class="list-group-item"><a href="#" data-url="https://tr.instela.com/api/v2/list?op=today" class="popover-ajax">Vestibulum at eros</a></li>
</ul>


2

ここにはあまりにも多くの答えがありますが、私はそれらのどれも私が望んでいたものではないこともわかりました。Ivan Klassの回答を拡張して、Bootstrap 4が適切であり、インテリジェントにキャッシュされるようにしました。

StackoverflowのCORSポリシーにより、スニペットは実際にはリモートアドレスをロードしないことに注意してください。

var popoverRemoteContents = function(element) {
  if ($(element).data('loaded') !== true) {
    var div_id = 'tmp-id-' + $.now();
    $.ajax({
      url: $(element).data('popover-remote'),
      success: function(response) {
        $('#' + div_id).html(response);
        $(element).attr("data-loaded", true);
        $(element).attr("data-content", response);
        return $(element).popover('update');
      }
    });
    return '<div id="' + div_id + '">Loading...</div>';
  } else {
    return $(element).data('content');
  }
};

$('[data-popover-remote]').popover({
  html: true,
  trigger: 'hover',
  content: function() {
    return popoverRemoteContents(this);
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/>

<span data-popover-remote="http://example.com/">Remote Popover test with caching</span>


これを必要なソリューションに簡単に適応させることができました。ありがとうございました!
ニーミネン

1
素晴らしい解決策です。CSSを処理するためにポップオーバー設定に「sanitize:false」を追加する必要がありました。
ギヨーム


1

チャガタイ・ウルチュルクによる解決策を試しましたが、ルーク・ザ・オブスキュアと同じ奇妙さを感じました。その後、楠間麻による解決策を試しました。これは機能しますが、Ajaxはすべてを読み取ります、ポップオーバーが表示されるます。unbind( 'hover')の呼び出しは効果がありません。これは、デリゲートが特定のクラスのイベントを監視しているためですが、そのクラスは変更されていません。

これが私の解決策であり、楠間朝の解決策に密接に基づいています。変更点:

  • 新しいJQueryライブラリに一致delegateするonように置き換えられました。
  • ホバーイベントのバインドを解除するのではなく、「withajaxpopover」クラスを削除します(バインドされたことはありません)
  • 「trigger:hover」をポップオーバーに追加して、Bootstrapが2回目の使用から完全に処理できるようにします。
  • 私のデータ読み込み関数はJSonを返します。これにより、ポップオーバーのタイトルとコンテンツの両方を簡単に指定できます。
    / *目標:コンテンツがからフェッチされるツールチップ/ポップオーバーを表示します
              初めてのアプリケーションのみ。

        方法:適切なコンテンツを取得し、ツールチップ/ポップオーバーを初めて登録します 
              マウスは、クラス「withajaxpopover」のDOM要素に入ります。を削除します
              要素からのクラスなので、次にマウスが入ったときにそれを行いません。
              ただし、ツールチップ/ポップオーバーは初めて表示されません
              (ツールチップの登録時にマウスがすでに入力されているため)。
              したがって、自分で表示/非表示にする必要があります。
    * /
    $(function(){
      $( 'body')。on( 'hover'、 '。withajaxpopover'、function(event){
          if(event.type === 'mouseenter'){
              var el = $(this);
              $ .get(el.attr( 'data-load')、function(d){
                  el.removeClass( 'withajaxpopover')
                  el.popover({トリガー: 'ホバー'、 
                              タイトル:d.title、 
                              content:d.content})。popover( 'show');
              });
          } そうしないと {
              $(this).popover( 'hide');
          }
      });
    });

1

私はここでいくつかの提案を試しました、そして私は私のものを提示したいと思います(それは少し異なります)-それが誰かを助けることを願っています。最初のクリックでポップアップを表示し、2回目のクリックで非表示にしたかったのです(もちろん、毎回データを更新します)。visableポップオーバーが表示されるかどうかを知るために、追加の変数を使用しました。これが私のコードです:HTML:

<button type="button" id="votingTableButton" class="btn btn-info btn-xs" data-container="body" data-toggle="popover" data-placement="left" >Last Votes</button>

Javascript:

$('#votingTableButton').data("visible",false);

$('#votingTableButton').click(function() {  
if ($('#votingTableButton').data("visible")) {
    $('#votingTableButton').popover("hide");
    $('#votingTableButton').data("visible",false);          
}
else {
    $.get('votingTable.json', function(data) {
        var content = generateTableContent(data);
        $('#votingTableButton').popover('destroy');
        $('#votingTableButton').popover({title: 'Last Votes', 
                                content: content, 
                                trigger: 'manual',
                                html:true});
        $('#votingTableButton').popover("show");
        $('#votingTableButton').data("visible",true);   
    });
}   
});

乾杯!


1
<button type="button" id="popover2" title="" data-content="<div id='my_popover' style='height:250px;width:300px;overflow:auto;'>Loading...Please Wait</div>" data-html="true" data-toggle="popover2" class="btn btn-primary" data-original-title="A Title">Tags</button>

$('#popover2').popover({ 
    html : true,
    title: null,
    trigger: "click",
    placement:"right"
});

$("#popover2").on('shown.bs.popover', function(){
    $('#my_popover').html("dynamic content loaded");

});

1

いくつかの問題に対処する方法は次のとおりです。

  1. 特にプレースメントが「トップ」の場合、コンテンツが更新された後の配置の問題。重要なのは._popper.update()、ポップオーバーの位置を再計算する呼び出しです。
  2. コンテンツが更新された後の幅の変更。それは何も壊さない、それはただユーザーに不快に見える。それを減らすために、ポップオーバーの幅を100%に設定しました(これは、によって制限されますmax-width)。
var e = $("#whatever");
e.popover({
    placement: "top",
    trigger: "hover",
    title: "Test Popover",
    content: "<span class='content'>Loading...</span>",
    html: true
}).on("inserted.bs.popover", function() {
    var popover = e.data('bs.popover');
    var tip = $(popover.tip);
    tip.css("width", "100%");
    $.ajax("/whatever")
        .done(function(data) {
            tip.find(".content").text(data);
            popover._popper.update();
        }).fail(function() {
            tip.find(".content").text("Sorry, something went wrong");
        });
});

私はコンセプトが好きですが、残念ながらそれらは私のために機能していません...(つまり、位置の更新と100%の幅)これらがBootstrap 4で変更されたかどうかわかりませんか?
カリフォルニア州のベン

100%の幅は、おそらく要素のレイアウト方法によって異なります...多分。コンテンツが読み込まれた後もボックスはまだ広がっていますか?
GabrielLuci19年

位置について、あなたはにブレークポイントを設定することができますpopover._popper.update()し、ことを確認してくださいpopover_popperそしてupdate、すべての期待値を持っています。それらが変わった可能性は確かにあります。
GabrielLuci19年

右-新しいコンテンツの後にボックスが広がります。そして、コンソールにいくつかの値を書き込んでみましたが、未定義になりました。
カリフォルニア州のベン

1
- あなたが正しい。もっと複雑なことを同時にやろうとしていたのですが、うまくいきませんでした。しかし、今ではそれも取り入れることができました。ここではフィドルです:jsfiddle.net/udfz5wrv/1は 、(バインドハンドラに必要がある場合など、)あなたは、セレクタを使用することができますセレクタからのアクセスデータ、ブートストラップローディングスピナーを表示する、など
カリフォルニア州ベン

0
$("a[rel=popover]").each(function(){
        var thisPopover=$(this);
                var thisPopoverContent ='';
                if('you want a data inside an html div tag') {
                thisPopoverContent = $(thisPopover.attr('data-content-id')).html();
                }elseif('you want ajax content') {
                    $.get(thisPopover.attr('href'),function(e){
                        thisPopoverContent = e;
                    });
            }
        $(this).attr(   'data-original-title',$(this).attr('title') );
        thisPopover.popover({
            content: thisPopoverContent
        })
        .click(function(e) {
            e.preventDefault()
        });

    });

同じhrefタグを使用して、クリックしてもページが変更されないようにしたことに注意してください。これはSEOにとっても、ユーザーがjavascriptを持っていない場合にも役立ちます。


0

私はチャガタイのソリューションが好きですが、ポップアップがマウスアウトに隠れていませんでした。私はこれでこの余分な機能を追加しました:

// hides the popup
$('*[data-poload]').bind('mouseout',function(){
   var e=$(this);
   e.popover('hide'); 
});

0

元のソリューションを使用しましたが、いくつか変更を加えました。

まず、jsonスクリプトを読み込んでいたため、getJSON()代わりに使用しましたget()。次に、ホバーのトリガー動作を追加して、スティッキーポップオーバーの問題を修正しました。

$('*[data-poload]').on('mouseover',function() {
    var e=$(this);
    $.getJSON(e.data('poload'), function(data){
        var tip;
        $.each(data, function (index, value) {
           tip = this.tip;
           e.popover({content: tip, html: true, container: 'body', trigger: 'hover'}).popover('show');
        });
    });
});

0

html:trueを追加したので、結果をフォーマットしたい場合に備えて、生のhtml出力は表示されません。さらにコントロールを追加することもできます。

    $('*[data-poload]').bind('click',function() {
        var e=$(this);
        e.unbind('click');
        $.get(e.data('poload'),function(d) {
            e.popover({content: d, html: true}).popover('show', {

            });
        });
    });

0

ホバートリガーを使用して静的要素にajaxポップオーバーを表示します。

$('.hover-ajax').popover({
    "html": true,
    trigger: 'hover',
    "content": function(){
        var div_id =  "tmp-id-" + $.now();
        return details_in_popup($(this).attr('href'), div_id);
    }
});

function details_in_popup(link, div_id){
    $.ajax({
        url: link,
        success: function(response){
            $('#'+div_id).html(response);
        }
    });
    return '<div id="'+ div_id +'">Loading...</div>';
}

HTML:

<span class="hover-ajax" href="http://domain.tld/file.php"> Hey , hoover me ! </span>

0
  $('[data-poload]').popover({
    content: function(){
      var div_id =  "tmp-id-" + $.now();
      return details_in_popup($(this).data('poload'), div_id, $(this));
    },
    delay: 500,

    trigger: 'hover',
    html:true
  });

  function details_in_popup(link, div_id, el){
      $.ajax({
          url: link,
          cache:true,
          success: function(response){
              $('#'+div_id).html(response);
              el.data('bs.popover').options.content = response;
          }
      });
      return '<div id="'+ div_id +'"><i class="fa fa-spinner fa-spin"></i></div>';
  }   

Ajaxコンテンツが1回読み込まれます!見るel.data('bs.popover').options.content = response;


0

私はそうしました、そしてそれはajaxとポップオーバーコンテンツのロードで完璧に動作します。

var originalLeave = $.fn.popover.Constructor.prototype.leave;
        $.fn.popover.Constructor.prototype.leave = function(obj){
            var self = obj instanceof this.constructor ?
                obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
            var container, timeout;

            originalLeave.call(this, obj);

            if(obj.currentTarget) {
                container = $(obj.currentTarget).siblings('.popover')
                timeout = self.timeout;
                container.one('mouseenter', function(){
                    //We entered the actual popover – call off the dogs
                    clearTimeout(timeout);
                    //Let's monitor popover content instead
                    container.one('mouseleave', function(){
                        $.fn.popover.Constructor.prototype.leave.call(self, self);
                    });
                })
            }
        };
        var attr = 'tooltip-user-id';
        if ($('a['+ attr +']').length)
            $('a['+ attr +']').popover({
                html: true,
                trigger: 'click hover',
                placement: 'auto',
                content: function () {
                    var this_ = $(this);
                    var userId = $(this).attr(attr);
                    var idLoaded = 'tooltip-user-id-loaded-' + userId;
                    var $loaded = $('.' + idLoaded);
                    if (!$loaded.length) {
                        $('body').append('<div class="'+ idLoaded +'"></div>');
                    } else if ($loaded.html().length) {
                        return $loaded.html();
                    }
                    $.get('http://example.com', function(data) {
                        $loaded.html(data);
                        $('.popover .popover-content').html(data);
                        this_.popover('show');
                    });
                    return '<img src="' + base_url + 'assets/images/bg/loading.gif"/>';
                },
                delay: {show: 500, hide: 1000},
                animation: true
            });

あなたはそれをhttp://kienthuchoidap.comでチェックすることができます。これに移動し、ユーザーのユーザー名にカーソルを合わせます。


0

私の場合、ポップオーバーをロードする前にデータコンテンツを変更します。

$('.popup-ajax').data('content', function () {
    var element = this;
    $.ajax({
        url: url,
        success: function (data) {

            $(element).attr('data-content', data)

            $(element).popover({
                html: true,
                trigger: 'manual',
                placement: 'left'
            });
            $(element).popover('show')
        }})
})

0

これは私にとってはうまくいきます、このコードは可能なアライメントの問題を修正します:

<a class="ajax-popover" data-container="body" data-content="Loading..." data-html="data-html" data-placement="bottom" data-title="Title" data-toggle="popover" data-trigger="focus" data-url="your_url" role="button" tabindex="0" data-original-title="" title="">
  <i class="fa fa-info-circle"></i>
</a>

$('.ajax-popover').click(function() {
  var e = $(this);
  if (e.data('loaded') !== true) {
    $.ajax({
      url: e.data('url'),
      dataType: 'html',
      success: function(data) {
        e.data('loaded', true);
        e.attr('data-content', data);
        var popover = e.data('bs.popover');
        popover.setContent();
        popover.$tip.addClass(popover.options.placement);
        var calculated_offset = popover.getCalculatedOffset(popover.options.placement, popover.getPosition(), popover.$tip[0].offsetWidth, popover.$tip[0].offsetHeight);
        popover.applyPlacement(calculated_offset, popover.options.placement);
      },
      error: function(jqXHR, textStatus, errorThrown) {
        return instance.content('Failed to load data');
      }
    });
  }
});

念のため、私が使用しているエンドポイントはhtml(rails partial)を返します

私はここからコードの一部を取りましたhttps://stackoverflow.com/a/13565154/3984542

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.