เปลี่ยนเนื้อหาเคล็ดลับเครื่องมือ Bootstrap เมื่อคลิก


224

ฉันมีคำแนะนำเครื่องมือในองค์ประกอบสมอที่ส่งคำขอ AJAX เมื่อคลิก องค์ประกอบนี้มีเคล็ดลับเครื่องมือ (จาก Twitter Bootstrap) ฉันต้องการให้เนื้อหาคำแนะนำเครื่องมือเปลี่ยนเมื่อคำขอ AJAX ส่งคืนสำเร็จ ฉันจะจัดการเคล็ดลับเครื่องมือหลังจากเริ่มต้นได้อย่างไร

คำตอบ:


411

เพิ่งพบสิ่งนี้ในขณะที่อ่านซอร์สโค้ด ดังนั้น$.tooltip(string)เรียกฟังก์ชั่นใด ๆ ภายในTooltipชั้นเรียน และถ้าคุณดูTooltip.fixTitleมันดึงdata-original-titleคุณลักษณะและแทนที่ค่าชื่อด้วย

ดังนั้นเราก็ทำ:

$(element).tooltip('hide')
          .attr('data-original-title', newValue)
          .tooltip('fixTitle')
          .tooltip('show');

และแน่นอนว่ามันจะอัปเดตชื่อซึ่งเป็นค่าภายในคำแนะนำเครื่องมือ

วิธีอื่น (ดู @lukmdo แสดงความคิดเห็นด้านล่าง):

$(element).attr('title', 'NEW_TITLE')
          .tooltip('fixTitle')
          .tooltip('show');

5
ขอบคุณ! สิ่งนี้ทำให้งุนงงเป็นเวลาหนึ่งชั่วโมง
ทวิก

160
หรือสั้นกว่า (เรียบเนียนกว่า)$(element).attr('title', 'NEW_TITLE').tooltip('fixTitle').tooltip('show');
lukmdo

5
นอกจากนี้คุณยังสามารถเปลี่ยนชื่อผ่านคุณสมบัติ data '' tooltip ') ดูstackoverflow.com/questions/10181847/…
James McMahon

4
ไม่พบเอกสารใน 'fixTitle' ดังนั้นฉันคิดว่าไม่ควรใช้สิ่งนี้! ...
2846569

16
อันนี้ไม่ได้ผลสำหรับฉันคำแนะนำเครื่องมือเปลี่ยนค่าแล้วหายไปอย่างรวดเร็ว $(element).attr('data-original-title', newValue).tooltip('show');เป็นวิธีการทำงานที่ง่ายที่สุดสำหรับฉัน
Gabe O'Leary

98

ใน Bootstrap 3 มันก็เพียงพอแล้วที่จะเรียกelt.attr('data-original-title', "Foo")เป็นการเปลี่ยนแปลงใน"data-original-title"แอ็ตทริบิวต์ที่ทริกเกอร์การเปลี่ยนแปลงในการแสดงคำแนะนำเครื่องมือ

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

elt.attr('data-original-title', "Foo").tooltip('show');

5
คำตอบที่สะอาดทำไมไม่มี ups: <
ays0110

3
ไม่ใช้การเปลี่ยนแปลงในทันทีคุณจะต้องวางเม้าส์และเป้าหมายวางเมาส์เพื่อดูข้อความใหม่
Lev Lukomsky

9
นี่เป็นคำตอบที่ดีที่สุดและคุณสามารถเพิ่ม.tooltip('show');เพื่อให้มันแสดงหลังจากการอัปเดต
Jared

นี่เป็นทางออกเดียวเท่านั้น (จากการทดลองหลายครั้ง) ที่ดูเหมือนจะใช้งานได้ (bs3) ทางออกที่ดีแน่นอน!
jyoseph

3
วิธีนี้ดีกว่าโซลูชันอื่นทั้งหมด
Ayyaz Zafar

14

คุณสามารถอัปเดตข้อความคำแนะนำเครื่องมือโดยไม่เรียก show / hide:

$(myEl)
    .attr('title', newTitle)
    .tooltip('fixTitle')
    .tooltip('setContent')

3
สิ่งนี้.tooltip('show')จบลงที่โซ่เพื่อฉัน
markau

1
ใช่setContentและshowทำเคล็ดลับ! คุณสามารถเปลี่ยนdata-original-titleได้โดยตรงแทนการใช้fixTitle
brauliobo

ทดสอบบน Bootstrap v2.3.1
Ricardo

13

นี่เป็นทางออกที่ดีถ้าคุณต้องการเปลี่ยนข้อความโดยไม่ปิดและเปิดคำแนะนำเครื่องมืออีกครั้ง

$(element).attr('title', newTitle)
          .tooltip('fixTitle')
          .data('bs.tooltip')
          .$tip.find('.tooltip-inner')
          .text(newTitle)

ด้วยวิธีนี้ข้อความถูกแทนที่โดยไม่ต้องปิดคำแนะนำเครื่องมือ (ไม่เปลี่ยนตำแหน่ง แต่ถ้าคุณทำคำเดียวเปลี่ยน ฯลฯ ก็ควรจะปรับ) และเมื่อคุณโฮเวอร์ off + back บนทูลทิปมันยังคงได้รับการอัปเดต

** นี่คือ bootstrap 3 สำหรับ 2 คุณอาจต้องเปลี่ยนชื่อข้อมูล / คลาส


5
กล่าวว่า$tipไม่ใช่คุณลักษณะของ$(element)
Augustin Riedinger

ทำอย่างนั้น:$(element).attr('title', newTitle).tooltip('fixTitle').parent().find('.tooltip .tooltip-inner').text(newTitle);
Augustin Riedinger

ฉันกำลังอัปเดตคำแนะนำเครื่องมือในองค์ประกอบใกล้เคียงเมื่อพิมพ์ลงในช่องข้อความและคำแนะนำเครื่องมือจะหายไปสำหรับฉันด้วยรหัสนี้เมื่อฉันกดปุ่ม
tremby

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

13

สำหรับ Bootstrap 4:

$(element).attr("title", "Copied!").tooltip("_fixTitle").tooltip("show").attr("title", "Copy to clipboard").tooltip("_fixTitle");

3
สิ่งนี้ใช้ API ที่ไม่มีเอกสาร ระวัง.
Chloe

9

ใช้งานได้หากคำแนะนำเครื่องมือได้รับการยกตัวอย่าง (อาจเป็นจาวาสคริปต์):

$("#tooltip_id").data('tooltip').options.title="New_value!";
$("#tooltip_id").tooltip('hide').tooltip('show');

7
ด้วย bootstrap 3 มันจะกลายเป็น$('#tooltip_id').data('bs.tooltip').options.title = 'New_value!';
ajbeaven

เฮ้สัมพันธ์คุณสามารถเปลี่ยนคำตอบของคุณเพื่อสะท้อนการแก้ไขความคิดเห็น? ขอบคุณ
yeliha

7

สำหรับ bootstrap 3.x

ดูเหมือนว่าวิธีการแก้ปัญหาที่สะอาดที่สุด:

$(element)
  .attr('data-original-title', 'New title').tooltip('show')

แสดงใช้เพื่ออัปเดตชื่อทันทีและไม่รอให้คำแนะนำเครื่องมือถูกซ่อนและแสดงอีกครั้ง


7

นี่คือการอัปเดตสำหรับBootstrap 4 :

var title = "Foo";
elt.attr('data-original-title', title);
elt.tooltip('update');
elt.tooltip('show');

แต่วิธีที่ดีที่สุดคือทำสิ่งนี้:

var title = "Foo";
elt.attr('title', title);
elt.attr('data-original-title', title);
elt.tooltip('update');
elt.tooltip('show');

หรือแบบอินไลน์:

var title = "Foo";
elt.attr('title', title).attr('data-original-title', title).tooltip('update').tooltip('show');

จากด้าน UX คุณเพียงแค่เห็นข้อความที่มีการเปลี่ยนแปลงไม่มีผลซีดจางหรือซ่อน / _fixTitleแสดงและมีความต้องการไม่มี



6

Bootstrap 4

$('#topic_1').tooltip('dispose').tooltip({title: 'Goodbye'}).tooltip('show')

https://getbootstrap.com/docs/4.1/components/tooltips/#tooltipdispose

$('#topic_1').tooltip({title: 'Hello'}).tooltip('show');
setTimeout( function() {
  $('#topic_1').tooltip('dispose').tooltip({title: 'Goodbye'}).tooltip('show');
}, 5000);
#topic_1 {
  border: 1px solid red;
  margin: 50px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
  <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/js/bootstrap.min.js" integrity="sha384-o+RDsa0aLu++PJvFqy8fFScvbHFLtbvScb8AjopnFD+iEQ7wo/CG0xlczd+2O/em" crossorigin="anonymous"></script>

<div id="topic_1">Topic 1</div>


4

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

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

function updateTooltip(element, tooltip) {
    if (element.data('tooltip') != null) {
        element.tooltip('hide');
        element.removeData('tooltip');
    }
    element.tooltip({
        title: tooltip
    });
}

1
คำตอบที่ดีที่สุดสำหรับคำถามนี้
Daniel Miliński

@ DanielMilińskiขอบคุณ :)
aknuds1

1
หากคุณใช้ boostrap3 คุณต้องใช้data('bs.tooltip')แทนdata('tooltip')
Nigel Angel

3

ใน bootstrap 4 ฉันใช้$(el).tooltip('dispose');แล้วสร้างใหม่ตามปกติ ดังนั้นคุณสามารถวางการกำจัดทิ้งไว้ก่อนหน้าที่จะสร้างคำแนะนำเครื่องมือเพื่อให้แน่ใจว่ามันจะไม่เพิ่มขึ้นเป็นสองเท่า

การตรวจสอบสถานะและคนจรจัดด้วยค่าดูเป็นมิตรน้อยกว่า


เราควรเรียก $ (el) .tooltip ('ทิ้ง') ก่อนหรือหลังการอัพเดทชื่อคำแนะนำเครื่องมือ?
Fifi

@imabot กำจัดคำแนะนำเครื่องมือเก่าแล้วสร้างข้อมูลใหม่ หากเคล็ดลับเครื่องมือของคุณซับซ้อนคุณอาจต้องการดึงข้อมูลหรือจัดเก็บการกำหนดค่าเริ่มต้นเพื่อให้คุณสามารถสร้างใหม่ด้วยการกำหนดค่าใหม่ + ค่าใหม่ หวังว่าเหมาะสม
Martin Lyne

2

คุณสามารถตั้งค่าเนื้อหาในการโทรคำแนะนำเครื่องมือด้วยฟังก์ชั่น

        $("#myelement").tooltip({
            "title": function() {
                return "<h2>"+$("#tooltipcontainer").html()+"</h2>";
            }
        });

คุณไม่จำเป็นต้องใช้ชื่อเฉพาะขององค์ประกอบที่เรียกว่า


2

ขอบคุณรหัสนี้มีประโยชน์มากสำหรับฉันฉันพบว่ามันมีประสิทธิภาพในโครงการของฉัน

$(element).attr('title', 'message').tooltip('fixTitle').tooltip('show');


1

ทำลายคำแนะนำเครื่องมือที่มีอยู่แล้วเพื่อให้เราสามารถ repopulate ด้วยเนื้อหาคำแนะนำเครื่องมือใหม่

$(element).tooltip("destroy");    
$(element).tooltip({
    title: message
});

1

ฉันไม่สามารถหาคำตอบใด ๆ ได้เลยนี่เป็นวิธีแก้ไข:

$('#'+$(element).attr('aria-describedby')+' .tooltip-inner').html(newTitle);

0

ฉันคิดว่าเมห์เม็ตดูแรนเกือบจะถูก แต่มีปัญหาบางอย่างเมื่อใช้หลายคลาสพร้อมกับคำแนะนำเครื่องมือเดียวกันและการจัดวาง รหัสต่อไปนี้ยังช่วยหลีกเลี่ยงข้อผิดพลาดในการตรวจสอบ js หากมีคลาสใดที่เรียกว่า "tooltip_class" หวังว่านี่จะช่วยได้

if (jQuery(".tooltip_class")[0]){    

        jQuery('.tooltip_class')
            .attr('title', 'New Title.')
            .attr('data-placement', 'right')
            .tooltip('fixTitle')
            .tooltip('hide');

    }

0

เปลี่ยนข้อความโดยการแก้ไขข้อความในองค์ประกอบโดยตรง (ไม่อัปเดตตำแหน่งเคล็ดลับเครื่องมือ)

$('.tooltip-inner', $element.next()).html(newHtml);
$('.tooltip-inner', $element.next()).text(newText);

เปลี่ยนข้อความโดยทำลายคำแนะนำเครื่องมือเก่าจากนั้นสร้างและแสดงเครื่องมือใหม่ (ทำให้อันเก่าจางหายไปและอันใหม่จะจางหายไป)

$element
.tooltip('destroy')
.tooltip({
    // Repeat previous options.
    title: newText,
})
.tooltip('show');

ฉันใช้วิธีการอันดับต้น ๆ ในการ "บันทึก" ข้อความ (การใช้&nbspดังนั้นคำแนะนำเครื่องมือจะไม่เปลี่ยนแปลงขนาด) และเพื่อเปลี่ยนข้อความเป็น "เสร็จสิ้น" (บวก padding) เมื่อคำขอเสร็จสมบูรณ์

$element.tooltip({
  placement: 'left',
  title: 'Saving...',
  trigger: 'manual',
}).tooltip('show');

var parent = $element.parent();
var interval_id = setInterval(function(){
    var text = $('.tooltip-inner', parent).html();
    switch(text) {
    case 'Saving.&nbsp;&nbsp;': text = 'Saving..&nbsp;'; break;
    case 'Saving..&nbsp;': text = 'Saving...'; break;
    case 'Saving...': text = 'Saving.&nbsp;&nbsp;'; break;
    }
    $('.tooltip-inner', parent).html(text);
}, 250);

send_request( function(){
    // When the request is complete
    clearInterval(interval_id);
    $('.tooltip-inner', parent).html('Done.&nbsp;&nbsp;&nbsp;&nbsp;');
    setTimeout(function() {
        $element.tooltip('hide');
    }, 1500 /* Show "Done." for a bit */);
});

0

สิ่งนี้ใช้ได้สำหรับฉัน: (bootstrap 3.3.6; jquery = 1.11.3)

<a id="alertTooltip" href="#" data-html="true" class="tooltip" data-toggle="tooltip" title="Tooltip message"></a>

<script>
  $('#alertTooltip').attr('title', "Tooltip new <br /> message").tooltip('fixTitle');
</script>

คุณลักษณะdata-html="true"อนุญาตให้ใช้ html บนชื่อคำแนะนำเครื่องมือ


0

ด้วย Tooltip วัตถุ Boostrap:

$(element).attr('data-original-title', 'New value');
$(element).data('bs.tooltip').tip().find('.tooltip-inner').text('New value');

0

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

$('[data-toggle="tooltip"]').tooltip({
  trigger: 'hover'
}).on('shown.bs.tooltip', function() {
  var link = $(this);
  var data = '';
  data += '<ul style="list-style-type:none;margin:0;padding:0;text-align:left;font-size:12px">';
  data += '	<li>Sherif Salah</li>';
  data += '	<li>Muhammad Salah</li>';
  data += '	<li>and a gazillion more...</li>';
  data += '</ul>';
  link.attr('data-original-title', data);
  setTimeout(function() {
    if (link.is(':hover')) {
      link.tooltip("dispose").tooltip("show");
    }
  }, 1000);
});
<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" />
</head>

<body>
  <div class="card">
    <div class="card-body text-center">
      <a href="JavaScript:void(0);" class="btn btn-sm btn-link" data-toggle="tooltip" data-placement="top" data-html="true" title="Loading...">gazillion</a>
    </div>
  </div>
  <script src="https://code.jquery.com/jquery-3.2.1.slim.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>
</body>

</html>


0

ฉันทดสอบสิ่งนี้เฉพาะในbootstrap 4 & w / o การโทร. show ()

el.tooltip('hide').attr('data-original-title', 'message');

-1

คุณสามารถใช้รหัสนี้เพื่อซ่อนเคล็ดลับเครื่องมือเปลี่ยนชื่อและแสดงคำแนะนำเครื่องมืออีกครั้งเมื่อคำขอ ajax ส่งคืนสำเร็จ

$(element).tooltip('hide');
$(element).attr('title','this is new title');
$(element).tooltip('fixTitle');
setTimeout(function() {  $(element).tooltip('show');}, 500);


-1
$(this).attr('data-original-title', 'click here to publish')
       .tooltip('fixTitle')
       .tooltip('show');

มีประโยชน์หากคุณต้องการเปลี่ยนข้อความของคำแนะนำเครื่องมือหลังจากเริ่มต้นด้วย attr 'data-original-title'

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