จะยกเลิกการป็อปอัพ Twitter Bootstrap ได้อย่างไรโดยคลิกที่ภายนอก


289

เราจะได้รับป๊อปอัปที่จะถูกไล่ออกในลักษณะเดียวกันกับ modals หรือไม่ ทำให้พวกเขาปิดเมื่อผู้ใช้คลิกที่ไหนสักแห่งนอกพวกเขา?

น่าเสียดายที่ฉันไม่สามารถใช้คำกริยาจริงแทน popover ได้เนื่องจากคำว่าโมดัลหมายถึงตำแหน่ง: คงที่และนั่นจะไม่ใช่ป๊อปอัปอีกต่อไป :(


3
คำถามที่คล้ายกัน: stackoverflow.com/q/8947749/1478467
Sherbrow

ลองใช้stackoverflow.com/a/40661543/5823517นี้ ไม่เกี่ยวข้องกับการวนลูปผ่านผู้ปกครอง
Tunn

data-trigger="hover"และdata-trigger="focus"เป็นทางเลือกในตัวสำหรับการปิดป็อปโอเวอร์หากคุณไม่ต้องการใช้สลับ ในความคิดของฉันdata-trigger="hover"มอบประสบการณ์การใช้งานที่ดีที่สุด ... ไม่จำเป็นต้องเขียนโค้ด. js เพิ่มเติม ...
Hooman Bahreini

คำตอบ:


461

อัปเดต:โซลูชันที่แข็งแกร่งกว่าเล็กน้อย: http://jsfiddle.net/mattdlockyer/C5GBU/72/

สำหรับปุ่มที่มีข้อความเท่านั้น:

$('body').on('click', function (e) {
    //did not click a popover toggle or popover
    if ($(e.target).data('toggle') !== 'popover'
        && $(e.target).parents('.popover.in').length === 0) { 
        $('[data-toggle="popover"]').popover('hide');
    }
});

สำหรับปุ่มที่มีไอคอนใช้(รหัสนี้มีข้อบกพร่องใน Bootstrap 3.3.6 ดูการแก้ไขด้านล่างในคำตอบนี้)

$('body').on('click', function (e) {
        //did not click a popover toggle, or icon in popover toggle, or popover
        if ($(e.target).data('toggle') !== 'popover'
            && $(e.target).parents('[data-toggle="popover"]').length === 0
            && $(e.target).parents('.popover.in').length === 0) { 
            $('[data-toggle="popover"]').popover('hide');
        }
    });

สำหรับ JS Generated Popoversใช้'[data-original-title]'แทน'[data-toggle="popover"]'

Caveat:วิธีการแก้ปัญหาข้างต้นอนุญาตให้เปิดป๊อปอัปหลายรายการพร้อมกัน

โปรดป๊อปอัปหนึ่งครั้งพร้อม:

อัปเดต: Bootstrap 3.0.x ดูรหัสหรือซอได้ที่http://jsfiddle.net/mattdlockyer/C5GBU/2/

$('body').on('click', function (e) {
    $('[data-toggle="popover"]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            $(this).popover('hide');
        }
    });
});

สิ่งนี้จะจัดการกับการปิดป๊อปอัปที่เปิดอยู่แล้วและไม่ได้คลิกหรือลิงก์ของพวกเขายังไม่ถูกคลิก


อัปเดต: Bootstrap 3.3.6, ดูซอ

แก้ไขปัญหาที่ไหนหลังจากปิดใช้เวลา 2 คลิกเพื่อเปิดใหม่

$(document).on('click', function (e) {
    $('[data-toggle="popover"],[data-original-title]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {                
            (($(this).popover('hide').data('bs.popover')||{}).inState||{}).click = false  // fix for BS 3.3.6
        }

    });
});

อัปเดต:การใช้เงื่อนไขของการปรับปรุงก่อนหน้านี้ได้รับการแก้ไข แก้ไขปัญหาการดับเบิ้ลดับเบิลคลิกและโกพ๊อปโอเวอร์ผี:

$(document).on("shown.bs.popover",'[data-toggle="popover"]', function(){
    $(this).attr('someattr','1');
});
$(document).on("hidden.bs.popover",'[data-toggle="popover"]', function(){
    $(this).attr('someattr','0');
});
$(document).on('click', function (e) {
    $('[data-toggle="popover"],[data-original-title]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            if($(this).attr('someattr')=="1"){
                $(this).popover("toggle");
            }
        }
    });
});

2
ฉันแนบไปกับ$(document)แทนที่จะ$('body')เนื่องจากบางครั้งbodyไม่ขยายไปทั่วทั้งหน้า
jasop

6
หลังจากเปิดใช้งาน popover (และการกระทำที่ซ่อนถัดมา) popover จะไม่ถูกซ่อนอย่างสมบูรณ์ มันมองไม่เห็น ปัญหาคือเนื้อหาที่อยู่ภายใต้ป๊อปโอเวอร์ที่มองไม่เห็น แต่ปัจจุบันไม่สามารถคลิกหรือเลื่อนได้ ปัญหาเกิดขึ้นกับการสร้าง Chrome รุ่นล่าสุด bootstrap 3 .js ล่าสุด (อาจเป็นเบราว์เซอร์อื่นเช่นกันไม่สามารถตรวจสอบได้เนื่องจากควรใช้วิธีแก้ปัญหานี้ต่อไป)
ravb79

6
แทนที่จะ'[data-toggle="popover"]'ใช้กับป๊อปอัปที่สร้างโดย JavaScript ฉันไม่ได้ใช้'[data-original-title]'เป็นตัวเลือก
นาธาน

4
ไม่มีใครรู้ว่าทำไมการแก้ปัญหานี้ไม่ทำงานกับ bootstrap รุ่นล่าสุด? สิ่งต่อไปนี้กำลังเกิดขึ้น: คลิกปุ่มเพื่อแสดงป๊อปโอเวอร์จากนั้นคลิกเนื้อหาเพื่อยกเลิกป๊อปโอเวอร์จากนั้นคลิกปุ่มเพื่อแสดงป๊อปโอเวอร์และป๊อปโอเวอร์ไม่ปรากฏขึ้น หลังจากมันล้มเหลวหนึ่งครั้งหากคุณคลิกอีกครั้งมันจะแสดงขึ้น มันแปลกมาก
JTunney

3
@JTunney ฉันกำลังใช้ BS 3.3.6 และยังคงเห็นพฤติกรรมนั้นซึ่งต้องใช้สองคลิกเพื่อเปิด popoever หลังจากเลิกใช้หนึ่ง
sersun

65
$('html').on('mouseup', function(e) {
    if(!$(e.target).closest('.popover').length) {
        $('.popover').each(function(){
            $(this.previousSibling).popover('hide');
        });
    }
});

การดำเนินการนี้จะปิดป๊อปอัปทั้งหมดหากคุณคลิกที่ใดก็ได้ยกเว้นในป๊อปโอเวอร์

อัพเดทสำหรับ Bootstrap 4.1

$("html").on("mouseup", function (e) {
    var l = $(e.target);
    if (l[0].className.indexOf("popover") == -1) {
        $(".popover").each(function () {
            $(this).popover("hide");
        });
    }
});

ฉันเพิ่มคลาสลงในปุ่มที่ทริกเกอร์ popover (pop-btn) ดังนั้นจึงไม่รวม ... ถ้า (! $ (e.target) .closest ('. popover'). length &&! $ (e. เป้าหมาย) .closest ('. btn'). hasClass ('pop-btn'))
mozgras

2
ด้วย 3 ปุ่มป๊อปโอเวอร์รหัสนี้ทำให้เกิดปัญหา ในบางกรณีฉันไม่สามารถคลิกปุ่มได้
OpenCode

1
ไม่สามารถรับรหัสนี้เพื่อทำงาน ... ตรวจสอบซอนี้และโปรดเพิ่มซอเพื่อคำตอบของคุณ jsfiddle.net/C5GBU/102
mattdlockyer

เหมาะสำหรับฉัน คำตอบอื่น ๆ มีผลข้างเคียงเมื่อ "คลิกภายนอก" ของฉันเกิดขึ้นเพื่อเปิดป๊อปโอเวอร์ใหม่
อัตราส่วนของ Facio

วิธีนี้ใช้งานได้ดี แต่ต้องมีวิธีในการปรับเปลี่ยนเพื่อที่ว่าหากคุณคลิกที่เนื้อหาของ popover มันจะไม่ปิดลง เช่นถ้าคุณคลิกที่ข้อความภายใน <b> แท็กด้านในป๊อปโอเวอร์ ...
เบ็นใน CA

40

ง่ายที่สุดและไม่ปลอดภัยที่สุดรุ่นใช้งานได้กับทุกรุ่น bootstrap

การสาธิต: http://jsfiddle.net/guya/24mmM/

ตัวอย่างที่ 2: ไม่ยกเลิกเมื่อคลิกภายในเนื้อหาของ popover http://jsfiddle.net/guya/fjZja/

การสาธิต 3: ป๊อปอัปหลายรายการ: http://jsfiddle.net/guya/6YCjW/


เพียงแค่โทรสายนี้จะยกเลิกการ popovers ทั้งหมด:

$('[data-original-title]').popover('hide');

ปิดป๊อปอัปทั้งหมดเมื่อคลิกด้านนอกด้วยรหัสนี้:

$('html').on('click', function(e) {
  if (typeof $(e.target).data('original-title') == 'undefined') {
    $('[data-original-title]').popover('hide');
  }
});

ตัวอย่างด้านบนแนบเหตุการณ์คลิกในเนื้อหา เมื่อผู้ใช้คลิกที่ popover มันจะทำงานตามปกติ เมื่อผู้ใช้คลิกที่สิ่งที่ไม่ใช่ป็อปโอเวอร์มันจะปิดป๊อปอัปทั้งหมด

นอกจากนี้ยังจะทำงานกับป๊อปอัปที่เริ่มต้นด้วย Javascript ซึ่งตรงข้ามกับตัวอย่างอื่น ๆ ที่จะไม่ทำงาน (ดูตัวอย่าง)

หากคุณไม่ต้องการยกเลิกเมื่อคลิกภายในเนื้อหาของป๊อปโอเวอร์ให้ใช้รหัสนี้ (ดูลิงก์ไปที่ตัวอย่างที่ 2):

$('html').on('click', function(e) {
  if (typeof $(e.target).data('original-title') == 'undefined' && !$(e.target).parents().is('.popover.in')) {
    $('[data-original-title]').popover('hide');
  }
});

3
มีปัญหาที่คล้ายกันและทำงานใน Bootstrap 3.
wsams

หากคุณนำป๊อปอัปเข้ามาใกล้มากขึ้นจนป๊อปอัปทับซ้อนกันเมื่อคุณซ่อนป๊อปโอเวอร์โดยคลิกที่ด้านนอกลิงก์ใดลิงค์หนึ่งจะหยุดทำงาน ตรวจสอบ: jsfiddle.net/qjcuyksb/1
Sandeep Giri

1
รุ่นสุดท้ายไม่ทำงานเมื่อใช้ bootstrap-datepicker ใน popover
dbinott

1
ผมชอบวิธีนี้ดีที่สุดเพราะคำตอบที่ได้รับการยอมรับเริ่มต้นที่จะเป็นบิตของหมูทรัพยากรที่มี 30 หรือเพื่อให้ป๊อปอัพ
เดวิด G

1
บางทีอาจจะมีประสิทธิภาพมากกว่า!$(e.target).closest('.popover.in').length !$(e.target).parents().is('.popover.in')
joeytwiddle

19

ด้วย bootstrap 2.3.2 คุณสามารถตั้งค่าทริกเกอร์เป็น 'focus' และใช้งานได้:

$('#el').popover({trigger:'focus'});

1
+1 แต่หมายเหตุด้านที่สำคัญ: นี่ไม่ได้ปิดป๊อปโอเวอร์หากคุณคลิกอีกครั้งที่ปุ่มหรือยึดในขณะที่คำตอบที่ยอมรับจะทำ
Christian Gollhardt

18

โดยทั่วไปจะไม่ซับซ้อนมาก แต่มีการตรวจสอบที่ต้องทำเพื่อหลีกเลี่ยงความผิดพลาดบางอย่าง

การสาธิต (jsfiddle)

var $poped = $('someselector');

// Trigger for the popover
$poped.each(function() {
    var $this = $(this);
    $this.on('hover',function() {
            var popover = $this.data('popover');
            var shown = popover && popover.tip().is(':visible');
            if(shown) return;        // Avoids flashing
            $this.popover('show');
    });
});

// Trigger for the hiding
 $('html').on('click.popover.data-api',function() {
    $poped.popover('hide');
});

2
สิ่งนี้จะยกเลิกคำกริยาโดยการคลิกทุกที่ที่อยู่นอก
hienbt88

เป็นไปได้หรือไม่ที่จะทำเช่นนี้ด้วยการpopover()คลิกแทนที่จะเลื่อนเมาส์?
Zaki Aziz

3
แน่นอน แต่คุณต้องโทรหาstopPropagation()เหตุการณ์ที่ส่งผ่านไปยังตัวจัดการคลิก (หากไม่ใช่ตัวจัดการที่ซ่อนอยู่จะซ่อนป๊อปโอเวอร์ทันที) การสาธิต (jsfiddle)
Sherbrow

ฉันมีฟังก์ชั่นเดียวกันด้านล่างในรหัสน้อยกว่ามาก คำตอบนี้ป่องและไร้สาระสำหรับคำถาม ... ทั้งหมดที่เขาต้องการคือการปิด popovers เมื่อคุณคลิกนอก ... นี่คือ overkill และ UGLY!
mattdlockyer

2
การแก้ไขฉันเชื่อว่าฉันมีฟังก์ชั่นที่ดีกว่าในรหัสน้อยไกล มันจะถือว่าคุณต้องการให้ป๊อปอัปปรากฏทีละครั้งเท่านั้น ถ้าคุณชอบสิ่งนี้โปรดโหวตคำตอบของฉันด้านล่าง: jsfiddle.net/P3qRK/1คำตอบ: stackoverflow.com/a/14857326/1060487
mattdlockyer

16

ไม่มีวิธีแก้ปัญหาที่ได้รับคะแนนสูงว่าทำงานได้อย่างถูกต้องสำหรับฉัน แต่ละอันนำไปสู่ข้อผิดพลาดเมื่อหลังจากเปิดและปิด (โดยการคลิกที่องค์ประกอบอื่น ๆ ) ป๊อปโอเวอร์เป็นครั้งแรกมันจะไม่เปิดอีกครั้งจนกว่าคุณจะคลิกสองครั้งที่ลิงก์ที่กระตุ้นการทำงานแทนหนึ่งครั้ง

ดังนั้นฉันจึงแก้ไขมันเล็กน้อย:

$(document).on('click', function (e) {
    var
        $popover,
        $target = $(e.target);

    //do nothing if there was a click on popover content
    if ($target.hasClass('popover') || $target.closest('.popover').length) {
        return;
    }

    $('[data-toggle="popover"]').each(function () {
        $popover = $(this);

        if (!$popover.is(e.target) &&
            $popover.has(e.target).length === 0 &&
            $('.popover').has(e.target).length === 0)
        {
            $popover.popover('hide');
        } else {
            //fixes issue described above
            $popover.popover('toggle');
        }
    });
})

1
นีซมันใช้งานได้สำหรับฉัน BTW คุณลืม) ในตอนท้ายของรหัสของคุณหลังจากที่ผ่านมาทำงาน}
เมอร์ลิน

1
พบปัญหาเดียวกันกับคลิกครั้งที่สอง นี่ควรเป็นคำตอบที่ไม่ปลอดภัย!
Felipe Leão

ฉันลองใช้วิธีแก้ไขปัญหาก่อนหน้านี้ข้างต้นด้วย แต่เพื่อเป็นแนวทางให้กับผู้ที่กำลังมองหาวิธีแก้ปัญหาในปี 2559 นี่เป็นทางออกที่ดีกว่า
dariru

คำตอบยอดนิยมทำงานตามที่โฆษณาไว้ อย่างที่คนอื่นไม่เห็น นี่ควรจะเป็นคำตอบที่ดีที่สุด
duggi

ทำงานได้อย่างสมบูรณ์ยกเว้นฉันไม่ได้ใช้ data-toggel = "popover" แต่คุณสามารถระบุตัวเลือกใด ๆ ที่ตรงกับองค์ประกอบทริกเกอร์ป๊อปโอเวอร์ของคุณ โซลูชันที่ดีและเป็นเพียงโซลูชันเดียวที่แก้ไขปัญหาการคลิกทั้งสองให้ฉัน
shock_gone_wild

11

ฉันทำ jsfiddle เพื่อแสดงวิธีการ:

http://jsfiddle.net/3yHTH/

แนวคิดคือการแสดงป๊อปโอเวอร์เมื่อคุณคลิกปุ่มและเพื่อซ่อนป๊อปโอเวอร์เมื่อคุณคลิกนอกปุ่ม

HTML

<a id="button" href="#" class="btn btn-danger">Click for popover</a>

JS

$('#button').popover({
    trigger: 'manual',
    position: 'bottom',
    title: 'Example',
    content: 'Popover example for SO'
}).click(function(evt) {
    evt.stopPropagation();
    $(this).popover('show');
});

$('html').click(function() {
    $('#button').popover('hide');
});

การสาธิตที่ดี ฉันสงสัยว่าคุณสามารถเรียก popover บนวัตถุ Jquery ได้อย่างไร popover เป็นปลั๊กอิน bootstrap js แต่คุณไม่ได้รวมไฟล์ bootstrap js ไว้ที่นั่นด้วย?
bingjie2680

มีไฟล์ js ใน jsfiddle ดูที่คอลัมน์ด้านซ้าย -> จัดการทรัพยากร
Pigueiras

ตกลงฉันเห็นว่ามี bootstrap js แต่มันไม่ถูกตรวจสอบมันยังใช้งานได้?
bingjie2680

ใช่มันใช้งานได้ อย่างไรก็ตามฉันค้นหาใน google: jsfiddle bootstrapและมันให้โครงกระดูกของ bootstrap css + js ใน jsfiddle
Pigueiras

2
ปัญหาเดียวของฉันคือคุณซ่อน popover เมื่อคุณคลิก อาจใช้คำแนะนำเครื่องมือก็ได้เช่นกัน
NoBrainer

7

เพียงเพิ่มคุณสมบัตินี้ด้วยองค์ประกอบ

data-trigger="focus"

เริ่มแรกสิ่งนี้ใช้ไม่ได้กับ Bootstrap 3.3.7 แต่ฉันอ่านเอกสารและพวกเขามีแนวทางที่ควรค่าแก่การกล่าวถึงที่นี่ จากตัวอย่าง popover ที่ไม่อนุญาตในเอกสาร "สำหรับการทำงานข้ามเบราว์เซอร์และข้ามแพลตฟอร์มที่เหมาะสมคุณต้องใช้แท็ก <a> ไม่ใช่แท็ก <button> และคุณต้องมีปุ่ม role =" และแอตทริบิวต์ tabindex ."
เจฟฟ์

3

นี้ได้รับการถามก่อนที่นี่ คำตอบเดียวกับที่ฉันให้แล้วยังใช้:

ผมมีความต้องการที่คล้ายกันและพบนี้ขยายเล็ก ๆ น้อย ๆ ที่ดีของเงินทุน Twitter popover โดยลีคาร์ไมเคิเรียก BootstrapX - clickover นอกจากนี้เขายังมีตัวอย่างการใช้งานบางอย่างที่นี่ โดยทั่วไปมันจะเปลี่ยน popover เป็นองค์ประกอบแบบโต้ตอบซึ่งจะปิดเมื่อคุณคลิกที่อื่นในหน้าหรือที่ปุ่มปิดภายใน popover นอกจากนี้ยังอนุญาตให้เปิดป๊อปอัปหลายรายการพร้อมกันและคุณสมบัติอื่น ๆ อีกมากมาย


3

ปาร์ตี้นี้มาช้า ... แต่ฉันคิดว่าฉันจะแบ่งปัน ฉันชอบต้นป็อปโอเวอร์ แต่มีฟังก์ชั่นการใช้งานเล็กน้อย ฉันเขียน bootstrap extension .bubble () นั่นคือทุกสิ่งที่ฉันต้องการให้เป็น popover สี่วิธีในการยกเลิก คลิกภายนอกสลับที่ลิงก์คลิก X และกดปุ่ม Escape

มันวางตำแหน่งโดยอัตโนมัติเพื่อไม่ให้หน้ากระดาษหลุด

https://github.com/Itumac/bootstrap-bubble

นี่ไม่ใช่การโปรโมตตนเองที่ไร้เหตุผล ... ฉันคว้ารหัสของคนอื่นมาหลายครั้งแล้วในชีวิตฉันอยากจะเสนอความพยายามของตัวเอง ให้มันหมุนและดูว่ามันเหมาะกับคุณหรือไม่


3

ตามhttp://getbootstrap.com/javascript/#popovers ,

<button type="button" class="popover-dismiss" data-toggle="popover" title="Dismissible popover" data-content="Popover Content">Dismissible popover</button>

ใช้ทริกเกอร์โฟกัสเพื่อปิดป๊อปอัปในการคลิกครั้งต่อไปที่ผู้ใช้ทำ

$('.popover-dismiss').popover({
    trigger: 'focus'
})

2
ไม่ทำงานบนเบราว์เซอร์ Mac ที่ทำงานตามลักษณะการทำงานดั้งเดิมของ OS X (ที่ไม่ได้โฟกัสหรือเบลอปุ่มเมื่อคลิก) เหล่านี้รวมถึง Firefox และ Safari พวก Bootstrap ทำผิดพลาดครั้งใหญ่ที่นี่เนื่องจากไม่สามารถเปิดป๊อปอัปเหล่านี้ได้
Ante Vrli

2
@AnteVrli บางทีนี่อาจยังไม่อยู่ในเอกสารเมื่อคุณเขียนความคิดเห็น แต่ตอนนี้เอกสารพูดว่า: "สำหรับพฤติกรรมข้ามเบราว์เซอร์และข้ามแพลตฟอร์มที่เหมาะสมคุณต้องใช้<a>แท็กไม่ใช่<button>แท็กและคุณต้องรวมrole="button"และและtabindexคุณลักษณะ." คุณลองกับข้อกำหนดเหล่านี้หรือไม่
Louis

3
ดีมีเป็นปัญหากับคำตอบนี้ซึ่งมีอะไรจะทำอย่างไรกับความเข้ากันได้แพลตฟอร์ม: กดปุ่มเมาส์ภายใน popover จะยกเลิก popover เพราะองค์ประกอบที่ทริกเกอร์ popover จะสูญเสียโฟกัส ลืมให้ผู้ใช้สามารถคัดลอกและวางจากป๊อปอัป: ทันทีที่ปุ่มเมาส์หยุดทำงานป๊อปโอเวอร์จะปิดลง หากคุณมีรายการที่ดำเนินการได้ในป๊อปโอเวอร์ (ปุ่มลิงก์) ผู้ใช้จะไม่สามารถใช้งานได้
Louis

มากสำหรับ 'cross-platform' เพราะใน bootstrap 4.0.0-beta และ 4.0.0-beta.2 ฉันไม่สามารถทำให้มันทำงานบน Mac ใน Chrome ได้ :(
rmcsharry

3

วิธีการแก้ไขที่ยอมรับแล้ว สิ่งที่ฉันมีประสบการณ์คือหลังจากที่ซ่อนป๊อปอัปบางคนพวกเขาจะต้องคลิกสองครั้งเพื่อแสดงอีกครั้ง นี่คือสิ่งที่ฉันทำเพื่อให้แน่ใจว่าไม่ได้มีการเรียกป๊อปอัพ ('ซ่อน') บนป๊อปอัปที่ซ่อนอยู่

$('body').on('click', function (e) {
    $('[data-original-title]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            var popoverElement = $(this).data('bs.popover').tip();
            var popoverWasVisible = popoverElement.is(':visible');

            if (popoverWasVisible) {
                $(this).popover('hide');
                $(this).click(); // double clicking required to reshow the popover if it was open, so perform one click now
            }
        }
    });
});


3

วิธีนี้ใช้ได้ผลดี:

$("body")   .on('click'     ,'[data-toggle="popover"]', function(e) { 
    e.stopPropagation();
});

$("body")   .on('click'     ,'.popover' , function(e) { 
     e.stopPropagation();
});

$("body")   .on('click'  , function(e) {
        $('[data-toggle="popover"]').popover('hide');
});


2

คุณยังสามารถใช้ bubbling เหตุการณ์เพื่อลบป๊อปอัปจาก DOM มันค่อนข้างสกปรก แต่ก็ใช้ได้ดี

$('body').on('click touchstart', '.popover-close', function(e) {
  return $(this).parents('.popover').remove();
});

ใน html ของคุณให้เพิ่ม. popover-close class ให้กับเนื้อหาภายใน popover ที่ควรปิด popover


2

ดูเหมือนว่าวิธีการ 'ซ่อน' จะไม่ทำงานหากคุณสร้างป๊อปโอเวอร์ด้วยการมอบหมายตัวเลือกคุณต้องใช้ 'ทำลาย' แทน

ฉันทำให้มันทำงานอย่างนั้น:

$('body').popover({
    selector: '[data-toggle="popover"]'
});

$('body').on('click', function (e) {
    $('[data-toggle="popover"]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            $(this).popover('destroy');
        }
    });
});

JSfiddle ที่นี่


2

เราพบว่าเรามีปัญหากับการแก้ปัญหาจาก @mattdlockyer (ขอบคุณสำหรับการแก้ปัญหา!) เมื่อใช้คุณสมบัติตัวเลือกสำหรับตัวสร้างป๊อปโอเวอร์เช่นนี้ ...

$(document.body').popover({selector: '[data-toggle=popover]'});

... โซลูชันที่เสนอสำหรับ BS3 ไม่ทำงาน แต่มันจะสร้างอินสแตนซ์ popover ที่สองภายในเครื่อง$(this)แทน นี่คือวิธีการแก้ปัญหาของเราเพื่อป้องกันไม่ให้:

$(document.body).on('click', function (e) {
    $('[data-toggle="popover"]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            var bsPopover = $(this).data('bs.popover'); // Here's where the magic happens
            if (bsPopover) bsPopover.hide();
        }
    });
});

ดังกล่าว$(this).popover('hide');จะสร้างอินสแตนซ์ที่สองเนื่องจากผู้ฟังที่ได้รับมอบหมาย วิธีการแก้ปัญหาที่มีให้เฉพาะป๊อปอัปที่ซ่อนอยู่ซึ่งมีอยู่แล้ว

ฉันหวังว่าฉันจะช่วยพวกคุณได้สักพัก


2

Bootstrap รองรับสิ่งนี้ :

การสาธิต JS Bin

มาร์กอัปเฉพาะที่จำเป็นสำหรับการยกเลิกการคลิกครั้งต่อไป

สำหรับเบราว์เซอร์ที่เหมาะสมและพฤติกรรมข้ามแพลตฟอร์มคุณต้องใช้<a>แท็กไม่<button>แท็กและคุณยังจะต้องมีrole="button"และtabindexแอตทริบิวต์


ใน bootstrap 4.0.0-beta และ 4.0.0-beta.2 ฉันไม่สามารถใช้งานบน Mac ใน Chrome ได้ :(
rmcsharry

เมื่อคลิกที่ใดก็ตามที่ปิดป๊อปโอเวอร์นี้ผู้ถามจะต้อง "คลิกที่ด้านนอกของปิดป๊อปอัป" ซึ่งแตกต่างกัน
philw

2

วิธีนี้จะกำจัดคลิกที่น่ารำคาญเมื่อแสดงป๊อปโอเวอร์เป็นครั้งที่สอง

ทดสอบกับ Bootstrap v3.3.7

$('body').on('click', function (e) {
    $('.popover').each(function () {
        var popover = $(this).data('bs.popover');
        if (!popover.$element.is(e.target)) {
            popover.inState.click = false;
            popover.hide();                
        }
    });
});

2

ฉันได้ลองคำตอบก่อนหน้านี้หลายคำตอบแล้วไม่ได้ผลจริงๆสำหรับฉัน แต่วิธีนี้ใช้ได้:

https://getbootstrap.com/docs/3.3/javascript/#dismiss-on-next-click

พวกเขาแนะนำให้ใช้ปุ่ม anchor tag not button และดูแล role = "button" + data-trigger = "focus" + tabindex = "0" คุณสมบัติ

Ex:

<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-toggle="popover" 
data-trigger="focus" title="Dismissible popover" data-content="amazing content">
Dismissible popover</a>

ลองอ้างอิงนี้ด้วย: stackoverflow.com/questions/20466903/…
Ahmed El Damasy

1

ฉันมากับสิ่งนี้: สถานการณ์ของฉันรวมป๊อปอัปมากขึ้นในหน้าเดียวกันและการซ่อนพวกมันทำให้พวกเขามองไม่เห็นและด้วยเหตุนั้นการคลิกที่รายการที่อยู่เบื้องหลังป๊อปโอเวอร์จึงไม่สามารถทำได้ แนวคิดคือการทำเครื่องหมายเฉพาะป๊อปโอเวอร์ลิงค์เป็น 'ใช้งานอยู่' จากนั้นคุณสามารถ 'สลับ' ป๊อปโอเวอร์ที่ใช้งานอยู่ การทำเช่นนี้จะปิดตัว popover อย่างสมบูรณ์ $ ('. popover-link'). popover ({html: true, container: 'body'})

$('.popover-link').popover().on 'shown.bs.popover', ->
  $(this).addClass('toggled')

$('.popover-link').popover().on 'hidden.bs.popover', ->
  $(this).removeClass('toggled')

$("body").on "click", (e) ->
  $openedPopoverLink = $(".popover-link.toggled")
  if $openedPopoverLink.has(e.target).length == 0
    $openedPopoverLink.popover "toggle"
    $openedPopoverLink.removeClass "toggled"

1

ฉันเพิ่งลบป๊อปอัปที่ใช้งานอยู่อื่นก่อนที่จะปรากฏป๊อปอัพใหม่ (bootstrap 3):

$(".my-popover").popover();

$(".my-popover").on('show.bs.popover',function () {
    $('.popover.in').remove();
});              

1

ทดสอบด้วย 3.3.6 และการคลิกครั้งที่สองก็โอเค

        $('[data-toggle="popover"]').popover()
            .click(function () {
            $(this).popover('toggle');
        });;

        $(document).on('click', function (e) {
            $('[data-toggle="popover"]').each(function () {
                //the 'is' for buttons that trigger popups
                //the 'has' for icons within a button that triggers a popup
                if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
                    $(this).popover('hide');
                }
            });
        });

0

ตัวอย่าง: http://jsfiddle.net/nessajtr/yxpM5/1/

var clickOver = clickOver || {};
clickOver.uniqueId = $.now();

clickOver.ClickOver = function (selector, options) {
    var self = this;

    //default values
    var isVisible, clickedAway = false;

    var callbackMethod = options.content;
var uniqueDiv = document.createElement("div");
var divId = uniqueDiv.id = ++clickOver.uniqueId;
uniqueDiv.innerHTML = options.loadingContent();

options.trigger = 'manual';
options.animation = false;
options.content = uniqueDiv;

self.onClose = function () {
    $("#" + divId).html(options.loadingContent());
    $(selector).popover('hide')
    isVisible = clickedAway = false;
};
self.onCallback = function (result) {
    $("#" + divId).html(result);
};

$(selector).popover(options);

//events
$(selector).bind("click", function (e) {
    $(selector).filter(function (f) {
        return $(selector)[f] != e.target;
    }).popover('hide');

    $(selector).popover("show");
    callbackMethod(self.onCallback);

    isVisible = !(clickedAway = false);
});

$(document).bind("click", function (e) {
    if (isVisible && clickedAway && $(e.target).parents(".popover").length == 0) {
        self.onClose();
        isVisible = clickedAway = false;
    } else clickedAway = true;
});

}

นี่คือทางออกของฉันสำหรับมัน


0

วิธีการนี้ช่วยให้มั่นใจว่าคุณสามารถปิดป๊อปโอเวอร์ได้โดยคลิกที่ใดก็ได้บนหน้า หากคุณคลิกที่เอนทิตีที่คลิกได้อื่นมันจะซ่อนป๊อปอัปอื่น ๆ ทั้งหมด ภาพเคลื่อนไหว: false เป็นสิ่งจำเป็นคุณจะได้รับข้อผิดพลาด jquery .remove ในคอนโซลของคุณ

$('.clickable').popover({
 trigger: 'manual',
 animation: false
 }).click (evt) ->
  $('.clickable').popover('hide')
  evt.stopPropagation()
  $(this).popover('show')

$('html').on 'click', (evt) ->
  $('.clickable').popover('hide')

0

ตกลงนี่เป็นความพยายามครั้งแรกของฉันที่จะตอบบางสิ่งบางอย่างเกี่ยวกับ stackoverflow ดังนั้นจึงไม่มีอะไร: P

ปรากฏว่ามันไม่ได้ค่อนข้างชัดเจนว่าการทำงานนี้ใช้งานได้จริงออกจากกล่องในบูตล่าสุด (ดีถ้าคุณยินดีที่จะประนีประนอมที่ผู้ใช้สามารถคลิก. ผมไม่แน่ใจว่าถ้าคุณจะต้องใส่ 'คลิก โฮเวอร์ 'ต่อ แต่ใน iPad คลิกทำงานเป็นสลับ

ผลลัพธ์ที่ได้คือบนเดสก์ท็อปคุณสามารถเลื่อนหรือคลิก (ผู้ใช้ส่วนใหญ่จะโฮเวอร์) บนอุปกรณ์สัมผัสการแตะองค์ประกอบจะนำมาขึ้นและการสัมผัสอีกครั้งจะนำมันลง แน่นอนว่านี่เป็นการประนีประนอมเล็กน้อยจากความต้องการดั้งเดิมของคุณ แต่อย่างน้อยตอนนี้โค้ดของคุณก็จะสะอาดขึ้น :)

$ (". my-popover"). popover ({trigger: 'click hover'});


0

ด้วยการใช้รหัสของ Matt Locky ฉันได้ทำการรีเซ็ตแบบง่าย ๆ เพื่อที่ dom จะไม่ถูกครอบคลุมโดยองค์ประกอบที่ซ่อนไว้

รหัสของแมตต์: http://mattlockyer.com/2013/04/08/close-a-twitter-bootstrap-popover-when-clicking-outside/

ซอ: http://jsfiddle.net/mrsmith/Wd2qS/

    $('body').on('click', function (e) {
    //hide popover from dom to prevent covering elements
    $('.popover').css('display', 'none');
    //bring popover back if trigger element is clicked
    $('[data-toggle="popover"]').each(function () {
        if ($(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            $('.popover').css('display', 'block');
        }
    });
    //hide popover with .popover method
    $('[data-toggle="popover"]').each(function () {
        //the 'is' for buttons that trigger popups
        //the 'has' for icons within a button that triggers a popup
        if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
            $(this).popover('hide');
        }
    });
});

0

ลองนี่สิมันจะซ่อนโดยคลิกที่ด้านนอก

$('body').on('click', function (e) {
    $('[data-toggle="popover"]').each(function () {
    //the 'is' for buttons that trigger popups
    //the 'has' for icons within a button that triggers a popup
    if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
    $(this).popover('hide');
    }
    });
});

0

ฉันมีปัญหากับวิธีแก้ปัญหาของ mattdlockyer เพราะฉันตั้งค่าลิงค์ popover แบบไดนามิกโดยใช้รหัสเช่นนี้

$('body').popover({
        selector : '[rel="popover"]'
});

ดังนั้นฉันต้องแก้ไขมันอย่างนั้น มันแก้ไขปัญหามากมายสำหรับฉัน:

$('html').on('click', function (e) {
  $('[data-toggle="popover"]').each(function () {
    //the 'is' for buttons that trigger popups
    //the 'has' for icons within a button that triggers a popup
    if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) {
        $(this).popover('destroy');
    }
  });
});

โปรดจำไว้ว่าการทำลายได้กำจัดองค์ประกอบดังนั้นส่วนตัวเลือกจึงมีความสำคัญในการเริ่มต้นป๊อปอัป

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.