擴(kuò)展Bootstrap Tooltip插件使其可交互的方法
本文實(shí)例講述了擴(kuò)展Bootstrap Tooltip插件使其可交互的方法。分享給大家供大家參考,具體如下:
最近在公司某項(xiàng)目開(kāi)發(fā)中遇見(jiàn)一特殊需求,請(qǐng)筆者幫助,因此有了本文的插件。在前端開(kāi)發(fā)中tooltip是一個(gè)極其常用的插件,它能更好向使用者展示更多的文檔等幫助信息。它們通常都是一些靜態(tài)文本信息。但同事他們的需求是需要?jiǎng)討B(tài)交互,在文本信息中存在幫助網(wǎng)頁(yè)的鏈接。如果使用常規(guī)tooltip,則在用戶移出tooltip依賴DOM節(jié)點(diǎn)后,tooltip panel則將被隱藏。所以用戶沒(méi)有辦法點(diǎn)擊到這些交互鏈接。
所以我們期望:給用戶一定的時(shí)間使得用戶能夠?qū)⑹髽?biāo)從依賴節(jié)點(diǎn)移動(dòng)到tooltip panel;并且如果用戶鼠標(biāo)停留在tooltip上則不能隱藏,使得用戶能夠與位于tooltip上的鏈接或者是其他form表單控件交互。
也許你覺(jué)得這并不難,在網(wǎng)上Google就有很多代碼可直接使用。是的,如下面這段來(lái)自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來(lái)實(shí)現(xiàn)的,從bootstrap的源碼能看到popover是繼承至tooltip的組件之一。這里是通過(guò)將popover的觸發(fā)方式設(shè)為手動(dòng)觸發(fā),由我們自己來(lái)控制顯示和隱藏它的時(shí)機(jī)。并且在依賴節(jié)點(diǎn)離開(kāi)的時(shí)候,給定300ms的延遲等待用戶進(jìn)入tooltip panel,如果300ms還沒(méi)有進(jìn)入tooltip則隱藏它。否則就阻止隱藏tooltip的邏輯。
這代碼雖然功能可用,但具有代碼潔癖的博主并不太滿意這樣的代碼。它難以閱讀維護(hù),同時(shí)重用性也將極差。所以筆者決定要以bootstrap插件方式來(lái)一bs way寫(xiě)這款插件。
當(dāng)筆者查閱bootstrap tooltip源碼時(shí),發(fā)現(xiàn)它是一個(gè)擴(kuò)展性很不錯(cuò)的插件。tooltip的顯示和隱藏依賴于它內(nèi)部的hoverState狀態(tài)來(lái)控制,in代表在依賴節(jié)點(diǎn)元素之上,out則代表移出了DOM元素。并且它也支持延遲動(dòng)畫(huà)機(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)用來(lái)自tooltip繼類(lèi)的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ì)有所幫助。
- Bootstrap基本插件學(xué)習(xí)筆記之Tooltip提示工具(18)
- jquery.validate[.unobtrusive]和Bootstrap實(shí)現(xiàn)tooltip錯(cuò)誤提示問(wèn)題分析
- BootStrap tooltip提示框使用小結(jié)
- 基于jQuery.validate及Bootstrap的tooltip開(kāi)發(fā)氣泡樣式的表單校驗(yàn)組件思路詳解
- 全面解析Bootstrap中tooltip、popover的使用方法
- Bootstrap每天必學(xué)之工具提示(Tooltip)插件
- BootStrap Tooltip插件源碼解析
相關(guān)文章
js 數(shù)組的for循環(huán)到底應(yīng)該怎么寫(xiě)?
說(shuō)實(shí)話,我是個(gè)比較喜歡懷疑權(quán)威的人,但是在有些權(quán)威的問(wèn)題一直在我面前閃,閃啊閃,我就開(kāi)始不懷疑他們了,因?yàn)橛?0000個(gè)人說(shuō)這個(gè)東西是對(duì)的,我就會(huì)覺(jué)得它的確是對(duì)的吧。2010-05-05限制復(fù)選框最多選擇項(xiàng)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)?lái)一篇限制復(fù)選框最多選擇項(xiàng)的實(shí)現(xiàn)代碼。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-05-05JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)五子棋小游戲
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06深入理解JavaScript中的尾調(diào)用(Tail Call)
尾調(diào)用(Tail Call)是函數(shù)式編程的一個(gè)重要概念,下面這篇文章主要給大家深入的介紹了關(guān)于JavaScript中尾調(diào)用的相關(guān)資料,文中介紹的非常詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2017-02-02JavaScript實(shí)現(xiàn)加密與解密詳解
這篇文章介紹了JavaScript實(shí)現(xiàn)加密與解密詳解的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06JavaScript 直接操作本地文件的實(shí)現(xiàn)代碼
Chrome、IE和Firefox都紛紛在新版中增強(qiáng)了JavaScript引擎的執(zhí)行效率,隨著JavaScript效率在各大瀏覽器的顯著提高,JavaScript可以做越來(lái)越多的事,本地文件API的引入將讓很多有趣的功能成為現(xiàn)實(shí)。2009-12-12