La información sobre herramientas de jQueryUI compite con Twitter Bootstrap

141

He podido obtener algunos consejos sobre herramientas para trabajar finalmente con el siguiente código:

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

y entonces

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

El problema con el que me estoy encontrando es que está usando información sobre herramientas jQueryUI (sin flechas, información sobre herramientas grandes y feas) en lugar de Bootstraps.

¿Qué necesito hacer para usar la información sobre herramientas de Bootstrap en lugar de jQueryUI?

markdotnet
fuente
¿Necesitas tener ambas cosas?
Matt
No ... me gustaría tener la información sobre herramientas de Bootstrap.
markdotnet
lo siento, quiero decir, ¿necesitas tener jquery ui y bootstrap?
Matt
1
Esto funcionó para mí, mira esta respuesta
Poncho
1
@markdotnet: incorrecto. Bootstrap requiere la biblioteca central de JQuery, no JQuery.UI.
Ian Kemp

Respuestas:

192

Tanto la interfaz de usuario jQuery como Bootstrap usan tooltipel nombre del complemento. Use $.widget.bridgepara crear un nombre diferente para la versión de jQuery UI y permita que el complemento Bootstrap permanezca con el nombre de información sobre herramientas (intentar usar la noConflictopción en el widget Bootstrap solo genera muchos errores porque no funciona correctamente; ese problema se ha informado aquí) ):

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

Entonces el código para hacerlo funcionar:

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

Buen código de copiar y pegar que también maneja el conflicto del botón:

<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>
El demz
fuente
1
Recibo un error js cuando intento esto. 'undefined' is not an object (evaluating '$.widget.bridge')
covard
2
covar: ¿te aseguraste de tener todos los src importados? ¿Y estás usando las versiones más recientes de las librerías?
El Demz
1
@covard: es importante que primero importes jquery-ui, luego hagas el trabajo bridgey luego importes bootstrap.
Joshua Muheim
2
una solución que es una molestia si tienes todo incluido y minimizado ... no hay forma de poner este script en el medio de alguna manera ... maldición, nombre basura de colisión.
Piotr Kula
2
si está utilizando paquetes de paquetes web con código minimizado, simplemente puede poner jquery-ui antes de bootstrap.js
Raj
69

Una solución simple es cargar bootrap.js después de jquery-ui.js, de modo que el método bootstrap .tooltip tenga prioridad.

Stefan Musarra
fuente
2
Esto funcionó para mí y es la forma más fácil. Recomiendo agregar un comentario HTML que indique que una biblioteca debe cargarse después de otra.
Paul
1
Algún día te perderás el ícono de cerrar en los diálogos al usar dicho enfoque. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn
Esta solución no funcionó para mí. Al usar Chrome, "borraría la memoria caché y la actualización completa" de la página y la información sobre herramientas a veces funcionaría y luego a veces no (sin error en console.log). Refrescante 30 veces produjo resultados de trabajo 7 veces. Luego fui y descargué un paquete personalizado de jQuery UI y ahora cuando "borro la memoria caché y la actualización de hardware" 30 veces, obtengo resultados de trabajo 30 veces con 0 errores. También agregaría que estoy usando require.js para poder controlar fácilmente el orden en que se cargan las bibliotecas.
HPWD
TE AMO por esta solución lógica más simple
Milind
30

Esto funcionó para mí:

Si necesita usar JQuery-UI pero desea usar la información sobre herramientas de bootstrap, simplemente obtenga una versión personalizada de JQuery-UI de este sitio web .

Simplemente desmarque la opción "Información sobre herramientas" y descárguela (será algo así como "jquery-ui-1.10.4.custom.js").

Simplemente agréguelo a su proyecto en lugar de la versión que está utilizando actualmente y ya está listo para la fiesta. Esto evitará el conflicto. ¡Funcionó como un encanto para mí!

Poncho
fuente
1
¿Entonces aún descarga archivos de activos de cada lado por mano en lugar de usar una herramienta como Bower? ¿Cómo se instalan bibliotecas de terceros en general? ¿Buscar en google y descargarlo desde cualquier sitio?
user3746259
¿qué tal si no quiero usar la información sobre herramientas de bootstrap sino la UI en su lugar ... ellos son los que causan el problema de alguna manera.
Piotr Kula
2
Simple, fácil, funcionó muy bien para mi situación. ¡Gracias! +1
Chris Kempen
Trabajó para mí, realmente he estado golpeando mi cabeza sobre esto, más uno, gracias
Gchq
La respuesta más razonable, siempre y cuando sugiera tomar solo la funcionalidad requerida. Gracias
Oleksii Kyslytsyn
30

En caso de que deba cargar jquery-ui.jsdespués, bootstrap.jsaquí se explica cómo hacerlo:

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

Esto anulará la información sobre herramientas de jquery-ui y siempre usará bootstraps.

supersan
fuente
1
en su solución, la información sobre herramientas de la interfaz de usuario se sobrescribirá con bootstrap, pero si algún cuerpo no desea sobrescribir, debe usar la solución anterior
Projesh Pal
Algún día te perderás el ícono de cerrar en los diálogos al usar dicho enfoque. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn
gran solución!
Ivan Ferrer
18

Asumiendo que la IU llamará después de inicializar bootsrap

Almacene la función de arranque justo antes de que se inicialice la IU

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

Entonces llámalo como sigue

$('.targetClass').bstooltip();
Projesh Pal
fuente
$.fn.bstooltip = $.fn.tooltip.noConflict();
Forma
9

Esta solución parece funcionar bien para mí.

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

¿Qué tal simplemente usar popovers Bootstrap en su lugar? Los popovers de BS no crean el mismo conflicto aunque requieren el mismo componente tooltip.js. Sí, están más estilizados, pero no hacen que mis botones JQuery UI se vuelvan torpes.

Estoy usando Jquery UI solo para autocompletar / cuadros combinados personalizados (por lo que no puedo afirmar que otros controles JQ-UI estén bien) y ninguno de los anteriores funcionó para solucionar el problema de CSS en los botones de cuadro combinado que se vuelven "sin estilo" al invocar BS Tooltips. Cambiar a BS Popovers proporcionó esencialmente el mismo efecto sin conflictos, sin reordenamiento de las importaciones de mi script y sin necesidad de declaraciones puente explícitas.

Agonía de victoria
fuente
3
Así, muy pragmático
Mark Stratmann
Gracias por el consejo, estoy de acuerdo, es una solución que evita toda complejidad.
Tom
Ja hombre, ¡uno resuelve todas las pesadillas y se ve dulce como un limón!
Piotr Kula
¿Los popovers no requieren información sobre herramientas como requisito previo?
MrKobayashi
3

intente usar jQuery.noConflict () y vea si eso le ayuda en algo. Parece que bootstrap y jQuery están usando el mismo espacio de nombres, y tal vez las sugerencias de herramientas de bootstrap y jQuery se cargan en la misma función, o una se carga primero.

También puede verificar para ver qué biblioteca se carga primero. Por lo general, si declara la misma función dos veces en javascript, la segunda es la que se utiliza.

En tercer lugar, verifique el paquete jQueryUI ( en su sitio web) y vea si puede descargar una versión que no tenga la información sobre herramientas incluida (verifiqué y esto es totalmente factible).

Mate
fuente
Así que esto es extraño ... Estoy cargando las bibliotecas javascript en el mismo orden pero cuando estaba teniendo el problema, estaba cargando la biblioteca jquery-ui antes de mi etiqueta <body> y bootstrap.js después de todo mi contenido. Moví el bootstrap.js por encima de mi contenido (pero aún después del jquery-ui.js) y ahora está mostrando la información sobre herramientas como esperaba. Espero que esto no arruine el universo de mi sitio web. Pensé que era una buena práctica cargar el javascript que pudieras después del contenido por razones de rendimiento ... raro.
markdotnet
Es la mejor práctica. ¿Quizás el bootstrap necesita estar en la cima?
Matt
Bootstrap JS definitivamente no necesita estar en la parte superior de la página.
Paul Phillips
3

Hay una solución fácil y buena, solo reorganice su enlace de arranque y jquery ui file de esta manera:

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

Simplemente cargue jQueryui antes de cargar el archivo boostrap js. Es trabajo para mi.

Sanjib Debnath
fuente
1
Algún día te perderás el ícono de cerrar en los diálogos al usar dicho enfoque. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn
anulará todas las propiedades comunes de la interfaz de usuario con bootstrap min y no puede usar ambas si es necesario
Projesh Pal
1

Una manera fácil es cargar bootstrap.js después de jquery-ui.js, de modo que el bootstop .tooltip anule las interfaces de usuario de jquery. Si está utilizando un cargador de módulos como requirejs, puede hacer que bootstrap dependa de jquery-ui, como tal:

requirejs.config({
    baseUrl: 'js',
    waitSeconds: 30,
    shim: {
        'bootstrap': {
            deps: [ 'jquery', 'jquery-ui' ]
        },...
Andrés
fuente