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

141

Я был в состоянии получить некоторые подсказки , чтобы работать , наконец , с помощью следующего кода:

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

а потом

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

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

Что мне нужно сделать, чтобы использовать всплывающие подсказки Bootstrap вместо jQueryUI?

Markdotnet
источник
тебе нужно и то, и другое?
Мэтт
Нет ... Мне просто нужны всплывающие подсказки Bootstrap.
markdotnet 05
извините, я имел в виду, вам нужен jquery ui и bootstrap?
Мэтт
1
Это сработало для меня, ознакомьтесь с этим ответом
Пончо
1
@markdotnet: неверно. Для Bootstrap требуется основная библиотека JQuery, а не JQuery.UI.
Ян Кемп,

Ответы:

194

И 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>
Демз
источник
1
При этом я получаю сообщение об ошибке js. 'undefined' is not an object (evaluating '$.widget.bridge')
covard
2
covar - вы удостоверились, что импортировали все скрипты src? А вы используете более новые версии библиотек?
The Demz
1
@covard: Важно, чтобы вы сначала импортировали jquery-ui, затем сделали bridgeэто, а затем импортировали бутстрап.
Джошуа Мухейм
2
решение, которое является болью, если у вас все объединено и минифицировано ... нет способа как-то поместить этот скрипт между ними ... черт возьми, чушь коллизии имен.
Петр Кула
2
если вы используете пакеты webpack с минимизированным кодом, вы можете просто поместить jquery-ui перед bootstrap.js
Радж,
72

Простое решение - загрузить bootrap.js после jquery-ui.js, чтобы метод bootstrap .tooltip имел приоритет.

Стефан Мусарра
источник
2
Это сработало для меня, и это самый простой способ. Я рекомендую добавить HTML-комментарий, в котором говорится, что одна библиотека должна загружаться за другой.
Пол
2
Когда-нибудь при таком подходе вам будет не хватать значка закрытия в диалогах. stackoverflow.com/questions/17367736/…
Алексей Кислицын
Это решение не сработало для меня. Используя Chrome, я бы "очистил кеш и полностью обновил" страницу, и всплывающая подсказка иногда работала, а иногда - нет (в console.log ошибок нет). Обновление 30 раз дало результаты работы 7 раз. Затем я пошел и загрузил настроенный пакет пользовательского интерфейса jQuery, и теперь, когда я «очищаю кеш и выполняю полное обновление» 30 раз, я получаю 30 рабочих результатов без ошибок. Я бы также добавил, что использую require.js, чтобы легко контролировать порядок загрузки библиотек.
HPWD
Я ЛЮБЛЮ ТЕБЯ за это простейшее логическое решение
Милинд
30

Это сработало для меня:

Если вам нужно использовать JQuery-UI, но вы хотите использовать всплывающую подсказку начальной загрузки, просто получите настроенную версию JQuery-UI с этого веб-сайта .

Просто снимите флажок с опции «Всплывающая подсказка» и загрузите ее (это будет что-то вроде «jquery-ui-1.10.4.custom.js»).

Просто добавьте его в свой проект вместо версии, которую вы используете сейчас, и вы готовы к вечеринке. Это позволит избежать конфликта. Для меня это сработало как шарм!

Пончо
источник
1
То есть вы по-прежнему загружаете файлы ресурсов с каждой стороны, вместо того, чтобы использовать такой инструмент, как bower? Как вообще установить сторонние библиотеки? Искать в гугле и скачать с любого сайта?
user3746259
как насчет того, что я не хочу использовать всплывающую подсказку начальной загрузки, а вместо этого использовать пользовательский интерфейс ... они в любом случае вызывают проблему.
Петр Кула
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
в вашем решении всплывающая подсказка пользовательского интерфейса будет перезаписана с помощью начальной загрузки, но если какой-либо орган не хочет перезаписывать, необходимо использовать предыдущее решение
Projesh Pal
Когда-нибудь при таком подходе вам будет не хватать значка закрытия в диалогах. stackoverflow.com/questions/17367736/…
Алексей Кислицын
отличное решение!
Иван Феррер
19

Предполагая, что пользовательский интерфейс будет вызываться после инициализации bootrap

Сохраните функцию начальной загрузки непосредственно перед инициализацией пользовательского интерфейса.

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

Затем назовите это следующим образом

$('.targetClass').bstooltip();
Projesh Pal
источник
Официальный путь $.fn.bstooltip = $.fn.tooltip.noConflict();
Игорь Еросимич
9

Мне кажется, это решение хорошо работает.

// handle jQuery plugin naming conflict between jQuery UI and Bootstrap
$.widget.bridge('uibutton', $.ui.button);
$.widget.bridge('uitooltip', $.ui.tooltip);
Джон Стивенс
источник
9

Как насчет использования всплывающих окон Bootstrap? Всплывающие окна BS не создают одинаковый конфликт, хотя для них требуется один и тот же компонент tooltip.js. Да, они более стилизованы, но мои кнопки пользовательского интерфейса JQuery не работают неустойчиво.

Я использую JQuery UI только для настраиваемых автозаполнений / полей со списком (поэтому не могу утверждать, что другие элементы управления JQ-UI в порядке), и ни одно из вышеперечисленных действий не помогло исправить проблему CSS на кнопках поля со списком, которые становятся «нестилизованными» при вызове всплывающих подсказок BS. Переключение на BS Popovers дало практически тот же эффект, без конфликтов, без переупорядочивания импорта скриптов и без явных инструкций моста.

Агония Победы
источник
3
Вот так, очень прагматично
Марк Стратманн
Спасибо за совет, я согласен, это обходной путь, позволяющий избежать всех сложностей.
Tom
Ja man, этот человек решает все кошмары и выглядит как лимон!
Петр Кула
Всплывающие подсказки не требуют предварительной подсказки?
MrKobayashi
3

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

Вы также можете проверить, какая библиотека загружается первой. Обычно, если вы дважды объявляете одну и ту же функцию в javascript, используется вторая.

В-третьих, проверьте пакет jQueryUI ( на их веб-сайте) и посмотрите, можете ли вы загрузить версию, в которую не включены всплывающие подсказки (я проверил, и это полностью выполнимо).

Мэтт
источник
Так что это странно ... Я загружаю библиотеки javascript в том же порядке, но когда у меня возникла проблема, я загружал библиотеку jquery-ui перед тегом <body> и bootstrap.js после всего моего контента. Я переместил bootstrap.js над своим контентом (но все еще после jquery-ui.js), и теперь он отображает всплывающие подсказки, как я ожидал. Надеюсь, это не испортит вселенную моего сайта. Я подумал, что лучше всего загружать javascript, который вы можете использовать после контента, из соображений производительности ... странно.
markdotnet 05
это лучшая практика. Может быть, бутстрап должен быть наверху?
Мэтт
Bootstrap JS определенно не обязательно должен быть вверху страницы.
Пол Филлипс
3

Есть простое и хорошее решение, просто переставьте ссылку на файл 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. Для меня это работа.

Санджиб Дебнат
источник
1
Когда-нибудь при таком подходе вам будет не хватать значка закрытия в диалогах. stackoverflow.com/questions/17367736/…
Алексей Кислицын
он переопределяет все общие свойства пользовательского интерфейса с помощью bootstrap min и не может использовать оба при необходимости
Projesh Pal
1

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

requirejs.config({
    baseUrl: 'js',
    waitSeconds: 30,
    shim: {
        'bootstrap': {
            deps: [ 'jquery', 'jquery-ui' ]
        },...
Андрей
источник