ฉันจะผูกแถบเครื่องมือ Twitter Bootstrap กับองค์ประกอบที่สร้างขึ้นแบบไดนามิกได้อย่างไร


277

ฉันใช้ Twitter bootstrap tooltips กับ javascript ดังนี้:

$('a[rel=tooltip]').tooltip();

มาร์กอัปของฉันมีลักษณะดังนี้:

<a rel="tooltip" title="Not implemented" class="btn"><i class="icon-file"></i></a>

สิ่งนี้ใช้ได้ดี แต่ฉันเพิ่ม<a>องค์ประกอบแบบไดนามิกและเคล็ดลับเครื่องมือไม่แสดงขึ้นสำหรับองค์ประกอบแบบไดนามิกเหล่านั้น ฉันรู้ว่าเป็นเพราะฉันผูก. ทูลทิป () เพียงครั้งเดียวเมื่อเอกสารโหลดเสร็จด้วย$(document).ready(function()ฟังก์ชั่นjquery ทั่วไป

ฉันจะผูกสิ่งนี้กับองค์ประกอบที่สร้างขึ้นแบบไดนามิกได้อย่างไร ฉันมักจะทำสิ่งนี้ผ่านวิธีการ jquery live () อย่างไรก็ตามเหตุการณ์ที่ฉันใช้ผูกคืออะไร ฉันแค่ไม่แน่ใจว่าจะขอ bootstrap .tooltip () กับ jquery .live () ได้อย่างไร

ฉันพบวิธีหนึ่งที่จะทำให้งานนี้เป็นแบบนี้:

/* Add new 'rows' when plus sign is clicked */
$("a.add").live('click', function () {
    var clicked_li = $(this).parent('li');
    var clone = clicked_li.clone();

    clone.find(':input').each(function() {
        $(this).val('');
    });

    clicked_li.after(clone);
    $('a[rel=tooltip]').tooltip();
});

มันใช้งานได้ แต่ดูเหมือนแฮ็ค ฉันกำลังเรียกสายเดียวกัน .tooltip () เหมือนกันในการเรียก $ (พร้อม) ดังนั้นองค์ประกอบที่มีอยู่เมื่อหน้าแรกโหลดและจับคู่ตัวเลือกนั้นท้ายด้วยคำแนะนำเครื่องมือสองครั้ง?

ฉันไม่เห็นปัญหาใด ๆ กับวิธีการนี้ ฉันแค่มองหาวิธีปฏิบัติที่ดีที่สุดหรือความเข้าใจในพฤติกรรม


คำถามที่ดีอืมมันจะช่วยได้ไหม github.com/twitter/bootstrap/issues/2374
Tim

นั่นเป็นการอ่านที่น่าสนใจ แต่ฉันต้องการเพียงแค่คำแนะนำเครื่องมือชนิดเดียว ฉันแค่ต้องการให้แน่ใจว่าองค์ประกอบที่เพิ่มเข้ามาแบบไดนามิกที่ตรงกับตัวเลือกคำแนะนำเครื่องมือได้รับการเพิ่มซึ่งไม่ใช่กรณี
durden2.0

3
เป็นคำถามที่ดีมาก ดูเหมือนว่ามีการกำกับดูแลในส่วนของตัวสั่นด้วยความตื่นเต้น
ลุคที่คลุมเครือ

1
@ durden2.0 คริสเตียนตอบคำถามให้คุณได้อย่างไร สนใจที่จะยอมรับว่าถูกต้องหรือไม่
Ruslans Uralovs

3
ไม่เกี่ยวข้องกับคำถามของคุณ แต่ ... ฉันคิดว่ามันเป็นรูปแบบที่ไม่ถูกต้องที่จะจี้relคุณสมบัติ นี่ไม่ใช่ความหมายและมีต้นกำเนิดมานานกว่าทศวรรษที่ผ่านมาเป็นแฮ็ค ทุกวันนี้เบราว์เซอร์ทุกตัวกลับมาหลายปีรองรับdata-*คุณสมบัติและไม่มีเหตุผลที่จะไม่ใช้มัน
T Nguyen

คำตอบ:


513

ลองอันนี้:

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

4
ยิ่งใหญ่ นี่คือคำตอบที่ถูกต้องเพราะโดยพื้นฐานแล้วมันใช้แทน live / on
Mahn


5
สิ่งที่ฉันไม่ชอบเกี่ยวกับโซลูชันนี้คือคุณไม่สามารถมีคำแนะนำเครื่องมือหลายรายการ ตัวอย่างเช่นไม่สามารถใช้งานได้หากคุณมีเคล็ดลับเครื่องมือที่วางไว้ด้านบนและอื่น ๆ ที่อยู่ด้านล่าง
barbolo

7
@barbolo เพียงใช้ตัวเลือกที่แตกต่างกันสำหรับการกำหนดค่าที่แตกต่างกัน นี่คือทางออกที่ถูกต้อง Btw มันใช้ได้กับ Popover ด้วย
Enrico Carlesso

16
bootstrap 3 ใช้ $ ('body'). tooltip ({selector: '[data-toggle = tooltip]'});
MERT DOĞAN

148

หากคุณมีการกำหนดค่าเคล็ดลับเครื่องมือหลายอย่างที่คุณต้องการเริ่มต้นสิ่งนี้ใช้ได้ดีสำหรับฉัน

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

จากนั้นคุณสามารถตั้งค่าคุณสมบัติในแต่ละองค์ประกอบโดยใช้dataคุณสมบัติ


3
สุดยอดเคล็ดลับ ฉันต้องเปลี่ยนเป็น $ ("body") tooltip ({selector: '[data-toggle = "tooltip"]'});
Jafin

2
นี่คือวิธีที่ควรใช้กับ Bootstrap 3. เยี่ยมมาก!
น่ากลัว

ที่ดี! สำหรับใช้ภายในตารางเพิ่มคอนเทนเนอร์: 'ร่างกาย' เพื่อหลีกเลี่ยงความกว้างพิเศษ
shock_gone_wild

มันใช้งานได้ดีจริงๆ ฉันลองทั้งกลุ่มของสิ่งต่าง ๆ บนโต๊ะแบบไดนามิก แต่ไม่มีอะไรทำงานได้จริงจนถึงตอนนี้
AnBisw

ทำงานร่วมกับ Bootstrap 4 ได้เช่นกัน!
Eugene Kulabuhov

17

สำหรับฉันการจับเหตุการณ์ของ mouseenter นั้นค่อนข้างบั๊กและคำแนะนำเครื่องมือไม่แสดง / ซ่อนอย่างถูกต้อง ฉันต้องเขียนสิ่งนี้และตอนนี้มันทำงานได้อย่างสมบูรณ์แบบ:

$(document).on('mouseenter','[rel=tooltip]', function(){
    $(this).tooltip('show');
});

$(document).on('mouseleave','[rel=tooltip]', function(){
    $(this).tooltip('hide');
});

3
สิ่งนี้มีประโยชน์มากเมื่อเทียบกับเหตุผลว่าทำไม. on ('hover') จะไม่ทำงาน
อดัม

นี่คือทั้งหมดที่ฉันต้องใช้สำหรับการติดตั้ง handlebars.js หากฉันไม่ได้ใช้ handlebars.js คำตอบที่ยอมรับก็ใช้ได้เช่นกัน
HPWD

นี่คือวิธีที่ฉันใช้ในการทำเช่นนี้ แต่คุณสูญเสียตัวเลือกมากมายเช่นความล่าช้าในการเลื่อนที่คุณจะต้องใช้ด้วยตนเองกับสิ่งที่ฉันคิด
DavidScherer

16

ฉันโพสต์คำตอบนานกว่านี้ที่นี่: https://stackoverflow.com/a/20877657/207661

TL; DR: คุณต้องการโค้ดเพียงบรรทัดเดียวที่ทำงานในเอกสารพร้อมเหตุการณ์:

$(document.body).tooltip({ selector: "[title]" });

รหัสที่ซับซ้อนกว่าที่แนะนำในคำตอบอื่น ๆ นั้นไม่จำเป็น (ฉันได้ทดสอบด้วย Bootstrap 3.0)


1
นี่คือคำตอบที่ดีที่สุด
Chris Marisic

สิ่งนี้ใช้ได้กับกรณีของฉัน ฉันใช้ตารางที่มี Tablesorter 2.26.2 และค่าที่เติมผ่านการโทร Ajax ปัญหาคือว่าคำแนะนำเครื่องมือ HTML ถูกแสดงเป็นข้อความ HTML แทนที่จะแสดงผล นี่เป็นทางออกเดียวที่ใช้ได้สำหรับฉันในครั้งแรก +1 และขอบคุณมาก!
Anurag

8

สำหรับฉันแล้ว js นี้สร้างปัญหาเดียวกันกับPaola

ทางออกของฉัน:

$(document.body).tooltip({selector: '[title]'})
.on('click mouseenter mouseleave','[title]', function(ev) {
    $(this).tooltip('mouseenter' === ev.type? 'show': 'hide');
});

2

แทนที่จะค้นหาในเนื้อหาเต็ม หนึ่งสามารถใช้ตัวเลือกชื่อแบบไดนามิกที่มีอยู่แล้วในสถานการณ์เช่นนี้ฉันคิดว่า:

$btn.tooltip({
  title: function(){
    return $(this).attr('title');
  }
});

1

ฉันพบว่าการรวมกันของคำตอบเหล่านี้ให้ผลลัพธ์ที่ดีที่สุด - ช่วยให้ฉันยังคงวางคำแนะนำเครื่องมือและแนบกับภาชนะที่เกี่ยวข้อง:

$('body').on('mouseenter', '[rel=tooltip]', function(){
  var el = $(this);
  if (el.data('tooltip') === undefined) {
    el.tooltip({
      placement: el.data("placement") || "top",
      container: el.data("container") || false
    });
  }
  el.tooltip('show');
});

$('body').on('mouseleave', '[rel=tooltip]', function(){
  $(this).tooltip('hide');
});

HTML ที่เกี่ยวข้อง:

<button rel="tooltip" class="btn" data-placement="bottom" data-container=".some-parent" title="Show Tooltip">
    <i class="icon-some-icon"></i>
</button>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.