Le descrizioni comandi di jQueryUI sono in competizione con Twitter Bootstrap


141

Sono stato in grado di ottenere alcuni suggerimenti per lavorare finalmente con il seguente codice:

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

e poi

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

Il problema in cui mi imbatto è che sta usando i tooltip jQueryUI (senza frecce, tooltip grandi e brutti) invece di Bootstraps.

Cosa devo fare per utilizzare le descrizioni dei Bootstrap invece di jQueryUI?


devi avere entrambe le cose?
Matt,

No ... Vorrei solo avere le descrizioni dei Bootstrap.
markdotnet,

scusa, volevo dire che devi avere jquery ui E bootstrap?
Matt,

1
Questo ha funzionato per me, controlla questa risposta
Poncho,

1
@markdotnet: errato. Bootstrap richiede la libreria JQuery principale, non JQuery.UI.
Ian Kemp,

Risposte:


192

Sia l'interfaccia utente jQuery che Bootstrap utilizzano tooltipil nome del plug-in. Utilizzare $.widget.bridgeper creare un nome diverso per la versione dell'interfaccia utente di jQuery e consentire al plug-in Bootstrap di rimanere denominato tooltip (il tentativo di utilizzare l' noConflictopzione sul widget Bootstrap provoca solo molti errori perché non funziona correttamente; tale problema è stato segnalato qui ):

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

Quindi il codice per farlo funzionare:

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

Bel codice copia incolla che gestisce anche il conflitto di pulsanti:

<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
Ottengo un errore js quando provo questo. 'undefined' is not an object (evaluating '$.widget.bridge')
Invita il

2
covar - ti sei assicurato di aver importato tutti gli script src? E stai usando le versioni più recenti delle librerie?
The Demz,

1
@covard: è importante importare prima jquery-ui, quindi fare le bridgecose e quindi importare bootstrap.
Joshua Muheim,

2
una soluzione che è una seccatura se hai tutto in bundle e minimizzato .. non c'è modo di mettere questo script tra in qualche modo .. dannazione, nome spazzatura di collisione.
Piotr Kula,

2
se stai usando bundle webpack con codice minimizzato puoi semplicemente mettere jquery-ui prima di bootstrap.js
Raj

69

Una soluzione semplice è caricare bootrap.js dopo jquery-ui.js, in modo che il metodo bootstrap .tooltip abbia la precedenza.


2
Questo ha funzionato per me ed è il modo più semplice. Raccomando di aggiungere un commento HTML affermando che una libreria deve essere caricata dopo l'altra.
Paul,

1
Un giorno ti mancherà l'icona di chiusura nelle finestre di dialogo usando tale approccio. stackoverflow.com/questions/17367736/...
Oleksii Kyslytsyn

Questa soluzione non ha funzionato per me. Usando Chrome, "svuoterei la cache e aggiornai duro" la pagina e il tooltip a volte funzionava e poi a volte no (nessun errore in console.log). Il rinfrescante 30 volte ha prodotto risultati di lavoro 7 volte. Poi sono andato e scaricato un pacchetto UI jQuery personalizzato e ora quando "svuoto cache e aggiorna hard" 30 volte, ottengo risultati di lavoro 30 volte con 0 errori. Vorrei anche aggiungere che sto utilizzando request.js in modo da poter facilmente controllare l'ordine in cui vengono caricate le librerie.
HPWD,

TI AMO per questa semplice soluzione logica
Milind,

30

Questo ha funzionato per me:

Se è necessario utilizzare l'interfaccia utente di JQuery ma si desidera utilizzare la descrizione comandi di bootstrap, è sufficiente ottenere una versione personalizzata dell'interfaccia utente di JQuery da questo sito Web .

Deseleziona semplicemente l'opzione "Descrizione comando" e scaricala (sarà qualcosa come "jquery-ui-1.10.4.custom.js").

Aggiungilo semplicemente al tuo progetto anziché alla versione che stai attualmente utilizzando e sei pronto per festeggiare. Questo eviterà il conflitto. Ha funzionato come un incantesimo per me!


1
Quindi scarichi comunque file di risorse da ogni lato per mano invece di utilizzare uno strumento come il pergolato? Come si installano librerie di terze parti in generale? Cerca in Google e scaricarlo da qualsiasi sito?
user3746259

che ne dici di non voler usare la descrizione del bootstrap ma quella dell'interfaccia utente invece .. sono quelli che causano il problema in ogni modo.
Piotr Kula,

2
Semplice, facile, ha funzionato alla grande per la mia situazione. Grazie! +1
Chris Kempen,

Ha funzionato per me - mi sono davvero sbattuto la testa sopra questo - più uno - grazie
gchq

La risposta più ragionevole, purché suggerisca di prendere solo la funzionalità richiesta. Grazie
Oleksii Kyslytsyn il

30

Nel caso in cui è necessario caricare jquery-ui.jsdopo bootstrap.jsqui è come farlo:

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

Ciò sovrascriverà la descrizione di jquery-ui e utilizzerà sempre i bootstrap.


1
nella tua soluzione la descrizione del comando verrà sovrascritta con bootstrap ma se un corpo non vuole sovrascrivere devi usare la soluzione precedente
Projesh Pal

Un giorno ti mancherà l'icona di chiusura nelle finestre di dialogo usando tale approccio. stackoverflow.com/questions/17367736/...
Oleksii Kyslytsyn

ottima soluzione!
Ivan Ferrer,

18

Supponendo che l'interfaccia utente verrà chiamata dopo aver inizializzato il bootstrap

Archivia la funzione bootstrap subito prima dell'inizializzazione dell'interfaccia utente

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

Quindi chiamalo come segue

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

Modo ufficiale $.fn.bstooltip = $.fn.tooltip.noConflict();
Igor Jerosimić il

9

Questa soluzione sembra funzionare bene per me.

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

9

Che ne dici di usare invece i popover Bootstrap invece? I popover BS non creano lo stesso conflitto sebbene richiedano lo stesso componente tooltip.js. Sì, sono più stilizzati ma non rendono i miei pulsanti dell'interfaccia utente di JQuery instabili.

Sto usando l'interfaccia utente di Jquery solo per il completamento automatico / caselle combinate personalizzate (quindi non posso affermare che altri controlli JQ-UI sono ok) e nessuna delle precedenti ha funzionato per risolvere il problema CSS sui pulsanti della casella combinata diventando "non stilato" quando si richiama BS Tooltips. Passare a BS Popovers ha essenzialmente fornito lo stesso effetto senza conflitti, senza riordinare le mie importazioni di script e non sono necessarie dichiarazioni esplicite sul bridge.


3
In questo modo, molto pragmatico
Mark Stratmann,

Grazie per la punta, sono d'accordo, è una soluzione alternativa che evita tutta la complessità.
Tom,

Sì amico, non si risolvono tutti gli incubi e sembra tremolante come un limone!
Piotr Kula,

I popover non richiedono tooltip come pre-req?
MrKobayashi,

3

prova a usare jQuery.noConflict () e vedi se questo ti aiuta affatto. Sembra che bootstrap e jQuery stiano usando lo stesso spazio dei nomi, e forse i toolstrap bootstrap e jQuery vengono caricati nella stessa funzione o uno viene caricato per primo.

Puoi anche controllare per vedere quale libreria è stata caricata per prima. Di solito se si dichiara la stessa funzione due volte in JavaScript, la seconda è quella utilizzata.

In terzo luogo, controlla il pacchetto jQueryUI ( sul loro sito Web) e vedi se riesci a scaricare una versione che non ha i suggerimenti inclusi (ho controllato e questo è totalmente fattibile).


Quindi questo è strano ... Sto caricando le librerie javascript nello stesso ordine ma quando stavo riscontrando il problema, stavo caricando la libreria jquery-ui prima del mio tag <body> e del bootstrap.js dopo tutto il mio contenuto. Ho spostato bootstrap.js sopra il mio contenuto (ma ancora dopo jquery-ui.js) e ora sta eseguendo il rendering delle descrizioni come mi aspetterei. Spero che questo non rovini l'universo del mio sito web. Ho pensato che fosse buona prassi caricare il javascript che potevi dopo il contenuto per motivi di prestazioni ... strano.
markdotnet,

è la migliore pratica. Forse il bootstrap deve essere al top?
Matt,

Bootstrap JS sicuramente non ha bisogno di essere in cima alla pagina.
Paul Phillips,

3

C'è una soluzione facile e buona, basta riorganizzare il tuo bootstrap e il tuo link al file dell'interfaccia utente in questo modo:

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

Basta caricare jQueryui prima di caricare il file jostra boostrap. Per me è un lavoro.


1
Un giorno ti mancherà l'icona di chiusura nelle finestre di dialogo usando tale approccio. stackoverflow.com/questions/17367736/...
Oleksii Kyslytsyn

sovrascriverà tutte le proprietà comuni dell'interfaccia utente con bootstrap min e non potrà utilizzarle entrambe, se necessario
Projesh Pal

1

Un modo semplice è caricare bootstrap.js dopo jquery-ui.js, in modo che bootstrap .tooltip sovrascriva l'interfaccia utente di jquery. Se stai usando un caricatore di moduli come requestjs, allora potresti fare in modo che bootstrap dipenda da jquery-ui, come tale:

requirejs.config({
    baseUrl: 'js',
    waitSeconds: 30,
    shim: {
        'bootstrap': {
            deps: [ 'jquery', 'jquery-ui' ]
        },...
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.