jQueryUI Tooltips konkuruje z Twitter Bootstrap


141

Udało mi się uzyskać kilka wskazówek dotyczących narzędzi, aby w końcu pracować z następującym kodem:

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

i wtedy

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

Problem polega na tym, że używa on podpowiedzi jQueryUI (bez strzałek, duże brzydkie podpowiedzi) zamiast Bootstrapów.

Co muszę zrobić, aby korzystać z etykiet narzędzi Bootstrap zamiast jQueryUI?


czy musisz mieć obie rzeczy?
Matt

Nie ... Chciałbym tylko mieć podpowiedzi Bootstrap.
markdotnet

przepraszam, chodziło mi o to, czy musisz mieć jquery ui i bootstrap?
Matt

1
To zadziałało dla mnie, sprawdź tę odpowiedź
Poncho

1
@markdotnet: niepoprawne. Bootstrap wymaga podstawowej biblioteki JQuery, a nie JQuery.UI.
Ian Kemp

Odpowiedzi:


192

Zarówno interfejs użytkownika jQuery, jak i Bootstrap używają tooltipnazwy wtyczki. Służy $.widget.bridgedo tworzenia innej nazwy dla wersji interfejsu użytkownika jQuery i zezwalania wtyczce Bootstrap na pozostanie nazwaną etykietką narzędzia (próba użycia noConflictopcji w widgecie Bootstrap powoduje tylko wiele błędów, ponieważ nie działa ona poprawnie; ten problem został zgłoszony tutaj ):

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

Więc kod, aby to zadziałało:

// 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>

Ładny kod kopiuj wklej, który obsługuje również konflikt przycisków:

<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
Podczas próby pojawia się błąd js. 'undefined' is not an object (evaluating '$.widget.bridge')
covard

2
covar - czy upewniłeś się, że zaimportowałeś wszystkie skrypty src? Czy używasz nowszych wersji bibliotek?
Demz

1
@covard: Ważne jest, aby najpierw zaimportować jquery-ui, następnie zrobić to bridge, a następnie zaimportować bootstrap.
Joshua Muheim

2
rozwiązanie, które jest uciążliwe, jeśli masz wszystko spakowane i zminimalizowane ... nie ma sposobu, aby w jakiś sposób umieścić ten skrypt pomiędzy ... cholera, bzdury z kolizji nazw.
Piotr Kula

2
jeśli używasz pakietów webpack ze zminimalizowanym kodem, możesz po prostu umieścić jquery-ui przed bootstrap.js
Raj

69

Prostym rozwiązaniem jest załadowanie bootrap.js po jquery-ui.js, tak aby metoda bootstrap .tooltip miała pierwszeństwo.


2
To zadziałało dla mnie i jest najłatwiejszy. Zalecam dodanie komentarza HTML stwierdzającego, że jedna biblioteka musi być ładowana po drugiej.
Paul

1
Przy takim podejściu pewnego dnia w oknach dialogowych zabraknie ikony zamknięcia. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn

To rozwiązanie nie zadziałało. Używając Chrome, „wyczyściłem pamięć podręczną i mocno odświeżyłem” stronę, a podpowiedź czasami działała, a czasami nie (brak błędu w console.log). Odświeżenie 30 razy dało 7 razy rezultaty pracy. Potem poszedłem i pobrałem dostosowany pakiet interfejsu użytkownika jQuery, a teraz, gdy 30 razy wyczyszczę pamięć podręczną i trwale odświeżę, otrzymuję wyniki pracy 30 razy bez błędów. Dodałbym również, że używam require.js, dzięki czemu mogę łatwo kontrolować kolejność wczytywania bibliotek.
HPWD

KOCHAM CIĘ za tę najprostszą logiczną poprawkę
Milind

30

To zadziałało dla mnie:

Jeśli potrzebujesz użyć JQuery-UI, ale chcesz użyć podpowiedzi bootstrap, po prostu pobierz dostosowaną wersję JQuery-UI z tej strony .

Po prostu odznacz opcję „Podpowiedź” i pobierz ją (będzie to coś w rodzaju „jquery-ui-1.10.4.custom.js”).

Po prostu dodaj go do swojego projektu zamiast wersji, z której obecnie korzystasz i jesteś gotowy do zabawy. Pozwoli to uniknąć konfliktu. Dla mnie zadziałało jak urok!


1
Więc nadal pobierasz pliki zasobów z każdej strony na rękę, zamiast używać narzędzia takiego jak bower? Jak ogólnie instaluje się biblioteki innych firm? Wyszukać w Google i pobrać z dowolnej witryny?
user3746259

co powiesz na to, że nie chcę używać podpowiedzi bootstrap, ale zamiast tego UI ... to one są przyczyną problemu w jakikolwiek sposób.
Piotr Kula

2
Proste, łatwe, działało świetnie w mojej sytuacji. Dziękuję Ci! +1
Chris Kempen

Pracował dla mnie - naprawdę
waliłem się w

Najbardziej rozsądna odpowiedź, o ile sugeruje użycie tylko wymaganej funkcjonalności. Dzięki
Oleksii Kyslytsyn

30

Jeśli musisz załadować jquery-ui.jspóźniej, bootstrap.jsoto jak to zrobić:

<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>

Spowoduje to przesłonięcie podpowiedzi jquery-ui i zawsze używanie bootstrapów.


1
w twoim rozwiązaniu podpowiedź ui zostanie nadpisana bootstrapem, ale jeśli jakikolwiek organ nie chce nadpisać, musisz użyć poprzedniego rozwiązania
Projesh Pal.

Przy takim podejściu pewnego dnia w oknach dialogowych zabraknie ikony zamknięcia. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn

świetne rozwiązanie!
Ivan Ferrer

18

Zakładając, że interfejs użytkownika zostanie wywołany po zainicjowaniu funkcji bootrap

Przechowuj funkcję ładowania początkowego tuż przed zainicjowaniem interfejsu użytkownika

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

Następnie nazwij to następująco

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

Oficjalny sposób $.fn.bstooltip = $.fn.tooltip.noConflict();
Igor Jerosimić

9

Wydaje mi się, że to rozwiązanie działa dobrze.

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

9

Co powiesz na użycie zamiast tego okienek wyskakujących Bootstrap? Wyskakujące okienka BS nie powodują tego samego konfliktu, chociaż wymagają tego samego komponentu tooltip.js. Tak, są bardziej stylizowane, ale nie powodują, że przyciski interfejsu JQuery stają się niewyraźne.

Używam interfejsu JQuery tylko do niestandardowego autouzupełniania / komboboksów (więc nie mogę twierdzić, że inne kontrolki JQ-UI są w porządku) i żadna z powyższych nie rozwiązała problemu CSS na przyciskach combobox, które stały się „niestylowane” podczas wywoływania podpowiedzi BS. Przejście na BS Popovers zapewniło zasadniczo ten sam efekt, bez konfliktów, bez zmiany kolejności importowanych przeze mnie skryptów i bez wyraźnych instrukcji pomostowych.


3
Tak, bardzo pragmatyczne
Mark Stratmann

Dzięki za wskazówkę, zgadzam się, jest to obejście, które pozwala uniknąć całej złożoności.
Tom

Człowieku, ten rozwiązuje wszystkie koszmary i wygląda jak cytryna!
Piotr Kula

Czy wyskakujące okienka nie wymagają podpowiedzi jako wymagania wstępnego?
MrKobayashi

3

spróbuj użyć jQuery.noConflict () i zobacz, czy to w ogóle Ci pomoże. Wygląda na to, że bootstrap i jQuery używają tej samej przestrzeni nazw i być może podpowiedzi bootstrap i jQuery są ładowane do tej samej funkcji lub jedna jest ładowana jako pierwsza.

Możesz również sprawdzić, która biblioteka jest ładowana jako pierwsza. Zwykle, jeśli deklarujesz tę samą funkcję dwukrotnie w javascript, druga jest tą, która jest używana.

Po trzecie, sprawdź pakiet jQueryUI ( na ich stronie internetowej) i zobacz, czy możesz pobrać wersję, która nie ma dołączonych podpowiedzi (sprawdziłem i jest to całkowicie wykonalne).


Więc to jest dziwne ... Ładuję biblioteki javascript w tej samej kolejności, ale kiedy miałem problem, ładowałem bibliotekę jquery-ui przed tagiem <body> i bootstrap.js po całej mojej zawartości. Przeniosłem plik bootstrap.js nad moją zawartość (ale nadal po jquery-ui.js) i teraz renderuje podpowiedzi tak, jak się spodziewałem. Mam nadzieję, że to nie zepsuje wszechświata mojej witryny. Pomyślałem, że to najlepsza praktyka, aby załadować skrypt javascript, który można było po treści ze względu na wydajność ... dziwne.
markdotnet

jest to najlepsza praktyka. Może bootstrap musi znajdować się na górze?
Matt

Bootstrap JS zdecydowanie nie musi znajdować się na górze strony.
Paul Phillips

3

Jest łatwe i dobre rozwiązanie, po prostu przestaw swój bootstrap i link do pliku interfejsu jquery w następujący sposób:

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

Po prostu załaduj jQueryui przed załadowaniem pliku boostrap js. To dla mnie praca.


1
Przy takim podejściu pewnego dnia w oknach dialogowych zabraknie ikony zamknięcia. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn

nadpisuje wszystkie typowe właściwości interfejsu użytkownika z bootstrap min i nie może używać obu w razie potrzeby
Projesh Pal

1

Prostym sposobem jest załadowanie bootstrap.js po jquery-ui.js, tak aby bootstrap .tooltip przesłaniał interfejs jquery. Jeśli używasz modułu ładującego, takiego jak requirejs, możesz uzależnić bootstrap od jquery-ui, na przykład:

requirejs.config({
    baseUrl: 'js',
    waitSeconds: 30,
    shim: {
        'bootstrap': {
            deps: [ 'jquery', 'jquery-ui' ]
        },...
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.