jQueryUI Tooltips се конкурират с Twitter Bootstrap

Успях да накарам някои съвети за работа най-накрая със следния код:

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

и тогава

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

Проблемът, с който се сблъсквам, е, че използва jQueryUI подсказки (без стрелки, големи грозни подсказки) вместо Bootstraps.

Какво трябва да направя, за да използвам Bootstrap Tooltips вместо jQueryUI?


person markdotnet    schedule 05.12.2012    source източник
comment
трябва ли да имаш и двете неща?   -  person Matt    schedule 06.12.2012
comment
Не... Просто бих искал да имам подсказките за Bootstrap.   -  person markdotnet    schedule 06.12.2012
comment
съжалявам, имах предвид трябва ли да имате jquery ui И bootstrap?   -  person Matt    schedule 06.12.2012
comment
Да... изглежда, че нещата от Bootstrap.js разчитат (поне отчасти) на нещата от jQueryUI. Без jQuery нещата с Bootstrap няма да работят.   -  person markdotnet    schedule 06.12.2012
comment
Това проработи за мен, разгледайте този отговор   -  person Poncho    schedule 28.02.2014
comment
@markdotnet: неправилно. Bootstrap изисква основната библиотека JQuery, не JQuery.UI.   -  person Ian Kemp    schedule 18.02.2015


Отговори (11)


Както jQuery UI, така и Bootstrap използват tooltip за името на приставката. Използвайте $.widget.bridge, за да създадете различно име за версията на потребителския интерфейс на jQuery и да позволите на плъгина Bootstrap да остане име подсказка (опитът да се използва опцията noConflict в изпълнимия модул Bootstrap просто води до много грешки, защото не работи правилно; този проблем е докладван тук):

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

Така че кодът, за да работи:

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

Добър код за копиране и поставяне, който също обработва конфликта на бутоните:

<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>
person The Demz    schedule 08.10.2013
comment
Получавам js грешка, когато опитам това. 'undefined' is not an object (evaluating '$.widget.bridge') - person covard; 14.11.2013
comment
covar - уверихте ли се, че сте импортирали всички src скриптове? И използваш ли по-новите версии на libs? - person The Demz; 14.11.2013
comment
@covard: Важно е първо да импортирате jquery-ui, след това да направите нещото bridge и след това да импортирате bootstrap. - person Joshua Muheim; 24.06.2014
comment
решение, което е мъка, ако имате всичко групирано и минимизирано.. няма начин да поставите този скрипт между тях по някакъв начин.. по дяволите, боклук за сблъсък на имена. - person Piotr Kula; 02.12.2015
comment
Употреба: $('#element').uitooltip() - person gadelat; 02.03.2016
comment
ако използвате уеб пакети с минимизиран код, можете просто да поставите jquery-ui преди bootstrap.js - person Raj; 24.06.2017
comment
Това може да изглежда излишно, но реших да го спомена, за да помогна на хората с междинен ASP.Net MVC, които имат този проблем. Това решение работи чудесно за мен. Ето промените, които трябваше да направя в страницата си Layout.cshtml: ` @Scripts.Render(~/bundles/jquery) @Scripts.Render(~/bundles/jqueryui) ‹script› /*** Справяне с конфликт на именуването на jQuery плъгин между jQuery UI и Bootstrap ***/ $.widget.bridge('uibutton', $.ui.button); $.widget.bridge('uitooltip', $.ui.tooltip); ‹/script› @Scripts.Render(~/bundles/bootstrap) ` - person Eric C. Berridge; 23.02.2019
comment
Решение за 2020 г.: Здравейте, използвам Bootstrap 4.5 с jQuery UI 1.12.1 и имах същия проблем, че подсказките за Bootstrap се появиха във външния вид на jQuery-UI. Току-що обърнах реда на зареждане на .js файловете: първо зареждам jQuery-UI, след това Bootstrap, това вече реши проблема! - person basZero; 15.10.2020

Просто решение е да заредите bootrap.js след jquery-ui.js, така че методът bootstrap .tooltip да има предимство.

person Stefan Musarra    schedule 20.10.2014
comment
Това работи за мен и е най-лесният начин. Препоръчвам да добавите HTML коментар, в който се посочва, че едната библиотека трябва да се зарежда след другата. - person Paul; 27.06.2015
comment
Един ден ще ви липсва икона за затваряне в диалогови прозорци, като използвате такъв подход. stackoverflow.com/questions/17367736/ - person Oleksii Kyslytsyn; 21.11.2017
comment
Това решение не работи за мен. Използвайки Chrome, бих изчистил кеша и твърдо опреснявал страницата и подсказката понякога ще работи, а след това понякога не (няма грешка в console.log). Опресняването 30 пъти даде работни резултати 7 пъти. След това отидох и изтеглих персонализиран пакет за потребителски интерфейс на jQuery и сега, когато изчистя кеша и твърдо опреснявам 30 пъти, получавам работещи резултати 30 пъти с 0 грешки. Бих добавил също, че използвам require.js, за да мога лесно да контролирам реда, в който се зареждат библиотеките. - person HPWD; 18.04.2018
comment
ОБИЧАМ ТЕ за тази най-проста логическа поправка - person Milind; 26.04.2019

В случай, че трябва да заредите jquery-ui.js след bootstrap.js, ето как да го направите:

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

Това ще замени подсказката на jquery-ui и винаги ще използва bootstraps.

person supersan    schedule 04.08.2016
comment
във вашето решение потребителският интерфейс ще бъде презаписан с bootstrap, но ако някое тяло не иска да презапише, трябва да използва предишното решение - person Projesh Pal; 07.06.2017
comment
Един ден ще ви липсва икона за затваряне в диалогови прозорци, като използвате такъв подход. stackoverflow.com/questions/17367736/ - person Oleksii Kyslytsyn; 21.11.2017
comment
страхотно решение! - person Ivan Ferrer; 20.12.2017

Това проработи за мен:

Ако трябва да използвате JQuery-UI, но искате да използвате подсказката на bootstrap, просто вземете персонализирана версия на JQuery-UI от този уебсайт.

Просто премахнете отметката от опцията „Tooltip“ и я изтеглете (ще бъде нещо като „jquery-ui-1.10.4.custom.js“).

Просто го добавете към вашия проект вместо версията, която използвате в момента и сте готови за парти. Това ще избегне конфликта. Подейства ми като чар!

person Poncho    schedule 28.02.2014
comment
Така че все още изтегляте файлове с активи от всяка страна на ръка, вместо да използвате инструмент като bower? Как се инсталират библиотеки на трети страни по принцип? Потърсете в google и го изтеглете от който и да е сайт? - person user3746259; 28.07.2015
comment
Какво ще кажете за това, че не искам да използвам подсказка за първоначално зареждане, а потребителския интерфейс вместо това.. те са тези, които причиняват проблема по някакъв начин. - person Piotr Kula; 02.12.2015
comment
Просто, лесно, работи чудесно за моята ситуация. Благодаря ти! +1 - person Chris Kempen; 24.01.2016
comment
Работи за мен - наистина си блъсках главата с това - плюс едно - благодаря - person gchq; 16.03.2017
comment
Най-разумният отговор, стига да предлага да се вземе само необходимата функционалност. Благодаря - person Oleksii Kyslytsyn; 21.11.2017
comment
Просто означава, че не можете да използвате CDN за съжаление - person jg2703; 06.02.2018

Ако приемем, че потребителският интерфейс ще бъде извикан след инициализиране на bootsrap

Съхранявайте функцията за стартиране точно преди потребителският интерфейс да бъде инициализиран

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

След това го наречете както следва

$('.targetClass').bstooltip();
person Projesh Pal    schedule 09.06.2016
comment
Официален начин $.fn.bstooltip = $.fn.tooltip.noConflict(); - person Igor Jerosimić; 29.04.2020

Какво ще кажете просто да използвате Bootstrap popover вместо това? BS popovers не създават същия конфликт, въпреки че изискват същия компонент tooltip.js. Да, те са по-стилизирани, но не карат моите бутони на потребителския интерфейс на JQuery да не работят.

Използвам Jquery UI само за персонализирано автоматично довършване/комбинирани полета (така че не мога да твърдя, че други JQ-UI контроли са ок) и нито едно от горните не работи, за да коригира проблема с CSS на бутоните в комбинирания списък, които стават „нестилизирани“ при извикване на BS Tooltips. Преминаването към BS Popovers осигури по същество същия ефект без конфликти, без пренареждане на импортирания от моите скриптове и без нужда от изрични мостови изрази.

person AgonyOfVictory    schedule 17.12.2013
comment
Така, много прагматично - person Mark Stratmann; 19.03.2015
comment
Благодаря за съвета, съгласен съм, това е решение, което избягва всякаква сложност. - person Tom; 24.03.2015
comment
Ja man, dis one разрешава всички кошмари и изглежда сладък като лимон! - person Piotr Kula; 02.12.2015
comment
Popover-ите не изискват ли подсказка като предварителна заявка? - person MrKobayashi; 21.01.2019

Това решение изглежда работи добре за мен.

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

опитайте да използвате jQuery.noConflict() и вижте дали това изобщо ще ви помогне. Изглежда, че bootstrap и jQuery използват едно и също пространство от имена и може би подсказките за bootstrap и jQuery се зареждат в една и съща функция или едно се зарежда първо.

Можете също така да проверите коя библиотека е заредена първа. Обикновено, ако декларирате една и съща функция два пъти в javascript, втората е тази, която се използва.

Трето, проверете пакета jQueryUI (на техния уебсайт) и вижте дали можете да изтеглите версия, която няма включени подсказки (проверих и това е напълно изпълнимо).

person Matt    schedule 05.12.2012
comment
Така че това е странно... Зареждам javascript библиотеките в същия ред, но когато имах проблема, зареждах jquery-ui библиотеката преди моя ‹body› таг и bootstrap.js след цялото ми съдържание. Преместих bootstrap.js над моето съдържание (но все пак след jquery-ui.js) и сега изобразява подсказките, както очаквах. Надявам се това да не обърка вселената на моя уебсайт. Мислех, че е най-добрата практика да заредите javascript, който можете да заредите след съдържанието от съображения за ефективност... странно. - person markdotnet; 06.12.2012
comment
това е най-добрата практика. Може би bootstrap трябва да е отгоре? - person Matt; 06.12.2012
comment
Определено не е необходимо Bootstrap JS да е в горната част на страницата. - person Paul Phillips; 27.10.2014

Има лесно и добро решение, просто пренаредете връзката на вашия bootstrap и jquery ui файл така:

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

Просто заредете jQueryui, преди да заредите boostrap js файл. Това е работа за мен.

person Sanjib Debnath    schedule 22.08.2017
comment
Един ден ще ви липсва икона за затваряне в диалогови прозорци, като използвате такъв подход. stackoverflow.com/questions/17367736/ - person Oleksii Kyslytsyn; 21.11.2017
comment
той ще замени всички общи свойства на потребителския интерфейс с bootstrap min и не може да използва и двете, ако е необходимо - person Projesh Pal; 28.11.2017

Лесен начин е да заредите bootstrap.js след jquery-ui.js, така че bootstrap .tooltip да замени потребителския интерфейс на jquery. Ако използвате програма за зареждане на модули като requirejs, можете да направите bootstrap зависим от jquery-ui, като такъв:

requirejs.config({
    baseUrl: 'js',
    waitSeconds: 30,
    shim: {
        'bootstrap': {
            deps: [ 'jquery', 'jquery-ui' ]
        },...
person Andrew    schedule 30.06.2017

Другият начин е да изтеглите персонализирана компилация на jquery UI.

Изключете това, което не е необходимо, в този случай подсказка.

Можете да го изтеглите от тук https://jqueryui.com/download/

По този начин можете да го включите навсякъде

person Aadam    schedule 08.06.2021