Các công cụ jQueryUI đang cạnh tranh với Twitter Bootstrap


141

Tôi đã có thể nhận được một số mẹo công cụ để làm việc cuối cùng với mã sau đây:

<a href="#" rel="tooltip" title="Tool tip text here">Hover over me</a>

và sau đó

<script>
    $('[rel=tooltip]').tooltip();
</script>

Vấn đề tôi gặp phải là nó đang sử dụng các tooltips jQueryUI (không có mũi tên, các tooltips xấu xí lớn) thay vì Bootstraps.

Tôi cần làm gì để sử dụng Bootstrap Tooltips thay vì jQueryUI?


bạn cần phải có cả hai thứ?
Matt

Không ... Tôi chỉ muốn có các công cụ Bootstrap.
markdotnet

xin lỗi, ý tôi là bạn cần phải có jquery ui VÀ bootstrap?
Matt

1
Điều này làm việc cho tôi, kiểm tra câu trả lời
Poncho

1
@markdotnet: không chính xác. Bootstrap yêu cầu thư viện JQuery cốt lõi, không phải JQuery.UI.
Ian Kemp

Câu trả lời:


191

Cả jQuery UI và Bootstrap đều sử dụng tooltipcho tên của plugin. Sử dụng $.widget.bridgeđể tạo một tên khác cho phiên bản UI UI và cho phép plugin Bootstrap giữ nguyên tên tooltip (cố gắng sử dụng noConflicttùy chọn trên tiện ích Bootstrap chỉ dẫn đến rất nhiều lỗi vì nó không hoạt động chính xác; vấn đề này đã được báo cáo ở đây ):

// Resolve name collision between jQuery UI and Twitter Bootstrap
$.widget.bridge('uitooltip', $.ui.tooltip);

Vì vậy, mã để làm cho nó hoạt động:

// Import jQuery UI first
<script src="/js/jquery-ui.js"></script>
// Resolve name collision between jQuery UI and Twitter Bootstrap
$.widget.bridge('uitooltip', $.ui.tooltip);
// Then import bootstrap
<script src="js/bootstrap.js"></script>

Mã sao chép đẹp cũng xử lý xung đột nút:

<script type="application/javascript" src="/js/jquery.js"></script>
<script type="application/javascript" src="/js/jquery-ui.js"></script>
<script>
/*** Handle jQuery plugin naming conflict between jQuery UI and Bootstrap ***/
$.widget.bridge('uibutton', $.ui.button);
$.widget.bridge('uitooltip', $.ui.tooltip);
</script>
<script type="application/javascript" src="/js/bootstrap.js"></script>

1
Tôi nhận được một lỗi js khi tôi thử điều này. 'undefined' is not an object (evaluating '$.widget.bridge')
covard

2
covar - bạn có chắc chắn rằng bạn đã nhập tất cả các tập lệnh src không? Và bạn đang sử dụng các phiên bản mới hơn của libs?
Demz

1
@covard: Điều quan trọng là trước tiên bạn nhập jquery-ui, sau đó thực hiện bridge, sau đó nhập bootstrap.
Joshua Muheim

2
một giải pháp là một nỗi đau nếu bạn có tất cả mọi thứ được bó lại và rút gọn .. không có cách nào để đặt tập lệnh này vào giữa bằng cách nào đó .. chết tiệt, tên va chạm rác.
Piotr Kula

2
nếu bạn đang sử dụng các gói webpack với mã được rút gọn, bạn chỉ cần đặt jquery-ui trước bootstrap.js
Raj

69

Một giải pháp đơn giản là tải bootrap.js sau jquery-ui.js, để phương thức bootstrap .tooltip được ưu tiên.


2
Điều này làm việc cho tôi và là cách dễ nhất. Tôi khuyên bạn nên thêm một nhận xét HTML nói rằng một thư viện phải được tải sau thư viện kia.
Paul

1
Một ngày nào đó bạn sẽ thiếu biểu tượng gần gũi trong các hộp thoại bằng cách sử dụng phương pháp như vậy. stackoverflow.com/questions/17367736/
Mạnh

Giải pháp này không hiệu quả với tôi. Sử dụng Chrome, tôi sẽ "xóa bộ nhớ cache và làm mới cứng" trang và tooltip đôi khi sẽ hoạt động và sau đó đôi khi không (không có lỗi trong console.log). Làm mới 30 lần kết quả làm việc 7 lần. Sau đó tôi đã đi và tải xuống gói UI UI tùy chỉnh và bây giờ khi tôi "xóa bộ nhớ cache và làm mới cứng" 30 lần, tôi nhận được kết quả làm việc 30 lần với 0 lỗi. Tôi cũng sẽ thêm rằng tôi đang sử dụng allow.js để tôi có thể dễ dàng kiểm soát thứ tự các thư viện được tải.
HPWD

Tôi yêu bạn vì cách khắc phục logic đơn giản nhất này
Milind

30

Điều này làm việc cho tôi:

Nếu bạn cần sử dụng JQuery-UI nhưng bạn muốn sử dụng tooltip của bootstrap, chỉ cần lấy phiên bản JQuery-UI tùy chỉnh từ trang web này .

Chỉ cần bỏ chọn tùy chọn "Tooltip" và tải xuống (nó sẽ giống như "jquery-ui-1.10.4.custom.js").

Chỉ cần thêm nó vào dự án của bạn thay vì phiên bản bạn hiện đang sử dụng và, bạn đã sẵn sàng tham gia tiệc tùng. Điều này sẽ tránh xung đột. Nó làm việc như một cơ duyên với tôi!


1
Vì vậy, bạn vẫn tải xuống các tệp tài sản từ mỗi bên mỗi tay thay vì sử dụng một công cụ như bower? Làm thế nào để bạn cài đặt thư viện bên thứ ba nói chung? Tìm kiếm trong google và tải nó từ trang web nào?
user3746259

làm thế nào về tôi không muốn sử dụng bootstrap tooltip nhưng thay vào đó là UI .. chúng là những nguyên nhân gây ra vấn đề.
Piotr Kula

2
Đơn giản, dễ dàng, làm việc tuyệt vời cho tình huống của tôi. Cảm ơn bạn! +1
Chris Kempen

Làm việc cho tôi - đã thực sự đập đầu tôi về điều này - cộng với một - cảm ơn bạn
gchq

Câu trả lời hợp lý nhất, miễn là nó chỉ đề xuất các chức năng cần thiết. Cảm ơn
Oleksii Kyslytsyn

30

Trong trường hợp bạn phải tải jquery-ui.jssau bootstrap.jsđây là cách thực hiện:

<script type="application/javascript" src="/js/jquery.js"></script>
<script type="application/javascript" src="/js/bootstrap.js"></script>

<script>var _tooltip = jQuery.fn.tooltip;</script>
<script type="application/javascript" src="/js/jquery-ui.js"></script>
<script>jQuery.fn.tooltip = _tooltip;</script>

Điều này sẽ ghi đè lên tooltip của jquery-ui và luôn sử dụng bootstraps.


1
trong giải pháp của bạn, tooltip sẽ bị ghi đè bằng bootstrap nhưng nếu bất kỳ cơ quan nào không muốn ghi đè thì phải sử dụng giải pháp trước đó
Projesh Pal

Một ngày nào đó bạn sẽ thiếu biểu tượng gần gũi trong các hộp thoại bằng cách sử dụng phương pháp như vậy. stackoverflow.com/questions/17367736/
Mạnh

giải pháp tuyệt vời!
Ivan Ferrer

18

Giả sử rằng UI sẽ được gọi sau khi khởi động bootrap

Lưu trữ chức năng bootstrap ngay trước khi UI được khởi tạo

jQuery.fn.bstooltip = jQuery.fn.tooltip; 

Sau đó gọi nó như sau

$('.targetClass').bstooltip();

Cách chính thức $.fn.bstooltip = $.fn.tooltip.noConflict();
Igor Jerosimić

9

Giải pháp này dường như làm việc tốt cho tôi.

// handle jQuery plugin naming conflict between jQuery UI and Bootstrap
$.widget.bridge('uibutton', $.ui.button);
$.widget.bridge('uitooltip', $.ui.tooltip);

9

Thay vào đó, chỉ sử dụng popst Bootstrap thì sao? Các popovers BS không tạo ra xung đột tương tự mặc dù chúng yêu cầu cùng một thành phần tooltip.js. Đúng, chúng được cách điệu hơn nhưng không làm cho các nút UI JQuery của tôi trở nên khó khăn.

Tôi chỉ sử dụng Giao diện người dùng Jquery cho tự động hoàn thành / hộp tổ hợp tùy chỉnh (vì vậy không thể yêu cầu các điều khiển JQ-UI khác đều ổn) và không có cách nào ở trên để khắc phục sự cố CSS trên các nút của hộp tổ hợp trở thành "không bị chặn" khi gọi BS Tooltips. Chuyển sang BS Popovers cung cấp về cơ bản cùng một hiệu ứng không có xung đột, không sắp xếp lại nhập khẩu tập lệnh của tôi và không cần câu lệnh cầu nối rõ ràng.


3
Như thế này, rất thực dụng
Mark Stratmann

Cảm ơn vì tiền boa, tôi đồng ý, đó là một cách giải quyết tránh mọi sự phức tạp.
Tom

Ja man, dis one giải quyết tất cả những cơn ác mộng và nhìn shweet như một quả chanh!
Piotr Kula

Không popovers yêu cầu tooltip là preq req?
MrKobayashi

3

hãy thử sử dụng jQuery.noConflict () và xem điều đó có giúp ích gì cho bạn không. Có vẻ như bootstrap và jQuery đang sử dụng cùng một không gian tên và có lẽ các công cụ bootstrap và jQuery được tải vào cùng một hàm hoặc trước tiên chúng sẽ được tải.

Bạn cũng có thể kiểm tra xem thư viện nào được tải trước. Thông thường nếu bạn khai báo cùng một chức năng hai lần trong javascript thì cái thứ hai là cái được sử dụng.

Thứ ba, kiểm tra gói jQueryUI ( trên trang web của họ) và xem liệu bạn có thể tải xuống phiên bản không có chú giải công cụ đi kèm không (tôi đã kiểm tra và điều này hoàn toàn có thể thực hiện được).


Vì vậy, điều này thật kỳ lạ ... Tôi đang tải các thư viện javascript theo cùng một thứ tự nhưng khi gặp sự cố, tôi đã tải thư viện jquery-ui trước thẻ <body> và bootstrap.js sau tất cả nội dung của tôi. Tôi đã di chuyển bootstrap.js phía trên nội dung của mình (nhưng vẫn sau jquery-ui.js) và bây giờ nó hiển thị các chú giải công cụ như tôi mong đợi. Tôi hy vọng điều này không làm xáo trộn vũ trụ của trang web của tôi. Tôi nghĩ rằng đó là cách tốt nhất để tải javascript mà bạn có thể sau nội dung vì lý do hiệu suất ... kỳ lạ.
markdotnet

đó là thực hành tốt nhất. Có lẽ bootstrap cần phải đứng đầu?
Matt

Bootstrap JS chắc chắn không cần phải ở đầu trang.
Paul Phillips

3

Có một giải pháp dễ dàng và tốt, chỉ cần sắp xếp lại liên kết tệp bootstrap và jquery ui của bạn như thế này:

 <script src="/js/jquery-ui.min.js" type="text/javascript"></script>
 <script src="/js/bootstrap.min.js" type="text/javascript"></script>

Chỉ cần tải jQueryui trước khi tải tập tin js boostrap. Đó là công việc của tôi.


1
Một ngày nào đó bạn sẽ thiếu biểu tượng gần gũi trong các hộp thoại bằng cách sử dụng phương pháp như vậy. stackoverflow.com/questions/17367736/
Mạnh

nó sẽ ghi đè tất cả các thuộc tính phổ biến của ui với bootstrap min và không thể sử dụng cả hai nếu cần
Projesh Pal

1

Một cách dễ dàng là tải bootstrap.js sau jquery-ui.js, để bootstrap .tooltip ghi đè lên giao diện người dùng jquery. Nếu bạn đang sử dụng trình tải mô-đun như requestjs, thì bạn có thể đặt bootstrap phụ thuộc vào jquery-ui, như sau:

requirejs.config({
    baseUrl: 'js',
    waitSeconds: 30,
    shim: {
        'bootstrap': {
            deps: [ 'jquery', 'jquery-ui' ]
        },...
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.