AJAX এর সাথে একটি বুটস্ট্র্যাপ পপওভার সামগ্রী লোড করুন। এটা কি সম্ভব?


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')
})

আমি যখন ক্লিক করি তখন আমি অনুরোধটি করতে দেখি, তবে পপওভারটি পপআপ করে না। এমনকি পপওভারের জন্য ডিওএমে যোগ করার জন্য এইচটিএমএলও দেখছি না, তবে এটি ফায়ারব্যাগ হতে পারে।

কেউ কি এই চেষ্টা করেছে?


4
আমি বুটস্ট্র্যাপের সাথে কাজ করি নি, তবে আমি ধারণা করব যে আপনি যখন এতে সামগ্রী যুক্ত করার চেষ্টা করছেন তখন উপাদানটির অস্তিত্ব থাকতে পারে না, তবে এটি অনুমান। আপনি কি কোনও জাভাস্ক্রিপ্ট ত্রুটি পেয়েছেন?
শেঠ

যদি আপনার একাধিক পপওভার থাকে এবং প্রতিটি পপওভারের জন্য বিভিন্ন সামগ্রী লোড করতে চান , তবে এই উত্তরটি খুব ঝরঝরে এবং পপওভারগুলির জন্য বক্স সেটআপের বাইরে অনেকগুলি রক্ষণাবেক্ষণের অনুমতি দেয় - আপনাকে যা করতে হবে তা কেবল পপওভারের আইডি সংরক্ষণ করতে হবে লিঙ্কটির বৈশিষ্ট্যগুলিতে এবং 'shown.bs.popover'হ্যান্ডলারে সেগুলি পড়ুন : স্ট্যাকওভারফ্লো.com
ম্যাটি জে

উত্তর:


105

কার্যকারী সমাধানের জন্য আমার ব্লগ পোস্টটি দেখুন: https://medium.com/cagataygurturk/load-a-bootstrap-popover-content-with-ajax-8a95cd34f6a4

প্রথমে আমাদের যে উপাদানগুলিতে একটি পপ যোগ করতে চান তাতে ডেটা-পোলাড বৈশিষ্ট্য যুক্ত করা উচিত। এই বৈশিষ্ট্যের বিষয়বস্তুটি লোড হওয়ার url হওয়া উচিত (পরম বা আপেক্ষিক):

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

এবং জাভাস্ক্রিপ্টে, অগ্রাধিকার হিসাবে একটি document (নথি) .ডিডি ();

$('*[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()একটি নতুন হোভার ইভেন্টকে আবদ্ধ করে। আপনি যদি প্রতিটি হোভার ইভেন্টে ডেটা রিফ্রেশ করতে চান তবে আপনার অফটি সরিয়ে দেওয়া উচিত।

দয়া করে উদাহরণের কার্যকরী জেএসফিডেলটি দেখুন ।


4
আজাক্স কলটি শেষ হওয়ার আগে যখন আমি দু'বার কাঁদলাম তখন আমি কিছুটা অদ্ভুততা পেয়েছিলাম ... আমার পপভারগুলি "স্টিক" খোলা থাকবে। আমি "এল.উনবাইন্ড ('হোভার')" "কে get .get () এর আগে ডান দিকে নিয়ে গিয়ে সমাধান করেছি।
লুক অস্পষ্ট

4
এটি কার্যকর হয়, তবে পপওভারটি আমার জন্যও আটকে থাকে, যদিও
আনবাইন্ডটি

4
আপনি যদি কোনও বাহ্যিক ইউআরএল লোড করার চেষ্টা করছেন, আপনি ক্রস-ডোমেন অ্যাক্সেস সীমাবদ্ধতায় চলে যাবেন। এটি পেতে, আপনি এই পপওভারের htmlসম্পত্তি সেট করতে পারেন true, তারপরে contentসম্পত্তিটিকে একটি আইফ্রেমে এইচটিএমএল ট্যাগে সেট করুন , পছন্দ করুন content: '<iframe src="http://www.google.com"></iframe>'। আপনাকে max-widthসিএসএস ব্যবহার করে আপনার পপওভারের সম্পত্তি ওভাররাইড করতে হবে এবং সম্ভবত সিএসএস ব্যবহার করে ইফ্রেমের স্টাইলিংও সরিয়ে ফেলতে হবে।
গাভিন

4
আপনি ব্যবহার করতে পারেন @FrzKhan e.off('hover')পদ্ধতি
codenamev

4
এই কারণে কাজ করে না stackoverflow.com/questions/4111194/... .hover পরিবর্তন (ফাংশন () {}) কাজ করে।
arisalexis

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>';
}

4
প্রতিভা উত্তর! এবং কেন এটি এটিকে আরও বেশি পঠনযোগ্য করে তুলতে সম্পাদনা করা হয়েছে
ইটজাজাদ

4
দুর্দান্ত সমাধান। বুটস্ট্র্যাপের বর্তমান সংস্করণে তবে মনে হয় এই পদ্ধতিটি ডের কিছুটা সমস্যা হতে পারে github.com/twbs/bootstrap/issues/12563 .আমি দুবার ইস্যু করেছি এবং দ্রুত সমাধানটি ছিল প্রতিটি পপওভারে একটি শিরোনাম নিশ্চিত করা। এর অর্থ হ'ল আপনি যে লোডিং পাঠ্যটি ব্যবহার করছেন তা আমি কখনই দেখতে পাই না।
রাসমাস ক্রিস্টেনসেন

কাজগুলি, আমাকে href এর পরিবর্তে ডেটা-লিঙ্কটি ব্যবহার করা বাদ দিয়ে কাজ করা উচিত, যখন href ব্যবহার করার সময় আমার ব্রাউজারটি কেবল নতুন উইন্ডোতে href- তে url খুলতে পারে।
টিনুসস্কি

20
এটি কি প্রান্তিককরণের সমস্যাগুলি সৃষ্টি করে না? ৩.৩.১ (এবং ক্রোম ব্যবহার করে) এ পদ্ধতির ব্যবহার করার সময়, "লোডিং ..." প্রদর্শিত হলে পপওভারটি প্রান্তিককরণ করে তবে আমার পপওভারের আসল সামগ্রীটি লোড হওয়ার সাথে সাথে অ্যালাইনমেন্টটি সেই অনুযায়ী সামঞ্জস্য হয় না .. ।
ম্যাট

4
সুন্দর সমাধান। এই সমাধানটির একটি নেতিবাচক দিকটি হ'ল এজ্যাক্স কলটি দু'বার করা হয়। পপওভার উপাদানটি একটি টুলটিপ যা হ্যাশ কনটেন্ট ব্যবহার করে প্রথমে সামগ্রীটি পরীক্ষা করে এবং তারপরে সেটটেন্টের সাহায্যে সামগ্রীটি পায়।
লিয়াম

24

এই সমস্ত সমাধানগুলি পড়ে, আমি মনে করি আপনি যদি একটি সিঙ্ক্রোনাস অজ্যাক্স কল ব্যবহার করেন তবে সমাধানটি আরও সহজ হয়ে যায় । তারপরে আপনি এর মতো কিছু ব্যবহার করতে পারেন:

  $('#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');
  });

4
এটি আমাকে টন আউট করতে সহায়তা করেছিল, কারণ এজাক্স বিষয়বস্তু ফিরিয়ে দেওয়ার আগে পজওভার একটি নির্দিষ্ট অবস্থানে রেন্ডারিংয়ের সাথে আমার সমস্যা ছিল (এটি স্ক্রিনটি লোড করে দেয়)। ধন্যবাদ স্যার!
ডেরেক

এটি সহজ হতে পারে তবে এটি ইভান ক্লাস পোস্ট হওয়া সমাধানের চেয়ে কম মার্জিতও।
ইয়ান কেম্প

6
async: falseআমার জন্য এটি মেরে
ফেলে

যদিও অবশ্যই সহজ, জাভাস্ক্রিপ্ট এবং সিঙ্ক্রোনাস কোড সত্যই একসাথে ভাল খেলছে না। যেহেতু জাভাস্ক্রিপ্ট একক থ্রেডেড তাই এটি যতক্ষণ অনুরোধ গ্রহণ করবে ততক্ষণ কোনও কোড কার্যকর করতে বাধা দেবে।
ইলুটোভ

4
সিঙ্ক্রোনাস এজেএক্সকে হ্রাস করা হয়েছে।
বার্মার

10

আমি সর্বাধিক জনপ্রিয় উত্তর আপডেট করেছি। তবে আমার পরিবর্তনগুলি অনুমোদিত না হলে আমি একটি পৃথক উত্তর এখানে রেখেছি।

পার্থক্যগুলি হ'ল:

  • সামগ্রী লোড হওয়ার সময় লোডিং পাঠ্য দেখানো হয়েছে। ধীর সংযোগের জন্য খুব ভাল।
  • মাউস প্রথমবার পপওভার ছাড়লে যা ঘটবে সেগুলি মুছুন।

প্রথমে আমাদের যে উপাদানগুলিতে একটি পপ যোগ করতে চান তাতে ডেটা-পোলাড বৈশিষ্ট্য যুক্ত করা উচিত। এই বৈশিষ্ট্যের বিষয়বস্তুটি লোড হওয়ার url হওয়া উচিত (পরম বা আপেক্ষিক):

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

এবং জাভাস্ক্রিপ্টে, অগ্রাধিকার হিসাবে একটি document (নথি) .ডিডি ();

 // 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()একটি নতুন হোভার ইভেন্টকে আবদ্ধ করে। আপনি যদি প্রতিটি হোভার ইভেন্টে ডেটা রিফ্রেশ করতে চান তবে আপনার অফটি সরিয়ে দেওয়া উচিত।

দয়া করে উদাহরণের কার্যকরী জেএসফিডেলটি দেখুন ।


7

Ğaatay Gertü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 জন্য: $ ('* [[ডেটা-পোল্যাড]')। On ('মাউসেন্টার মাউসলেভ', ফাংশন (ইভেন্ট) {
জেপ্রেড

7

আকাটায়ে গার্তিকের সমাধানটি দুর্দান্ত তবে আমি লুক দ্য অস্কার দ্বারা বর্ণিত একই অদ্ভুততার অভিজ্ঞতা পেয়েছি:

যখন এজাক্স লোডিং খুব বেশি স্থায়ী হয় (বা মাউস ইভেন্টগুলি খুব দ্রুত হয়) তখন পপওভার উন্মুক্ত থাকার কারণে আমাদের একটি নির্দিষ্ট উপাদানটিতে একটি পপওভার ('প্রদর্শন') এবং কোনও পপওভার ('লুকান') থাকে না।

আমি এই বৃহত-প্রাক-লোড সমাধানটিকে পছন্দ করেছি, সমস্ত পপওভার-সামগ্রীগুলি লোড হয় এবং ইভেন্টগুলি স্বাভাবিক (স্ট্যাটিক) পপওভারের মতো বুটস্ট্র্যাপ দ্বারা পরিচালিত হয়।

$('.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 , যদি কোন PopOver আপনার আইটেমের জন্য তৈরী করেছি (হয় যদি ($ (এই) .data ( 'popover') == নাল) ), এটা তৈরি করুন। মজার বিষয় হ'ল আপনি নিজের পপওভার সামগ্রীটি পপওভার () ফাংশনে আর্গুমেন্ট ( টেমপ্লেট ) হিসাবে পাস করে সংজ্ঞায়িত করতে পারেন । সেট করতে ভুলবেন না এইচটিএমএল থেকে প্যারামিটার সত্য এছাড়াও।

এখানে আমি কেবল পপওভারটেম্পলেট নামে একটি লুকানো টেম্পলেট তৈরি করেছি এবং এটি জিকুয়েরির সাথে ক্লোন করেছি। আপনি একবার এটি ক্লোন করে নিলে আইডি বৈশিষ্ট্যটি মুছে ফেলতে ভুলবেন না অন্যথায় আপনি ডওমে ডুপ্লিকেটড আইডি দিয়ে শেষ করবেন। পৃষ্ঠায় টেমপ্লেটটি আড়াল করতে সেই শৈলীটি = "প্রদর্শন: কিছুই নয়" লক্ষ্য করুন।

<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.in নির্বাচক! .In বর্গ নির্দেশ করে যে popover বর্তমানে প্রদর্শিত হয়, যে কৌতুক এখানে!

শেষ করতে, মাউসলেভ ইভেন্টে, কেবল পপওভারটি লুকান।


আমার জন্য একই জিনিস, সবচেয়ে সহজ এবং সেরা ;-)
টমাস ডেকাক্স

আপনি সার্ভার থেকে ডেটা অনুরোধ করছেন এমন প্রতিটি হোভারের সাথে সমস্যাটি রয়েছে। এটি একবারে ডেটা লোড করা উচিত।
রিচার্ড টর্কাটো

4
@ রিচার্ড টর্কাটো একদিকে আপনি ঠিক বলেছেন। ফলাফলটি ক্যাশে রেখে দেওয়া খুব সহজ হওয়া উচিত। অন্যদিকে, আমরা প্রতিটি হোভারে নতুন ডেটা লোড করতে সার্ভারটিকে আঘাত করতে চাই। তাই ক্যাচিং প্রয়োগ করা আপনার উপর
নির্ভর করে

আমি বুঝতে পেরেছি যে এটি এখন পুরানো, তবে কেউ যদি এটির দিকে তাকিয়ে থাকে তবে আমি এটির কাজটি ভালভাবে ভাবতে পারি না যদি আপনার একাধিক পপওভার থাকে এবং আপনি সেগুলির প্রত্যেকটির উপরে স্ক্রোল করেন। এ-এর উপরে হভার করুন, এ-এর জন্য অনুরোধ প্রেরণ করা হয়েছে, বি-তে হওর করুন এবং এতে আটকানো থাকুন, বি এর জন্য অনুরোধ প্রেরণ করা হবে, বি থেকে প্রতিক্রিয়া আসবে, খ-এর জন্য পপওভার আপডেট হবে, বি এর জন্য প্রতিক্রিয়া আপডেট হবে, বিটির জন্য পপওভার আপডেট করবে (যেহেতু সাফল্য ফাংশন হবে উপরে শক্তি সাহায্যের সম্পূরক যে বর্গ সঙ্গে ঠিক পরিষ্কার কিছু এই সময়ে খুঁজছি যদিও। stackoverflow.com/a/34030999/2524589
KSib

3

এখানে আমার সমাধানটি যা অজেক্স লোডযুক্ত সামগ্রীর সাথেও সূক্ষ্মভাবে কাজ করে।

/*
 * 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

যদি পপওভারে সামগ্রীটি পরিবর্তিত না হওয়ার সম্ভাবনা থাকে তবে এটি একবারে পুনরুদ্ধার করার অর্থ হবে। এছাড়াও, কয়েকটি সমাধানের ক্ষেত্রে এই সমস্যাটি রয়েছে যে আপনি যদি একাধিক "প্রাকদর্শন" দ্রুত এগিয়ে যান তবে আপনি একাধিক উন্মুক্ত পপআপ পান। এই সমাধান এই দুটি বিষয়ই সম্বোধন করে।

$('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 এর উত্তর বুটস্ট্র্যাপ 4 যথাযথ এবং বুদ্ধিমানভাবে ক্যাশে উভয় হিসাবে প্রসারিত করেছি।

নোট করুন যে স্নিপেট স্ট্যাকওভারফ্লোয়ের সিওআরএস নীতির কারণে রিমোট ঠিকানাটি আসলে লোড করবে না।

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>


আমি আমার প্রয়োজনীয় সমাধানটির সাথে এটি সহজেই মানিয়ে নিতে সক্ষম হয়েছি। ধন্যবাদ!
নিমিনেন

4
দুর্দান্ত সমাধান, আমার সিএসএস হ্যান্ডেল করার জন্য পপওভার কনফিগারেশনে কেবল "স্যানিটাইজ: মিথ্যা" যুক্ত করতে হয়েছিল!
গিলিয়াম

1

এর অনুরূপ একটি উত্তর এই থ্রেডে দেওয়া হয়েছে: ডেটা-সামগ্রী নির্ধারণ করা এবং পপওভার প্রদর্শন করা - এটি আপনি যা অর্জন করবেন বলে আশা করছেন তা করার এটি একটি সর্বোত্তম উপায়। অন্যথায় আপনাকে পপওভার পদ্ধতির বিকল্পগুলিতে সরাসরি: সত্য বিকল্পটি ব্যবহার করতে হবে। আশা করি এটি সাহায্য করবে


1

আমি সমাধানটি আরাটায় গার্তিকের দ্বারা চেষ্টা করেছিলাম কিন্তু লুক অব্পুস্করের মতোই অদ্ভুততা পেয়েছি। তারপরে আসা কুসুমার মাধ্যমে সমাধানটি চেষ্টা করলেন। এটি কাজ করে, তবে আমি বিশ্বাস করি এটি প্রতিবার পপওভার প্রদর্শিত হওয়ার পরে এটি অ্যাজাক্স পড়ে । আনবাইন্ড করার কল ('হোভার') এর কোনও প্রভাব নেই। এর কারণ প্রতিনিধি একটি নির্দিষ্ট শ্রেণির ইভেন্টগুলির জন্য নিরীক্ষণ করছেন - তবে সেই শ্রেণিটি অপরিবর্তিত।

আসা কুসুমার উপর ভিত্তি করে আমার সমাধানটি এখানে। পরিবর্তনগুলি:

  • নতুন জিকুয়ের লাইব্রেরিগুলির delegateসাথে onমেলে প্রতিস্থাপন করা হয়েছে।
  • বাঁধা হোভার ইভেন্টের তুলনায় 'উইথজ্যাক্সপোভার' শ্রেণিটি সরান (যা কখনই আবদ্ধ ছিল না)
  • পপওভারে "ট্রিগার: হোভার" যুক্ত করুন যাতে বুটস্ট্র্যাপ এটি দ্বিতীয় ব্যবহারের সাথে পুরোপুরি শুরু করে handle
  • আমার ডেটা লোডিং ফাংশনটি জেএসনকে রিটার্ন দেয়, এটি পপওভারের জন্য শিরোনাম এবং সামগ্রী উভয়ই নির্দিষ্ট করে তোলে।
    / * লক্ষ্য: একটি সরঞ্জামদণ্ড / পপওভার প্রদর্শন করুন যেখানে লিখিত সামগ্রীটি আনা হয়েছে
              শুধুমাত্র প্রথমবার প্রয়োগ।

        কীভাবে: উপযুক্ত সামগ্রী আনুন এবং প্রথমবারটি টুলটিপ / পপওভারটি নিবন্ধ করুন 
              মাউস ক্লাস "উইথজ্যাক্সপোভার" সহ একটি ডোম উপাদান প্রবেশ করে। অপসারণ
              উপাদান থেকে ক্লাস তাই আমরা পরের বার মাউস প্রবেশ করে না যে।
              তবে, এটি প্রথমবারের জন্য সরঞ্জামদণ্ড / পপওভারটি দেখায় না
              (কারণ সরঞ্জামটিপটি নিবন্ধিত হওয়ার পরে মাউসটি ইতিমধ্যে প্রবেশ করা হয়েছে)।
              সুতরাং আমাদের এটি নিজেরাই প্রদর্শন / আড়াল করতে হবে।
    * /
    $ (ফাংশন () {
      '(' বডি ')। অন (' হোভার ','। উইথজ্যাক্সপোভার ', ফাংশন (ইভেন্ট) {
          যদি (ইভেন্ট.type === 'মাউসেন্টার') {
              var el = $ (এটি);
              get .get (el.attr ('ডেটা-লোড')), ফাংশন (d)
                  el.removeClass ('উইথজ্যাক্সপোভার')
                  el.popover ({ট্রিগার: 'হোভার', 
                              শিরোনাম: d.title, 
                              সামগ্রী: d.content on) পপওভার ('প্রদর্শন');
              });
          } অন্য {
              this (এটি)। পপওভার ('লুকান');
          }
      });
    });

1

আমি এখানে কিছু পরামর্শ চেষ্টা করেছিলাম এবং আমার নিজের (যা কিছুটা আলাদা) উপস্থাপন করতে চাই - আশা করি এটি কাউকে সহায়তা করবে। আমি প্রথম ক্লিকে পপআপটি দেখাতে এবং দ্বিতীয় ক্লিকে এটি আড়াল করতে চেয়েছিলাম (অবশ্যই প্রতিটি সময় ডেটা আপডেট করার সাথে)। visableপপওভার দৃশ্যমান কিনা তা জানতে আমি একটি অতিরিক্ত পরিবর্তনশীল ব্যবহার করেছি । এখানে আমার কোড: এইচটিএমএল:

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

জাভাস্ক্রিপ্ট:

$('#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% প্রস্থ) নিশ্চিত নয় যে এগুলি বুটস্ট্র্যাপ 4 দিয়ে পরিবর্তিত হয়েছে?
বেন সিএ-

100% প্রস্থ সম্ভবত আপনার উপাদানগুলি কীভাবে ছড়িয়ে দেওয়া হয়েছে তার উপর নির্ভর করে ... সম্ভবত। সামগ্রীটি লোড হওয়ার পরেও কি বাক্সটি আরও প্রশস্ত হবে?
গ্যাব্রিয়েল লুসি

অবস্থান জন্য, আপনি একটি ব্রেকপয়েন্ট সেট করতে পারেন popover._popper.update()এবং নিশ্চিত করুন যে করা popover, _popperএবং updateসব প্রত্যাশিত মান আছে। এগুলি সম্ভবত পরিবর্তিত হয়েছে possible
গ্যাব্রিয়েল লুসি

ডান - নতুন কন্টেন্টের পরে বাক্সটি প্রশস্ত হবে। এবং আমি কনসোলে কিছু মান লেখার চেষ্টা করেছি এবং সংজ্ঞায়িত হয়ে যাচ্ছি।
বেন সিএ

4
- তুমি ঠিক বলছো. দেখা যাচ্ছে আমি একই সাথে আরও কিছু জটিল জিনিস করার চেষ্টা করছিলাম এবং তখন এটি কাজ করছে না। তবে এখন আমি এটিও সংযুক্ত করতে সক্ষম হয়েছি। এখানে একটি ফ্রিডল রয়েছে : jsfiddle.net/udfz5wrv/1 আপনাকে নির্বাচকদের ব্যবহার করতে সক্ষম করে (যদি আপনাকে হ্যান্ডলারগুলি আবদ্ধ করতে হয় ইত্যাদি), নির্বাচক থেকে ডেটা অ্যাক্সেস করতে পারে, বুটস্ট্র্যাপ লোডিং স্পিনার ইত্যাদি প্রদর্শন করতে পারে
বেন ইন CA

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 এর পক্ষে এটি ভাল জিনিস এবং যদি ব্যবহারকারীদের জাভাস্ক্রিপ্ট না থাকে!


0

আমি আতাটায় এর সমাধানটি পছন্দ করি তবে আমি পপআপগুলি মাউসআউটটিতে লুকিয়ে থাকতাম না। আমি এর সাথে এই অতিরিক্ত কার্যকারিতা যুক্ত করেছি:

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

0

আমি মূল সমাধানটি ব্যবহার করেছি তবে বেশ কয়েকটি পরিবর্তন করেছি:

প্রথমত, আমি এর 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

আমি এইচটিএমএল যুক্ত করেছি: সত্য, সুতরাং যদি আপনি ফলাফলগুলি ফর্ম্যাট করতে চান তবে এটি কোনও কাঁচা এইচটিএমএল আউটপুট প্রদর্শন করে না। আপনি আরও নিয়ন্ত্রণে যুক্ত করতে পারেন।

    $('*[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

হোভার ট্রিগার সহ স্থির উপাদানগুলিতে এজাক্স পপওভার প্রদর্শন করুন:

$('.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>';
}

এইচটিএমএল:

<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>';
  }   

অ্যাজাক্স সামগ্রী একবার লোড করা হয়! দেখাel.data('bs.popover').options.content = response;


0

আমি করেছি এবং এটি অ্যাজাক্স এবং পপওভার সামগ্রীতে লোড করে নিখুঁত কাজ করেছি।

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.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');
      }
    });
  }
});

কেবলমাত্র ক্ষেত্রে, শেষের দিকটি আমি এইচটিএমএল রিটার্ন ব্যবহার করছি (একটি রেল আংশিক)

আমি এখান থেকে কোডের কিছু অংশ নিয়েছি https://stackoverflow.com/a/13565154/3984542

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.