คำแนะนำเครื่องมือ 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 Tooltips แทน jQueryUI


คุณต้องมีทั้งสองอย่างไหม?
แมตต์

ไม่ ... ฉันแค่ต้องการมีคำแนะนำเครื่องมือ Bootstrap
markdotnet

ขอโทษฉันหมายถึงคุณจำเป็นต้องมี jQuery ui และ bootstrap?
แมตต์

1
สิ่งนี้ใช้ได้สำหรับฉันชำระเงินคำตอบ
Poncho

1
@markdotnet: ไม่ถูกต้อง Bootstrap ต้องการไลบรารี JQuery หลักไม่ใช่ JQuery.UI
Ian Kemp

คำตอบ:


192

ทั้ง jQuery UI และ Bootstrap ใช้tooltipสำหรับชื่อของปลั๊กอิน ใช้$.widget.bridgeเพื่อสร้างชื่ออื่นสำหรับ jQuery UI version และอนุญาตให้ปลั๊กอิน Bootstrap อยู่ที่ชื่อ tooltip (พยายามที่จะใช้noConflictตัวเลือกในวิดเจ็ต Bootstrap เพียงแค่ส่งผลให้เกิดข้อผิดพลาดมากมายเพราะมันทำงานไม่ถูกต้องปัญหานี้ได้รับการรายงานแล้วที่นี่ ):

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

2
covar - คุณแน่ใจหรือไม่ว่าคุณได้รับสคริปต์ src ทั้งหมดที่นำเข้า และคุณใช้ libs เวอร์ชันใหม่กว่านี้หรือไม่?
Demz

1
@covard: สิ่งสำคัญคือคุณต้องนำเข้า jquery-ui ก่อนจากนั้นจึงทำbridgeสิ่งนั้นแล้วนำเข้า bootstrap
Joshua Muheim

2
วิธีแก้ปัญหาซึ่งเป็นความเจ็บปวดถ้าคุณมีทุกอย่างรวมกันและลดขนาด .. ไม่มีวิธีที่จะทำให้สคริปต์นี้อยู่ระหว่าง .. อย่างใด .. dammit, ขยะชื่อชน
Piotr Kula

2
ถ้าคุณกำลังใช้การรวมกลุ่ม webpack ด้วยรหัส minified คุณก็สามารถใส่ jQuery UI-ก่อน bootstrap.js
การปกครอง

69

ทางออกที่ง่ายคือการโหลด bootrap.js หลังจาก jquery-ui.js เพื่อให้วิธี bootstrap .tooltip มีความสำคัญ


2
สิ่งนี้ใช้ได้กับฉันและเป็นวิธีที่ง่ายที่สุด ฉันแนะนำให้เพิ่มความคิดเห็น HTML โดยระบุว่าจะต้องโหลดไลบรารีหนึ่งหลังอีกไลบรารีหนึ่ง
พอล

1
วันหนึ่งคุณจะหายไปใกล้ไอคอนในกล่องโต้ตอบโดยใช้วิธีการดังกล่าว stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn

วิธีนี้ไม่ได้ผลสำหรับฉัน เมื่อใช้ Chrome ฉันจะ "ล้างแคชและรีเฟรชฮาร์ด" หน้านี้และคำแนะนำเครื่องมือจะใช้งานได้ในบางครั้งและบางครั้งก็ไม่ได้ (ไม่มีข้อผิดพลาดใน console.log) การรีเฟรช 30 ครั้งให้ผลลัพธ์การทำงาน 7 ครั้ง ฉันไปแล้วและดาวน์โหลดแพ็คเกจ jQuery UI ที่กำหนดเองและตอนนี้เมื่อฉัน "ล้างแคชและรีเฟรชฮาร์ด" 30 ครั้งฉันได้ผลลัพธ์ 30 ครั้งโดยมีข้อผิดพลาด 0 ครั้ง ฉันจะเพิ่มว่าฉันใช้ require.js เพื่อให้ฉันสามารถควบคุมลำดับที่โหลดไลบรารีได้อย่างง่ายดาย
HPWD

ฉันรักคุณสำหรับการแก้ปัญหาแบบลอจิคัลที่ง่ายที่สุดนี้
Milind

30

สิ่งนี้ใช้ได้กับฉัน:

หากคุณต้องการใช้ JQuery-UI แต่คุณต้องการใช้คำแนะนำเครื่องมือของ bootstrap เพียงแค่รับ JQuery-UI รุ่นที่กำหนดเองจากเว็บไซต์นี้

เพียงยกเลิกการเลือกตัวเลือก "คำแนะนำเครื่องมือ" และดาวน์โหลด (มันจะเป็นสิ่งที่ "jquery-ui-1.10.4.custom.js")

เพียงเพิ่มลงในโครงการของคุณแทนที่จะเป็นรุ่นที่คุณใช้อยู่ในขณะนี้และคุณพร้อมที่จะปาร์ตี้ สิ่งนี้จะหลีกเลี่ยงความขัดแย้ง มันใช้งานได้อย่างมีเสน่ห์สำหรับฉัน!


1
ดังนั้นคุณยังคงดาวน์โหลดไฟล์เนื้อหาจากแต่ละด้านต่อมือแทนที่จะใช้เครื่องมือเช่น bower? คุณจะติดตั้งไลบรารีบุคคลที่สามได้อย่างไร? ค้นหาใน google เพื่อค้นหาและดาวน์โหลดจากเว็บไซต์ใด ๆ
3746259

ฉันไม่ต้องการใช้ bootstrap tooltip แต่เป็น UI แทน .. พวกมันทำให้เกิดปัญหา แต่อย่างใด
Piotr Kula

2
เรียบง่ายใช้งานได้ดีกับสถานการณ์ของฉัน ขอบคุณ! +1
Chris Kempen

ทำงานให้ฉัน - ได้ต่อสู้กับหัวของฉันจริงๆ - บวกหนึ่ง - ขอบคุณ
gchq

คำตอบที่เหมาะสมที่สุดตราบใดที่มันแนะนำให้ใช้เฉพาะฟังก์ชั่นที่จำเป็น ขอบคุณ
Oleksii Kyslytsyn

30

ในกรณีที่คุณต้องโหลดjquery-ui.jsหลังจากbootstrap.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 และใช้ bootstraps เสมอ


1
ในโซลูชันของคุณ ui tooltip จะถูกเขียนทับด้วย bootstrap แต่หากร่างกายไม่ต้องการเขียนทับต้องใช้วิธีแก้ไขปัญหาก่อนหน้านี้
Projesh Pal

วันหนึ่งคุณจะหายไปใกล้ไอคอนในกล่องโต้ตอบโดยใช้วิธีการดังกล่าว stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn

ทางออกที่ดี!
Ivan Ferrer

18

สมมติว่า UI จะเรียกใช้หลังจาก bootsrap เริ่มต้นแล้ว

จัดเก็บฟังก์ชั่น bootstrap ก่อนที่จะเริ่มการทำงานของ UI

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

จากนั้นเรียกมันดังต่อไปนี้

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

วิธีเป็นทางการ $.fn.bstooltip = $.fn.tooltip.noConflict();
Igor Jerosimić


9

ลองใช้ Bootstrap popovers แทนล่ะ BS popovers ไม่ได้สร้างความขัดแย้งเดียวกันแม้ว่าพวกเขาต้องการส่วนประกอบ tooltip.js เดียวกัน ใช่มันมีสไตล์มากกว่า แต่ไม่ทำให้ปุ่ม JQuery UI ของฉันสกปรก

ฉันใช้ Jquery UI สำหรับการเติมข้อความอัตโนมัติอัตโนมัติ / คอมโบบ็อกซ์ที่กำหนดเองเท่านั้น (ดังนั้นจึงไม่สามารถอ้างสิทธิ์การควบคุม JQ-UI อื่น ๆ ได้) และไม่มีการแก้ไขใด ๆ ข้างต้นเพื่อแก้ไขปัญหา CSS บนปุ่ม combobox กลายเป็น "unstyled" เมื่อเรียกใช้ การเปลี่ยนมาใช้ BS Popovers นั้นให้ผลเหมือนกันโดยไม่มีความขัดแย้งไม่มีการเรียงลำดับใหม่ของการนำเข้าสคริปต์ของฉันและไม่จำเป็นต้องมีคำสั่งบริดจ์อย่างชัดเจน


3
แบบนี้ในทางปฏิบัติอย่างมาก
Mark Stratmann

ขอบคุณสำหรับเคล็ดลับฉันเห็นด้วยมันเป็นวิธีแก้ปัญหาที่หลีกเลี่ยงความซับซ้อนทั้งหมด
Tom

จาจาชายคนหนึ่งคลี่คลายความฝันทั้งหมดออกไปและดู shweet เหมือนมะนาว!
Piotr Kula

ป๊อปอัปไม่ต้องใช้คำแนะนำเครื่องมือเป็นคำสั่งล่วงหน้าหรือไม่
MrKobayashi

3

ลองใช้jQuery.noConflict ()และดูว่าช่วยคุณได้ไหม ดูเหมือนว่า bootstrap และ jQuery กำลังใช้เนมสเปซเดียวกันและบางทีคำแนะนำเครื่องมือ bootstrap และ jQuery ได้รับการโหลดลงในฟังก์ชั่นเดียวกันหรือได้รับการโหลดครั้งแรก

นอกจากนี้คุณยังสามารถตรวจสอบเพื่อดูว่าไลบรารีใดถูกโหลดก่อน โดยปกติถ้าคุณประกาศฟังก์ชั่นเดียวกันสองครั้งในจาวาสคริปต์ส่วนที่สองคือฟังก์ชั่นที่ใช้

ประการที่สามตรวจสอบแพ็คเกจ jQueryUI ( บนเว็บไซต์ของพวกเขา)และดูว่าคุณสามารถดาวน์โหลดเวอร์ชันที่ไม่มีทูลทิปรวมอยู่หรือไม่ (ฉันตรวจสอบแล้วและนี่เป็นไปได้ทั้งหมด)


ดังนั้นนี่แปลก ... ฉันกำลังโหลดไลบรารี javascript ตามลำดับเดียวกัน แต่เมื่อฉันมีปัญหาฉันกำลังโหลดไลบรารี jquery-ui หน้าแท็ก <body> และ bootstrap.js หลังจากเนื้อหาทั้งหมดของฉัน ฉันย้าย bootstrap.js เหนือเนื้อหาของฉัน (แต่ยังอยู่หลัง jquery-ui.js) และตอนนี้ก็แสดงคำแนะนำเครื่องมืออย่างที่ฉันคาดไว้ ฉันหวังว่านี่จะไม่ทำให้จักรวาลของเว็บไซต์สับสน ฉันคิดว่ามันเป็นแนวปฏิบัติที่ดีที่สุดในการโหลด javascript ที่คุณสามารถทำได้หลังจากเนื้อหาด้วยเหตุผลด้านประสิทธิภาพ ... แปลก
markdotnet

มันเป็นวิธีปฏิบัติที่ดีที่สุด บางที bootstrap ต้องอยู่ด้านบนใช่ไหม
แมตต์

Bootstrap JS ไม่จำเป็นต้องอยู่ด้านบนสุดของหน้าแน่นอน
พอลฟิลลิป

3

มีวิธีแก้ปัญหาที่ง่ายและดีเพียงแค่จัดเรียงไฟล์ bootstrap และ jquery ui ของคุณใหม่ดังนี้:

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

เพียงโหลด jQueryui ก่อนที่จะโหลดไฟล์ boostrap js มันใช้งานได้สำหรับฉัน


1
วันหนึ่งคุณจะหายไปใกล้ไอคอนในกล่องโต้ตอบโดยใช้วิธีการดังกล่าว stackoverflow.com/questions/17367736/…
Oleksii Kyslytsyn

มันจะแทนที่คุณสมบัติทั่วไปทั้งหมดของ UI กับบูตนาทีและไม่สามารถใช้งานได้ทั้งในกรณีที่จำเป็น
Projesh Pal

1

วิธีที่ง่ายคือการโหลด bootstrap.js หลังจาก jquery-ui.js ดังนั้น bootstrap .tooltip จะแทนที่ jquery UI หากคุณใช้โมดูลโหลดเดอร์เช่น requirejs คุณสามารถทำให้ bootstrap ขึ้นอยู่กับ jquery-ui เช่น:

requirejs.config({
    baseUrl: 'js',
    waitSeconds: 30,
    shim: {
        'bootstrap': {
            deps: [ 'jquery', 'jquery-ui' ]
        },...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.