Подсказки jQueryUI конкурируют с Twitter Bootstrap

110

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

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

а затем

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

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

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

  • 0
    вам нужно иметь обе вещи?
  • 0
    Нет ... Я просто хотел бы иметь всплывающие подсказки Bootstrap.
Показать ещё 4 комментария

10 ответов

152

Оба 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="/jquery-ui.js"></script>
// Resolve name collision between jQuery UI and Twitter Bootstrap
$.widget.bridge('uitooltip', $.ui.tooltip);
// Then import bootstrap
<script src="/bootstrap.js"></script>

Хороший код вставки папок, который также управляет конфликтом кнопки:

<script type="application/javascript" src="/jquery.js"></script>
<script type="application/javascript" src="/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="//bootstrap.js"></script>
  • 1
    Я получаю ошибку JS, когда я пытаюсь это сделать. 'undefined' is not an object (evaluating '$.widget.bridge')
  • 2
    covar - вы убедились, что импортировали все скрипты src? И вы используете более новые версии библиотек?
Показать ещё 7 комментариев
44

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

  • 1
    Это сработало для меня и является самым простым способом. Я рекомендую добавить HTML-комментарий о том, что одна библиотека должна загружаться за другой.
  • 3
    К сожалению, у меня не получилось.
Показать ещё 5 комментариев
19

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

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

Просто снимите флажок "Tooltip" и загрузите его (это будет что-то вроде "jquery-ui-1.10.4.custom.js" ).

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

  • 1
    Таким образом, вы по-прежнему скачиваете файлы активов с каждой стороны, а не используете такой инструмент, как Bower? Как вы устанавливаете сторонние библиотеки в целом? Поиск в Google для и скачать его с любого сайта?
  • 0
    как насчет того, что я не хочу использовать всплывающую подсказку начальной загрузки, но вместо этого пользовательский интерфейс ... именно они вызывают проблему в любом случае.
Показать ещё 4 комментария
9

Если вы должны загрузить jquery-ui.js после bootstrap.js, вот как это сделать:

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

<script>var _tooltip = jQuery.fn.tooltip;</script>
<script type="application/javascript" src="/jquery-ui.js"></script>
<script>var jQuery.fn.tooltip = _tooltip;</script>
  • 0
    в вашем решении всплывающая подсказка пользовательского интерфейса будет перезаписана с помощью начальной загрузки, но если какое-либо тело не хочет перезаписывать, необходимо использовать предыдущее решение
  • 0
    Однажды вы будете пропускать значок закрытия в диалогах, используя такой подход. stackoverflow.com/questions/17367736/...
Показать ещё 1 комментарий
9

Это решение, кажется, хорошо работает для меня.

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

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

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

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

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

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

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

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

  • 3
    Как это очень прагматично
  • 0
    Спасибо за совет, я согласен, это обходной путь, который позволяет избежать любой сложности.
Показать ещё 2 комментария
3

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

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

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

  • 0
    Так что это странно ... Я загружаю библиотеки javascript в том же порядке, но когда у меня возникла проблема, я загружал библиотеку jquery-ui перед моим тегом <body> и bootstrap.js после всего моего содержимого. Я переместил bootstrap.js над своим контентом (но все еще после jquery-ui.js) и теперь он отображает всплывающие подсказки, как я и ожидал. Я надеюсь, что это не испортит вселенную моего сайта. Я подумал, что лучше всего загружать javascript после контента по соображениям производительности ... странно.
  • 0
    это лучшая практика. Может быть, бутстрап должен быть на вершине?
Показать ещё 1 комментарий
2

Существует простое и правильное решение, просто перестройте ссылку для загрузки и jquery ui file следующим образом:

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

Просто загрузите jQueryui, прежде чем загружать файл boostrap js. Это работает для меня.

  • 1
    Однажды вы будете пропускать значок закрытия в диалогах, используя такой подход. stackoverflow.com/questions/17367736/...
  • 0
    он переопределяет все общие свойства пользовательского интерфейса с помощью начальной загрузки мин и не может использовать оба при необходимости
1

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

requirejs.config({
    baseUrl: 'js',
    waitSeconds: 30,
    shim: {
        'bootstrap': {
            deps: [ 'jquery', 'jquery-ui' ]
        },...
  • 0
    Этот решил мою проблему. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню