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

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

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

а потом

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

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

Что мне нужно сделать, чтобы использовать всплывающие подсказки Bootstrap вместо 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? И вы используете более новые версии библиотек? - 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
если вы используете пакеты webpack с минимизированным кодом, вы можете просто поставить jquery-ui перед bootstrap.js - person Raj; 24.06.2017
comment
Это может показаться излишним, но я подумал, что упомяну об этом, чтобы помочь любым промежуточным пользователям ASP.Net MVC, у которых есть эта проблема. Это решение отлично сработало для меня. Вот изменения, которые мне пришлось внести на мою страницу Layout.cshtml: между 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 и всегда будет использовать бутстрапы.

person supersan    schedule 04.08.2016
comment
в вашем решении всплывающая подсказка пользовательского интерфейса будет перезаписана начальной загрузкой, но если какое-либо тело не хочет перезаписывать, необходимо использовать предыдущее решение - 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, но вы хотите использовать всплывающую подсказку начальной загрузки, просто скачайте настроенную версию JQuery-UI с этого веб-сайта.

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

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

person Poncho    schedule 28.02.2014
comment
То есть вы по-прежнему загружаете файлы активов с каждой стороны вместо того, чтобы использовать такой инструмент, как Bower? Как вообще устанавливать сторонние библиотеки? Найдите в гугле и скачайте с любого сайта? - 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

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

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

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? Всплывающие окна BS не создают такого же конфликта, хотя для них требуется один и тот же компонент tooltip.js. Да, они более стилизованы, но кнопки моего пользовательского интерфейса JQuery не шатаются.

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

person AgonyOfVictory    schedule 17.12.2013
comment
Вот так, очень прагматично - person Mark Stratmann; 19.03.2015
comment
Спасибо за совет, я согласен, это обходной путь, который позволяет избежать всех сложностей. - person Tom; 24.03.2015
comment
Да чувак, эта разгадывает все кошмары и выглядит сладкой, как лимон! - person Piotr Kula; 02.12.2015
comment
Разве всплывающие окна не требуют всплывающей подсказки в качестве предварительного требования? - 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
это лучшая практика. Может быть, бутстрап должен быть вверху? - 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

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

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

Другой способ — загрузить пользовательскую сборку пользовательского интерфейса jquery.

Исключите то, что не нужно, в данном случае всплывающую подсказку.

Скачать можно отсюда https://jqueryui.com/download/

Таким образом, вы можете включить его в любом месте

person Aadam    schedule 08.06.2021