jQueryUI Tooltips bersaing dengan Bootstrap Twitter

141

Saya telah berhasil mendapatkan beberapa tip alat untuk bekerja pada akhirnya dengan kode berikut:

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

lalu

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

Masalah yang saya temui adalah ia menggunakan tooltips jQueryUI (tanpa panah, tooltips yang jelek), bukan Bootstraps.

Apa yang harus saya lakukan untuk menggunakan Bootstrap Tooltips alih-alih jQueryUI?

markdotnet
sumber
apakah Anda perlu memiliki kedua hal tersebut?
Matt
Tidak ... Saya hanya ingin memiliki tooltips Bootstrap.
markdotnet
maaf, maksud saya apakah Anda perlu memiliki jquery ui AND bootstrap?
Matt
1
Ini berhasil untuk saya, periksa jawaban
Poncho
1
@markdotnet: salah Bootstrap membutuhkan pustaka JQuery inti, bukan JQuery.UI.
Ian Kemp

Jawaban:

191

UI jQuery dan Bootstrap digunakan tooltipuntuk nama plugin. Gunakan $.widget.bridgeuntuk membuat nama lain untuk versi jQuery UI dan memungkinkan plugin Bootstrap tetap bernama tooltip (mencoba menggunakan noConflictopsi pada widget Bootstrap hanya menghasilkan banyak kesalahan karena tidak berfungsi dengan baik; masalah itu telah dilaporkan di sini ):

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

Jadi kode untuk membuatnya bekerja:

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

Bagus salin kode tempel yang juga menangani konflik tombol:

<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>
Demz
sumber
1
Saya mendapatkan kesalahan js ketika saya mencoba ini. 'undefined' is not an object (evaluating '$.widget.bridge')
covard
2
covar - apakah Anda memastikan bahwa Anda mendapatkan semua skrip src yang diimpor? Dan apakah Anda menggunakan versi lib yang lebih baru?
The Demz
1
@covard: Penting bahwa Anda pertama-tama mengimpor jquery-ui, kemudian melakukan bridgehal itu, lalu mengimpor bootstrap.
Joshua Muheim
2
solusi yang menyusahkan jika Anda memiliki semuanya dibundel dan diperkecil .. tidak ada cara untuk menempatkan skrip ini di antara entah bagaimana .. sial, nama tabrakan sampah.
Piotr Kula
2
jika Anda menggunakan bundel webpack dengan kode minified, Anda cukup meletakkan jquery-ui sebelum bootstrap.js
Raj
69

Solusi sederhana adalah memuat bootrap.js setelah jquery-ui.js, sehingga metode bootstrap .tooltip diutamakan.

Stefan Musarra
sumber
2
Ini bekerja untuk saya dan merupakan cara termudah. Saya sarankan menambahkan komentar HTML yang menyatakan bahwa satu perpustakaan harus dimuat setelah yang lain.
Paul
1
Suatu hari Anda akan kehilangan ikon dekat dalam dialog dengan menggunakan pendekatan tersebut. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn
Solusi ini tidak berhasil untuk saya. Menggunakan Chrome, saya akan "menghapus cache dan menyegarkan" halaman dan tooltip kadang-kadang akan berfungsi dan kadang-kadang tidak (tidak ada kesalahan di console.log). Menyegarkan 30 kali menghasilkan hasil kerja 7 kali. Saya kemudian pergi dan mengunduh paket UI jQuery yang disesuaikan dan sekarang ketika saya "menghapus cache dan menyegarkan" 30 kali, saya mendapatkan hasil kerja 30 kali dengan 0 kesalahan. Saya juga akan menambahkan bahwa saya menggunakan require.js sehingga saya dapat dengan mudah mengontrol urutan perpustakaan yang dimuat.
HPWD
Aku MENCINTAIMU untuk perbaikan logis yang paling sederhana ini
Milind
30

Ini bekerja untuk saya:

Jika Anda perlu menggunakan JQuery-UI tetapi Anda ingin menggunakan tooltip bootstrap, cukup dapatkan versi khusus JQuery-UI dari situs web ini .

Hapus centang opsi "Tooltip", dan unduh (itu akan menjadi sesuatu seperti "jquery-ui-1.10.4.custom.js").

Cukup tambahkan ke proyek Anda alih-alih versi yang Anda gunakan sekarang dan, Anda siap berpesta. Ini akan menghindari konflik. Itu bekerja seperti pesona bagiku!

Ponco
sumber
1
Jadi, Anda masih mengunduh file aset dari setiap sisi per tangan alih-alih menggunakan alat seperti bower? Bagaimana Anda menginstal perpustakaan pihak ketiga secara umum? Cari di google dan unduh dari situs mana saja?
user3746259
bagaimana kalau saya tidak ingin menggunakan tooltip bootstrap tetapi UI sebagai gantinya .. mereka yang menyebabkan masalah dengan cara apapun.
Piotr Kula
2
Sederhana, mudah, bekerja sangat baik untuk situasi saya. Terima kasih! +1
Chris Kempen
Bekerja untuk saya - benar-benar telah membenturkan kepalaku atas ini - ditambah satu - terima kasih
gchq
Jawaban yang paling masuk akal, selama itu menyarankan untuk hanya mengambil fungsionalitas yang diperlukan. Terima kasih
Oleksii Kyslytsyn
30

Jika Anda harus memuat jquery-ui.jssetelah di bootstrap.jssini adalah bagaimana melakukannya:

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

Ini akan menimpa tooltip jquery-ui dan selalu menggunakan bootstraps.

supersan
sumber
1
dalam solusi Anda ui tooltip akan ditimpa dengan bootstrap tetapi jika ada orang yang tidak ingin menimpa harus menggunakan solusi sebelumnya
Projesh Pal
Suatu hari Anda akan kehilangan ikon dekat dalam dialog dengan menggunakan pendekatan tersebut. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn
solusi hebat!
Ivan Ferrer
18

Dengan asumsi bahwa UI akan dipanggil setelah bootsrap diinisialisasi

Simpan fungsi bootstrap tepat sebelum UI diinisialisasi

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

Kemudian sebut sebagai berikut

$('.targetClass').bstooltip();
Projesh Pal
sumber
Cara resmi $.fn.bstooltip = $.fn.tooltip.noConflict();
Igor Jerosimić
9

Solusi ini sepertinya bekerja dengan baik untuk saya.

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

Bagaimana kalau hanya menggunakan popover Bootstrap saja? BS popovers tidak menciptakan konflik yang sama walaupun mereka memerlukan komponen tooltip.js yang sama. Ya, mereka lebih bergaya tetapi tidak menyebabkan tombol JQuery UI saya menjadi miring.

Saya menggunakan Jquery UI hanya untuk autocomplete / comboboxes kustom (jadi tidak bisa mengklaim kontrol JQ-UI lainnya ok) dan tidak ada yang di atas bekerja untuk memperbaiki masalah CSS pada tombol combobox menjadi "unstyled" ketika menggunakan BS Tooltips. Beralih ke BS Popovers pada dasarnya memberikan efek yang sama tanpa konflik, tanpa pemesanan ulang impor skrip saya, dan tidak diperlukan pernyataan jembatan yang eksplisit.

AgonyOfVictory
sumber
3
Seperti ini, sangat pragmatis
Mark Stratmann
Terima kasih atas tipnya, saya setuju, ini adalah solusi yang menghindari semua kompleksitas.
Tom
Ya ampun, salah satu memecahkan semua mimpi buruk dan terlihat seperti jeruk!
Piotr Kula
Bukankah popover memerlukan tooltip sebagai pra-req?
MrKobayashi
3

coba gunakan jQuery.noConflict () dan lihat apakah itu membantu Anda sama sekali. Sepertinya bootstrap dan jQuery menggunakan namespace yang sama, dan mungkin tooltips bootstrap dan jQuery dimuat ke dalam fungsi yang sama, atau yang dimuat terlebih dahulu.

Anda juga dapat memeriksa untuk melihat perpustakaan mana yang dimuat terlebih dahulu. Biasanya jika Anda mendeklarasikan fungsi yang sama dua kali dalam javascript, yang kedua adalah yang digunakan.

Ketiga, periksa paket jQueryUI ( di situs web mereka) dan lihat apakah Anda dapat mengunduh versi yang tidak menyertakan tooltips (saya memeriksa dan ini benar-benar dapat dilakukan).

Mat
sumber
Jadi ini aneh ... Saya memuat perpustakaan javascript dalam urutan yang sama tetapi ketika saya mengalami masalah, saya memuat perpustakaan jquery-ui sebelum tag <body> dan bootstrap.js setelah semua konten saya. Saya memindahkan bootstrap.js di atas konten saya (tetapi masih setelah jquery-ui.js) dan sekarang ini merender tooltips seperti yang saya harapkan. Saya harap ini tidak mengacaukan dunia situs web saya. Saya pikir itu praktik terbaik untuk memuat javascript yang Anda bisa setelah konten untuk alasan kinerja ... aneh.
markdotnet
ini adalah praktik terbaik. Mungkin bootstrap harus di atas?
Matt
Bootstrap JS jelas tidak perlu berada di bagian atas halaman.
Paul Phillips
3

Ada solusi yang mudah dan bagus, atur ulang tautan file bootstrap dan jquery ui Anda seperti ini:

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

Hanya memuat jQueryui sebelum memuat file js boostrap. Ini bekerja untuk saya.

Sanjib Debnath
sumber
1
Suatu hari Anda akan kehilangan ikon dekat dalam dialog dengan menggunakan pendekatan tersebut. stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn
itu akan mengesampingkan semua properti umum ui dengan min bootstrap dan tidak dapat menggunakan keduanya jika diperlukan
Projesh Pal
1

Cara mudah adalah memuat bootstrap.js setelah jquery-ui.js, sehingga bootstrap .tooltip menimpa UI jquery. Jika Anda menggunakan pemuat modul seperti requireejs, maka Anda bisa membuat bootstrap bergantung pada jquery-ui, seperti:

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