Làm cách nào để liên kết các công cụ Twitter Bootstrap với các yếu tố được tạo động?


277

Tôi đang sử dụng các chú giải công cụ bootstrap của Twitter với javascript như sau:

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

Đánh dấu của tôi trông như thế này:

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

Điều này hoạt động tốt, nhưng tôi thêm <a>các phần tử một cách linh hoạt và các chú giải công cụ không hiển thị cho các phần tử động đó. Tôi biết điều đó bởi vì tôi chỉ liên kết .tooltip () một lần khi tài liệu được tải xong với $(document).ready(function()chức năng jquery điển hình .

Làm thế nào tôi có thể liên kết này với các yếu tố được tạo động? Thông thường tôi sẽ làm điều này thông qua phương thức jquery live (). Tuy nhiên, sự kiện mà tôi sử dụng để ràng buộc là gì? Tôi chỉ không chắc chắn làm thế nào để kết nối bootstrap .tooltip () với jquery .live ().

Tôi đã tìm thấy một cách để làm cho công việc này là như thế này:

/* 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();
});

Điều này hoạt động, nhưng có vẻ như loại hackish. Tôi cũng đang gọi chính xác dòng .tooltip () trong lệnh gọi $ (sẵn sàng). Vì vậy, các yếu tố tồn tại khi trang tải lần đầu tiên và khớp với bộ chọn đó kết thúc với tooltip hai lần?

Tôi không thấy bất kỳ vấn đề với phương pháp này. Tôi chỉ đang tìm kiếm một thực tiễn tốt nhất hoặc sự hiểu biết về hành vi.


hmm câu hỏi tốt, điều này sẽ giúp? github.com/twitter/bootstrap/issues/2374
Tim

Đó là một bài đọc thú vị, nhưng tôi chỉ muốn một loại tooltip duy nhất. Tôi chỉ muốn đảm bảo mọi phần tử được thêm động phù hợp với bộ chọn chú giải công cụ được thêm vào, không phải vậy.
durden2.0

3
Câu hỏi tuyệt vời. Có vẻ như một trang web trên một phần của twitter.
Luke The Obscure

1
@ durden2.0 Làm thế nào các Kitô hữu trả lời làm việc cho bạn? Quan tâm để chấp nhận là chính xác?
Ruslans Uralovs

3
Không thực sự liên quan đến câu hỏi của bạn nhưng ... tôi thấy đó là phong cách xấu để chiếm đoạt relthuộc tính. Đây là phi ngữ nghĩa và có nguồn gốc từ một thập kỷ trước như là một hack. Ngày nay, mọi trình duyệt trở lại trong vài năm đều hỗ trợ data-*các thuộc tính và không còn lý do nào để không sử dụng chúng.
T Nguyễn

Câu trả lời:


513

Hãy thử cái này:

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

4
Tuyệt quá. Đây là câu trả lời đúng, vì về cơ bản, nó là sự thay thế của live / on.
Mahn


5
Điều tôi không thích ở giải pháp này là bạn không thể có nhiều cấu hình của các chú giải công cụ. Ví dụ, nó không hoạt động nếu bạn có các chú giải công cụ được đặt ở trên cùng và các công cụ khác được đặt ở phía dưới.
barbolo

7
@barbolo, chỉ cần sử dụng các bộ chọn khác nhau cho các cấu hình khác nhau. Đây là giải pháp đúng đắn. Btw, nó cũng hoạt động với Popover.
Enrico Carlesso

16
bootstrap 3 sử dụng $ ('body'). tooltip ({selector: '[data-toggle = tooltip]'});
Mert DOĞAN

148

Nếu bạn có nhiều cấu hình tooltip mà bạn muốn khởi tạo, điều này hoạt động tốt với tôi.

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

Sau đó, bạn có thể đặt thuộc tính trên các thành phần riêng lẻ bằng datacác thuộc tính.


3
Mẹo tuyệt vời. Tôi đã phải đổi nó thành $ ("body"). Tooltip ({selector: '[data-toggle = "tooltip"]'});
Jafin

2
Đây là cách nó nên có với Bootstrap 3. Tuyệt vời!
nghiệt ngã

tuyệt quá! để sử dụng bên trong bảng thêm thùng chứa: 'cơ thể' để tránh chiều rộng thêm.
shock_gone_wild

Điều này hoạt động thực sự tốt. Tôi đã thử cả đống thứ trên một cái bàn động nhưng không có gì thực sự hiệu quả cho đến lúc này.
AnBisw

Hoạt động với Bootstrap 4 là tốt!
Eugene Kulabuhov

17

Đối với tôi, chỉ bắt sự kiện mouseenter là một lỗi nhỏ và tooltip không hiển thị / ẩn đúng cách. Tôi đã phải viết cái này và nó đang hoạt động hoàn hảo:

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

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

3
Điều này rất hữu ích cho việc tại sao .on ('hover') sẽ không hoạt động đúng.
Adam

Đây là tất cả những gì tôi cần để sử dụng cho việc triển khai sử dụng handlebars.js. Nếu tôi không sử dụng handlebars.js, câu trả lời được chấp nhận cũng hoạt động.
HPWD

Đây là cách tôi đã từng làm điều này nhưng bạn mất rất nhiều tùy chọn như độ trễ di chuột mà bạn sẽ cần phải thực hiện thủ công với điều này tôi nghĩ.
DavidScherer

16

Tôi đã đăng câu trả lời dài hơn tại đây: https://stackoverflow.com/a/20877657/207661

TL; DR: Bạn chỉ cần một dòng mã chạy trong sự kiện sẵn sàng tài liệu:

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

Mã phức tạp khác được đề xuất trong các câu trả lời khác dường như không cần thiết (Tôi đã thử nghiệm điều này với Bootstrap 3.0).


1
Đây là câu trả lời tốt nhất.
Chris Marisic

Điều này làm việc cho trường hợp của tôi. Tôi đã sử dụng một bảng với Tableorter 2.26.2 và các giá trị được điền thông qua lệnh gọi Ajax. Vấn đề là tooltip html được hiển thị dưới dạng văn bản HTML thay vì đầu ra được hiển thị. Đây là giải pháp duy nhất làm việc cho tôi trong lần đầu tiên. +1 và cảm ơn rất nhiều!
Anurag

8

Đối với tôi, js này tái tạo cùng một vấn đề xảy ra với Paola

Giải pháp của tôi:

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

2

Thay vì tìm kiếm nó trong toàn bộ cơ thể. Người ta chỉ có thể sử dụng tùy chọn tiêu đề động đã có sẵn trong các tình huống như vậy tôi nghĩ:

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

1

Tôi đã tìm thấy một sự kết hợp của những câu trả lời này cho tôi kết quả tốt nhất - cho phép tôi vẫn định vị được chú giải công cụ và gắn nó vào thùng chứa có liên quan:

$('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 có liên quan:

<button rel="tooltip" class="btn" data-placement="bottom" data-container=".some-parent" title="Show Tooltip">
    <i class="icon-some-icon"></i>
</button>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.