擴(kuò)展Bootstrap Tooltip插件使其可交互的方法
本文實(shí)例講述了擴(kuò)展Bootstrap Tooltip插件使其可交互的方法。分享給大家供大家參考,具體如下:
最近在公司某項(xiàng)目開發(fā)中遇見一特殊需求,請(qǐng)筆者幫助,因此有了本文的插件。在前端開發(fā)中tooltip是一個(gè)極其常用的插件,它能更好向使用者展示更多的文檔等幫助信息。它們通常都是一些靜態(tài)文本信息。但同事他們的需求是需要?jiǎng)討B(tài)交互,在文本信息中存在幫助網(wǎng)頁的鏈接。如果使用常規(guī)tooltip,則在用戶移出tooltip依賴DOM節(jié)點(diǎn)后,tooltip panel則將被隱藏。所以用戶沒有辦法點(diǎn)擊到這些交互鏈接。
所以我們期望:給用戶一定的時(shí)間使得用戶能夠?qū)⑹髽?biāo)從依賴節(jié)點(diǎn)移動(dòng)到tooltip panel;并且如果用戶鼠標(biāo)停留在tooltip上則不能隱藏,使得用戶能夠與位于tooltip上的鏈接或者是其他form表單控件交互。
也許你覺得這并不難,在網(wǎng)上Google就有很多代碼可直接使用。是的,如下面這段來自plnkr.co的代碼(http://plnkr.co/edit/x2VMhh?p=preview):
$(".pop").popover({ trigger: "manual" , html: true, animation:false})
.on("mouseenter", function () {
var _this = this;
$(this).popover("show");
$(".popover").on("mouseleave", function () {
$(_this).popover('hide');
});
}).on("mouseleave", function () {
var _this = this;
setTimeout(function () {
if (!$(".popover:hover").length) {
$(_this).popover("hide");
}
}, 300);
});
它是使用bootstrap的popover來實(shí)現(xiàn)的,從bootstrap的源碼能看到popover是繼承至tooltip的組件之一。這里是通過將popover的觸發(fā)方式設(shè)為手動(dòng)觸發(fā),由我們自己來控制顯示和隱藏它的時(shí)機(jī)。并且在依賴節(jié)點(diǎn)離開的時(shí)候,給定300ms的延遲等待用戶進(jìn)入tooltip panel,如果300ms還沒有進(jìn)入tooltip則隱藏它。否則就阻止隱藏tooltip的邏輯。
這代碼雖然功能可用,但具有代碼潔癖的博主并不太滿意這樣的代碼。它難以閱讀維護(hù),同時(shí)重用性也將極差。所以筆者決定要以bootstrap插件方式來一bs way寫這款插件。
當(dāng)筆者查閱bootstrap tooltip源碼時(shí),發(fā)現(xiàn)它是一個(gè)擴(kuò)展性很不錯(cuò)的插件。tooltip的顯示和隱藏依賴于它內(nèi)部的hoverState狀態(tài)來控制,in代表在依賴節(jié)點(diǎn)元素之上,out則代表移出了DOM元素。并且它也支持延遲動(dòng)畫機(jī)制。所以我們可以如下方式控制hoverState的狀態(tài):
var DelayTooltip = function (element, options) {
this.init('delayTooltip', element, options);
this.initDelayTooltip();
};
DelayTooltip.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
trigger: 'hover',
delay: {hide: 300}
});
DelayTooltip.prototype.delayTooltipEnter = function(){
this.hoverState = 'in';
};
DelayTooltip.prototype.delayTooltipLeave = function(){
this.hoverState = 'out';
this.leave(this);
};
DelayTooltip.prototype.initDelayTooltip = function(){
this.tip()
.on('mouseenter.' + this.type, $.proxy(this.delayTooltipEnter, this))
.on('mouseleave.' + this.type, $.proxy(this.delayTooltipLeave, this));
};
這里在構(gòu)造tooltip對(duì)象同時(shí)也注冊(cè)tooltip panel的mouseenter、mouseleave.事件,并設(shè)置對(duì)應(yīng)的hoverState狀態(tài)。當(dāng)移出tooltip panel時(shí),這里需要手動(dòng)的調(diào)用來自tooltip繼類的leave方法。對(duì)于隱藏延時(shí)則設(shè)置在默認(rèn)option中,使其能夠可配置。
上面的代碼就是我們所需要擴(kuò)展tooltip的所有的代碼。當(dāng)然要想作為一個(gè)通用的bootstrap插件,還需要它固定的插件配置代碼。插件全部代碼如下:
(function ($) {
'use strict';
var DelayTooltip = function (element, options) {
this.init('delayTooltip', element, options);
this.initDelayTooltip();
};
if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js');
DelayTooltip.VERSION = '0.1';
DelayTooltip.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
trigger: 'hover',
delay: {hide: 300}
});
DelayTooltip.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype);
DelayTooltip.prototype.constructor = DelayTooltip;
DelayTooltip.prototype.getDefaults = function () {
return DelayTooltip.DEFAULTS;
};
DelayTooltip.prototype.delayTooltipEnter = function(){
this.hoverState = 'in';
};
DelayTooltip.prototype.delayTooltipLeave = function(){
this.hoverState = 'out';
this.leave(this);
};
DelayTooltip.prototype.initDelayTooltip = function(){
this.tip()
.on('mouseenter.' + this.type, $.proxy(this.delayTooltipEnter, this))
.on('mouseleave.' + this.type, $.proxy(this.delayTooltipLeave, this));
};
function Plugin(option) {
return this.each(function () {
var $this = $(this);
var data = $this.data('bs.delayTooltip');
var options = typeof option == 'object' && option;
if (!data && /destroy|hide/.test(option)) return;
if (!data) $this.data('bs.delayTooltip', (data = new DelayTooltip(this, options)));
if (typeof option == 'string') data[option]();
});
}
var old = $.fn.delayTooltip;
$.fn.delayTooltip = Plugin;
$.fn.delayTooltip.Constructor = DelayTooltip;
$.fn.delayTooltip.noConflict = function () {
$.fn.delayTooltip = old;
return this;
};
})(jQuery);
這里基本都是bootstrap插件機(jī)制的固定模板,僅僅需要套用上就行。有了這個(gè)插件擴(kuò)展,那么我們就可以如下使用這款插件:
HTML:
<div id="tooltip">bs tooltip:你能點(diǎn)擊鏈接?</div> <hr> <div id="delayTooltip">delay tooltip:嘗試點(diǎn)擊鏈接</div> <hr> <div id="delayTooltipInHtml" data-html="true" data-placement="bottom" data-toggle="delayTooltip">delay tooltip:利用html標(biāo)簽實(shí)現(xiàn)</div>
JavaScript 代碼:
(function(global, $){
var page = function(){
};
page.prototype.bootstrap = function(){
var html = 'Weclome to my blog <a target="_blank" href="greengerong.github.io">破狼博客</a>!<input type="text" placeholder="input some thing"/>';
$('#tooltip').tooltip( {
html: true,
placement: 'top',
title: html
});
$('#delayTooltip').delayTooltip( {
html: true,
placement: 'bottom',
title: html
});
$('#delayTooltipInHtml').attr('title', html).delayTooltip();
return this;
};
global.Page = page;
})(this, jQuery);
$(function(){
'use strict';
var page = new window.Page().bootstrap();
//
});
這款插件既支持jQuery在HTML中聲明屬性的方式,同時(shí)也可以在javascript中使用。效果如下:

希望本文所述對(duì)大家基于bootstrap的程序設(shè)計(jì)有所幫助。
相關(guān)文章
JavaScript中實(shí)現(xiàn)在光標(biāo)位置插入內(nèi)容的幾種方法
本文主要介紹了在網(wǎng)頁開發(fā)中,如何使用JavaScript在文本輸入框或富文本編輯器的光標(biāo)位置插入內(nèi)容的實(shí)踐,包括獲取光標(biāo)位置的方法,創(chuàng)建文本節(jié)點(diǎn),操作Selection對(duì)象,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10
微信小程序如何設(shè)置基本的頁面樣式,做出用戶界面UI
這篇文章主要介紹了微信小程序如何設(shè)置基本的頁面樣式,做出用戶界面UI。如何為這個(gè)頁面添加樣式,使它看上去更美觀,教大家寫出實(shí)際可以使用的頁面。2022-12-12
游戲開發(fā)中如何使用CocosCreator進(jìn)行音效處理
這篇文章主要介紹了游戲開發(fā)中如何使用CocosCreator進(jìn)行音效處理,并對(duì)音效組件進(jìn)行封裝,方便以后使用,同學(xué)們看完之后,一定要親手實(shí)驗(yàn)一下2021-04-04
錯(cuò)誤剖析之JavaScript的9個(gè)陷阱及評(píng)點(diǎn)
錯(cuò)誤剖析之JavaScript的9個(gè)陷阱及評(píng)點(diǎn)...2007-08-08
JS實(shí)現(xiàn)自定義簡(jiǎn)單網(wǎng)頁軟鍵盤效果代碼
這篇文章主要介紹了JS實(shí)現(xiàn)自定義簡(jiǎn)單網(wǎng)頁軟鍵盤效果代碼,可實(shí)現(xiàn)簡(jiǎn)單模擬鍵盤布局及響應(yīng)鼠標(biāo)點(diǎn)擊按下鍵盤按鍵功能,簡(jiǎn)單實(shí)用,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11

