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工具提示而不是jQueryUI?


您需要同时拥有这两种东西吗?
马特

不,...我只想拥有Bootstrap工具提示。
markdotnet

抱歉,我的意思是您需要jquery ui和bootstrap吗?
马特

1
这对我
有用

1
@markdotnet:不正确。Bootstrap需要核心JQuery库,而不是 JQuery.UI。
伊恩·肯普

Answers:


191

jQuery UI和Bootstrap都使用tooltip该插件的名称。使用$.widget.bridge创造了jQuery UI的版本不同的名称,并允许引导插件留下来命名的工具提示(试图使用noConflict的引导选项窗口小部件只是造成了很多的错误,因为它不能正常工作,这个问题已经在这里报道):

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

2
covar-您确定已导入所有src脚本吗?您是否正在使用这些库的较新版本?
Demz,2013年

1
@covard:首先导入jquery-ui,然后执行该操作bridge,然后导入bootstrap,这一点很重要。
约书亚·穆海姆2014年

2
如果您将所有东西都捆在一起并缩小,那么这是一个痛苦的解决方案..无法以某种方式在此脚本之间放置..该死,名称冲突垃圾。
Piotr Kula 2015年

2
如果你正在使用的WebPack束与精缩代码,你可以简单地把jQuery的UI bootstrap.js前
拉吉

69

一个简单的解决方案是在jquery-ui.js之后加载bootrap.js,以便bootstrap .tooltip方法优先。


2
这对我有用,是最简单的方法。我建议添加一个HTML注释,说明必须在另一个库之后加载一个库。
保罗

1
有一天,使用这种方法,您将在对话框中丢失关闭图标。stackoverflow.com/questions/17367736/...
奥莱克西Kyslytsyn

该解决方案对我不起作用。使用Chrome浏览器,我可以“清除缓存并进行硬刷新”页面,并且工具提示有时会起作用,然后有时却不起作用(console.log中没有错误)。刷新30次可产生7次工作结果。然后,我去下载了一个定制的jQuery UI程序包,现在当我“清除缓存和硬刷新” 30次时,我得到30次工作结果,错误为0。我还要补充一点,我正在使用require.js,以便可以轻松控制库的加载顺序。
HPWD

我爱您,因为这是最简单的逻辑解决方案
-Milind

30

这为我工作:

如果您需要使用JQuery-UI,但要使用引导程序的工具提示,只需从此网站获取定制版本的JQuery-UI 。

只需取消选中“工具提示”选项,然后下载它(它将类似于“ jquery-ui-1.10.4.custom.js”)。

只需将其添加到您的项目中,而不是将其添加到您当前正在使用的版本中,即可开始聚会了。这样可以避免冲突。它对我来说就像一种魅力!


1
因此,您仍然每手从每一侧下载资产文件,而不是使用Bower之类的工具?您一般如何安装第三方库?在Google中搜索并从任何网站下载它?
user3746259

我怎么不想使用引导工具提示,而是使用UI呢?它们以任何方式导致问题。
Piotr Kula 2015年

2
简单,轻松,非常适合我的情况。谢谢!+1
克里斯·肯本

为我工作-确实为此付出了很多努力-再加上一个-谢谢
gchq

最合理的答案,只要建议仅采用所需的功能即可。谢谢
Oleksii Kyslytsyn

30

如果您必须jquery-ui.jsbootstrap.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/...
奥莱克西Kyslytsyn

很好的解决方案!
伊万·费雷尔

18

假设在初始化bootsrap之后将调用UI

在初始化UI之前存储引导程序功能

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

然后按以下方式调用

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

官方方式 $.fn.bstooltip = $.fn.tooltip.noConflict();
IgorJerosimić

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 UI按钮出现问题。

我仅将Jquery UI用于自定义自动完成/组合框(因此不能声称其他JQ-UI控件是可以的),并且上述方法均无法解决调用BS Tooltips时组合框按钮变为“未样式化”的CSS问题。切换到BS Popover可以提供基本相同的效果,没有冲突,无需重新定义脚本导入,也不需要显式的bridge语句。


3
这样,非常务实
Mark Stratmann

我同意您的提示,这是一种避免所有复杂性的解决方法。
汤姆(Tom)

Ja man,dis一个人解决了所有噩梦,看起来像柠檬一样甜!
Piotr Kula 2015年

弹出窗口是否不需要工具提示作为先决条件?
MrKobayashi

3

尝试使用jQuery.noConflict()看看是否有帮助。看起来bootstrap和jQuery使用相同的名称空间,并且bootstrap和jQuery工具提示可能被加载到同一函数中,或者首先被加载。

您还可以检查先加载哪个库。通常,如果您在javascript中两次声明相同的函数,则第二个即为使用的函数。

第三,检查jQueryUI软件包(在其网站上),看看是否可以下载不包含工具提示的版本(我检查了一下,这完全可行)。


所以这很奇怪...我以相同的顺序加载javascript库,但是当遇到问题时,我在<body>标签之前加载了jquery-ui库,在所有内容之后加载了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>

只需在加载boostrap js文件之前加载jQueryui。对我来说有用。


1
有一天,使用这种方法,您将在对话框中丢失关闭图标。stackoverflow.com/questions/17367736/...
奥莱克西Kyslytsyn

它将使用bootstrap min覆盖ui的所有常见属性,并且在需要时不能同时使用两者
-Projesh Pal

1

一种简单的方法是在jquery-ui.js之后加载bootstrap.js,以便bootstrap .tooltip覆盖jquery UI。如果您正在使用诸如requirejs之类的模块加载器,则可以使引导依赖于jquery-ui,如下所示:

requirejs.config({
    baseUrl: 'js',
    waitSeconds: 30,
    shim: {
        'bootstrap': {
            deps: [ 'jquery', 'jquery-ui' ]
        },...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.