Les info-bulles jQueryUI sont en concurrence avec Twitter Bootstrap

141

J'ai pu obtenir des astuces pour travailler enfin avec le code suivant:

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

puis

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

Le problème que je rencontre est qu'il utilise des info-bulles jQueryUI (pas de flèches, de grosses info-bulles laides) au lieu de Bootstraps.

Que dois-je faire pour utiliser les info-bulles Bootstrap au lieu de jQueryUI?

markdotnet
la source
avez-vous besoin des deux choses?
Matt
Non ... j'aimerais juste avoir les info-bulles Bootstrap.
markdotnet
désolé, je voulais dire avez-vous besoin d'avoir jquery ui AND bootstrap?
Matt
1
Cela a fonctionné pour moi, consultez cette réponse
Poncho
1
@markdotnet: incorrect. Bootstrap nécessite la bibliothèque JQuery principale, pas JQuery.UI.
Ian Kemp

Réponses:

192

L'interface utilisateur jQuery et Bootstrap utilisent tous deux tooltiple nom du plugin. Utilisez $.widget.bridgepour créer un nom différent pour la version de l'interface utilisateur jQuery et permettre au plugin Bootstrap de rester nommé info-bulle (essayer d'utiliser l' noConflictoption sur le widget Bootstrap entraîne simplement de nombreuses erreurs car cela ne fonctionne pas correctement; ce problème a été signalé ici ):

// Resolve name collision between jQuery UI and Twitter Bootstrap
$.widget.bridge('uitooltip', $.ui.tooltip);

Donc, le code pour le faire fonctionner:

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

Beau code copier-coller qui gère également le conflit de bouton:

<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>
Le Demz
la source
1
J'obtiens une erreur js lorsque j'essaye ceci. 'undefined' is not an object (evaluating '$.widget.bridge')
Covard
2
covar - vous êtes-vous assuré que tous les scripts src sont importés? Et utilisez-vous les nouvelles versions des bibliothèques?
The Demz
1
@covard: Il est important que vous importiez d'abord jquery-ui, puis que vous fassiez la bridgechose, puis que vous importiez bootstrap.
Joshua Muheim
2
une solution qui est pénible si vous avez tout regroupé et minifié .. il n'y a pas moyen de mettre ce script entre les deux d'une manière ou d'une autre .. bon sang, nommez les déchets de collision.
Piotr Kula
2
si vous utilisez des bundles webpack avec du code minifié, vous pouvez simplement mettre jquery-ui avant bootstrap.js
Raj
69

Une solution simple consiste à charger bootrap.js après jquery-ui.js, afin que la méthode bootstrap .tooltip soit prioritaire.

Stefan Musarra
la source
2
Cela a fonctionné pour moi et c'est le moyen le plus simple. Je recommande d'ajouter un commentaire HTML indiquant qu'une bibliothèque doit être chargée après l'autre.
Paul
1
Un jour, vous manquerez d'icône de fermeture dans les boîtes de dialogue en utilisant une telle approche. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn
Cette solution n'a pas fonctionné pour moi. En utilisant Chrome, je «vidais le cache et actualisais dur» la page et l'info-bulle fonctionnait parfois et parfois non (pas d'erreur dans console.log). Rafraîchissant 30 fois produit des résultats de travail 7 fois. Je suis ensuite allé télécharger un package d'interface utilisateur jQuery personnalisé et maintenant, lorsque je "vide le cache et actualise dur" 30 fois, j'obtiens des résultats de travail 30 fois avec 0 erreur. J'ajouterais également que j'utilise require.js pour pouvoir facilement contrôler l'ordre dans lequel les bibliothèques sont chargées.
HPWD
Je t'aime pour cette solution logique la plus simple
Milind
30

Cela a fonctionné pour moi:

Si vous avez besoin d'utiliser JQuery-UI mais que vous souhaitez utiliser l'info-bulle de bootstrap, il vous suffit d'obtenir une version personnalisée de JQuery-UI à partir de ce site Web .

Décochez simplement l'option "Info-bulle" et téléchargez-la (ce sera quelque chose comme "jquery-ui-1.10.4.custom.js").

Ajoutez-le simplement à votre projet au lieu de la version que vous utilisez actuellement et vous êtes prêt à faire la fête. Cela évitera le conflit. Cela a fonctionné comme un charme pour moi!

Poncho
la source
1
Vous téléchargez donc toujours des fichiers d'actifs de chaque côté par main au lieu d'utiliser un outil comme Bower? Comment installer des bibliothèques tierces en général? Rechercher dans Google et le télécharger à partir de n'importe quel site?
user3746259
que diriez-vous que je ne veux pas utiliser l'info-bulle d'amorçage mais l'interface utilisateur à la place ... ce sont eux qui causent le problème de toute façon.
Piotr Kula
2
Simple, facile, a très bien fonctionné pour ma situation. Je vous remercie! +1
Chris Kempen
A travaillé pour moi - je me suis vraiment cogné la tête dessus - plus un - merci
gchq
La réponse la plus raisonnable, tant qu'elle suggère de ne prendre que la fonctionnalité requise. Merci
Oleksii Kyslytsyn
30

Dans le cas où vous devez charger jquery-ui.jsaprès, bootstrap.jsvoici comment le faire:

<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>

Cela remplacera l'info-bulle de jquery-ui et utilisera toujours des bootstraps.

supersan
la source
1
dans votre solution, l'infobulle de l'interface utilisateur sera écrasée par bootstrap, mais si un corps ne veut pas écraser doit utiliser la solution précédente
Projesh Pal
Un jour, vous manquerez d'icône de fermeture dans les boîtes de dialogue en utilisant une telle approche. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn
excellente solution!
Ivan Ferrer
18

En supposant que l'interface utilisateur sera appelée après l'initialisation de bootsrap

Stockez la fonction d'amorçage juste avant l'initialisation de l'interface utilisateur

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

Puis appelez-le comme suit

$('.targetClass').bstooltip();
Projesh Pal
la source
$.fn.bstooltip = $.fn.tooltip.noConflict();
Voie
9

Cette solution semble bien fonctionner pour moi.

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

Que diriez-vous d'utiliser simplement les popovers Bootstrap à la place? Les popovers BS ne créent pas le même conflit bien qu'ils nécessitent le même composant tooltip.js. Oui, ils sont plus stylisés mais ne rendent pas mes boutons JQuery UI dérangés.

J'utilise Jquery UI uniquement pour la saisie semi-automatique / comboboxes personnalisées (je ne peux donc pas prétendre que les autres contrôles JQ-UI sont corrects) et aucun des éléments ci-dessus n'a permis de résoudre le problème CSS sur les boutons de la zone de liste déroulante devenant «non stylisés» lors de l'appel des info-bulles BS. Le passage à BS Popovers a fourni essentiellement le même effet sans conflit, sans réorganisation de mes importations de script et sans instruction de pont explicite nécessaire.

AgonyOfVictoire
la source
3
Comme cela, très pragmatique
Mark Stratmann
Merci pour la pointe, je suis d'accord, c'est une solution de contournement qui évite toute complexité.
Tom
Ja man, dis on résout tous les cauchemars et ressemble à un citron!
Piotr Kula
Les popovers ne nécessitent-ils pas une info-bulle comme pré-demande?
MrKobayashi
3

essayez d'utiliser jQuery.noConflict () et voyez si cela vous aide du tout. Il semble que bootstrap et jQuery utilisent le même espace de noms, et peut-être que les info-bulles bootstrap et jQuery sont chargées dans la même fonction, ou l'une est chargée en premier.

Vous pouvez également vérifier quelle bibliothèque est chargée en premier. Habituellement, si vous déclarez la même fonction deux fois en javascript, la seconde est celle qui est utilisée.

Troisièmement, vérifiez le package jQueryUI ( sur leur site Web) et voyez si vous pouvez télécharger une version qui ne contient pas les infobulles (j'ai vérifié et c'est tout à fait faisable).

Mat
la source
Donc c'est bizarre ... Je charge les bibliothèques javascript dans le même ordre mais quand j'ai eu le problème, je chargeais la bibliothèque jquery-ui avant ma balise <body> et le bootstrap.js après tout mon contenu. J'ai déplacé le bootstrap.js au-dessus de mon contenu (mais toujours après le jquery-ui.js) et maintenant il affiche les info-bulles comme je m'y attendais. J'espère que cela ne gâche pas l'univers de mon site Web. Je pensais que c'était la meilleure pratique de charger le javascript après le contenu pour des raisons de performances ... bizarre.
markdotnet
c'est la meilleure pratique. Peut-être que le bootstrap doit être au sommet?
Matt
Bootstrap JS n'a certainement pas besoin d'être en haut de la page.
Paul Phillips
3

Il existe une solution simple et bonne, il suffit de réorganiser votre lien de fichier bootstrap et jquery ui comme ceci:

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

Chargez simplement jQueryui avant de charger le fichier js boostrap. C'est du travail pour moi.

Sanjib Debnath
la source
1
Un jour, vous manquerez d'icône de fermeture dans les boîtes de dialogue en utilisant une telle approche. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn
il remplace toutes les propriétés communes de l'interface utilisateur avec bootstrap min et ne peut pas utiliser les deux si nécessaire
Projesh Pal
1

Un moyen simple consiste à charger bootstrap.js après jquery-ui.js, de sorte que le bootstrap .tooltip remplace l'interface utilisateur de jquery. Si vous utilisez un chargeur de module comme requirejs, vous pouvez rendre bootstrap dépendant de jquery-ui, en tant que tel:

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