Підказки jQueryUI змагаються з Twitter Bootstrap


141

Мені вдалося отримати кілька підказок щодо інструментів, щоб нарешті працювати з наступним кодом:

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

і потім

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

Проблема, з якою я стикаюся, полягає в тому, що він використовує підказки jQueryUI (відсутні стрілки, великі потворні підказки) замість Bootstraps.

Що мені потрібно зробити, щоб скористатися підказками Bootstrap Tooltips замість jQueryUI?


чи потрібно мати обидві речі?
Мет

Ні ... я просто хотів би мати підказки Bootstrap.
markdotnet

Вибачте, я мав на увазі, чи потрібно вам мати jquery ui AND bootstrap?
Мет

1
Це спрацювало для мене, перевірте цю відповідь
Пончо,

1
@markdotnet: неправильно. Для завантаження потрібна основна бібліотека JQuery, а не JQuery.UI.
Ян Кемп

Відповіді:


192

І JQuery UI, і Bootstrap використовують tooltipдля імені плагіна. Використовуйте $.widget.bridgeдля створення іншої назви для версії інтерфейсу jQuery UI та дозвольте плагіну 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>

1
Я отримую помилку js при спробі цього. 'undefined' is not an object (evaluating '$.widget.bridge')
ковард

2
covar - ви переконалися, що всі імпортовані сценарії src імпортовані? А ви використовуєте новіші версії libs?
Демз

1
@covard: Важливо, щоб ви спочатку імпортували jquery-ui, потім робили цю bridgeсправу, а потім імпортували завантажувальну систему.
Джошуа Мухайм

2
рішення, яке болить, якщо у вас все є в комплекті та до мінімуму. Немає способу якось якось покласти цей сценарій між собою ... чорт, назвати сміття зіткнення.
Пьотр Кула

2
якщо ви використовуєте пакети webpack із мінімізованим кодом, ви можете просто поставити jquery-ui перед bootstrap.js
Raj

69

Просте рішення - завантажити bootrap.js після jquery-ui.js, так що метод bootstrap .tooltip має перевагу.


2
Це працювало для мене і це найпростіший спосіб. Я рекомендую додати коментар HTML, в якому вказано, що одна бібліотека повинна бути завантажена за іншою.
Пол,

1
Одного разу вам не вистачить близького значка в діалогах, використовуючи такий підхід. stackoverflow.com/questions/17367736/…
Олексій Кислицин

Це рішення не спрацювало для мене. Використовуючи Chrome, я б "очистив кеш-пам'ять і важко оновив" сторінку, а підказка іноді спрацює, а інколи не (помилка в console.log). Оновлення в 30 разів дало робочі результати 7 разів. Потім я пішов і завантажив користувальницький пакет інтерфейсу jQuery, і тепер, коли я "очищую кеш-пам'ять і швидко оновлюю" 30 разів, я отримую робочі результати 30 разів з 0 помилками. Я також додав би, що я використовую requ.js, щоб я міг легко контролювати порядок завантаження бібліотек.
HPWD

Я ЛЮБЛЮ ВАС за цей найпростіший логічний виправлення
Milind

30

Це працювало для мене:

Якщо вам потрібно використовувати JQuery-UI, але ви хочете скористатися підказкою bootstrap, просто отримайте налаштовану версію JQuery-UI з цього веб-сайту .

Просто зніміть прапорець "Підказка" та завантажте його (це буде щось на зразок "jquery-ui-1.10.4.custom.js").

Просто додайте його до свого проекту замість версії, яку ви зараз використовуєте, і ви готові до участі в партії. Це дозволить уникнути конфлікту. Це спрацювало як шарм для мене!


1
Отже, ви все ще завантажуєте файли активів з кожної сторони в одну руку, замість того, щоб використовувати такий інструмент, як bower? Як встановити сторонні бібліотеки взагалі? Шукати в Google і завантажувати його з будь-якого сайту?
користувач3746259

як щодо того, я не хочу використовувати підказку для завантажувального інструменту, але замість цього інтерфейсу .. вони ті, що викликають проблему в будь-якому випадку.
Пьотр Кула

2
Проста, легка, чудово спрацювала для моєї ситуації. Дякую! +1
Кріс Кемпен

Працювали для мене - насправді стукали головою над цим - плюс один - дякую
gchq

Найрозумніша відповідь, якщо вона пропонує використовувати лише необхідну функціональність. Спасибі
Олексій Кислицин

30

У випадку, якщо 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 та завжди використовувати завантажувальні програми.


1
у вашому рішенні підказка ui буде перезаписана завантажувальною стрічкою, але якщо будь-яке тіло не хоче перезаписувати, доведеться скористатися попереднім рішенням
Projesh Pal

Одного разу вам не вистачить близького значка в діалогах, використовуючи такий підхід. stackoverflow.com/questions/17367736/…
Олексій Кислицин

чудове рішення!
Іван Феррер

18

Якщо припустити, що інтерфейс буде викликаний після ініціалізації завантаження

Зберігайте функцію завантаження безпосередньо перед ініціалізацією інтерфейсу користувача

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

Тоді називайте це наступним чином

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

Офіційний шлях $.fn.bstooltip = $.fn.tooltip.noConflict();
Ігор Єросиміч


9

Як щодо того, щоб просто замість цього використати Popostra Bootstrap? BS-popovers не створюють однакового конфлікту, хоча їм потрібен той самий компонент tooltip.js. Так, вони більш стилізовані, але не призводять до того, що мої кнопки користувальницького інтерфейсу JQuery стають непростими.

Я використовую користувальницький інтерфейс Jquery лише для користувальницьких автозаповнення / комбінацій (тому не можу вимагати, щоб інші елементи управління JQ-UI були нормальними), і жодне з перерахованих вище не працювало, щоб виправити проблему CSS, щоб кнопки комбінації ставали "неспокійними" при виклику підказок BS Tooltips. Перехід на BS Popovers дав по суті той же ефект без конфліктів, не упорядкування мого імпорту скрипту, а також явних мостових заяв не потрібно.


3
Ось так, дуже прагматичний
Марк Стратманн

Дякую за підказку, я погоджуюсь, що це рішення дозволяє уникнути будь-якої складності.
Том

Так, людина, вирішує всі кошмари і виглядає солодким, як лимон!
Пьотр Кула

Чи не потрібні підключення до попереднього запиту?
MrKobayashi

3

спробуйте скористатися jQuery.noConflict () і подивіться, чи це вам взагалі допомагає. Схоже, bootstrap та jQuery використовують одне й те саме простір імен, і, можливо, підказки для завантажувальної програми та jQuery завантажуються в одну і ту ж функцію, або один завантажується спочатку.

Ви також можете перевірити, яку бібліотеку завантажено першою. Зазвичай, якщо ви декларуєте одну і ту ж функцію двічі в JavaScript, друга використовується та, яка використовується.

По-третє, перевірте пакет jQueryUI ( на їхньому веб-сайті) і побачите, чи можете ви завантажити версію, яка не містить підказки (я перевірив, і це цілком можливо).


Отже, це дивно ... Я завантажую бібліотеки javascript у тому ж порядку, але коли у мене виникли проблеми, я завантажував бібліотеку jquery-ui перед моїм тегом <body> та bootstrap.js після всього мого вмісту. Я перемістив bootstrap.js над своїм вмістом (але все ще після jquery-ui.js), і тепер він відображає підказки, як я очікував. Сподіваюся, це не зіпсує всесвіт мого веб-сайту. Я вважав, що найкраща практика завантажувати JavaScript, який ви могли після вмісту, з міркувань продуктивності ... дивно.
markdotnet

це найкраща практика. Може бути, завантажувальний треп повинен бути вгорі?
Метт

Bootstrap JS, безумовно, не має бути вгорі сторінки.
Пол Філіпс

3

Є просте і гарне рішення, просто переставіть посилання на завантажувальний файл та файл 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. Це для мене робота.


1
Одного разу вам не вистачить близького значка в діалогах, використовуючи такий підхід. stackoverflow.com/questions/17367736/…
Олексій Кислицин

він скасує всі загальні властивості інтерфейсу з завантажувальним min та не може використовувати обидва за потреби
Projesh Pal

1

Найпростішим способом є завантаження bootstrap.js після jquery-ui.js, щоб завантажувальний файл .tooltip заміняв інтерфейси jquery. Якщо ви використовуєте завантажувач модулів, як Requjs, ви можете зробити bootstrap залежним від jquery-ui, як такого:

requirejs.config({
    baseUrl: 'js',
    waitSeconds: 30,
    shim: {
        'bootstrap': {
            deps: [ 'jquery', 'jquery-ui' ]
        },...
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.