最近在公司某项目开发中遇见一特殊需求,请笔者帮助,因此有了本文的插件。在前端开发中tooltip是一个极其常用的插件,它能更好向使用者展示更多的文档等帮助信息。它们通常都是一些静态文本信息。但同事他们的需求是需要动态交互,在文本信息中存在帮助网页的链接。如果使用常规tooltip,则在用户移出tooltip依赖DOM节点后,tooltip panel则将被隐藏。所以用户没有办法点击到这些交互链接。

所以我们期望:给用户一定的时间使得用户能够将鼠标从依赖节点移动到tooltip panel;并且如果用户鼠标停留在tooltip上则不能隐藏,使得用户能够与位于tooltip上的链接或者是其他form表单控件交互。

也许你觉得这并不难,在网上Google就有很多代码可直接使用。是的,如下面这段来自plnkr.co的代码(http://plnkr.co/edit/x2VMhh?p=preview):

  1. $(".pop").popover({ trigger: "manual" , html: true, animation:false})
  2. .on("mouseenter", function () {
  3. var _this = this;
  4. $(this).popover("show");
  5. $(".popover").on("mouseleave", function () {
  6. $(_this).popover('hide');
  7. });
  8. }).on("mouseleave", function () {
  9. var _this = this;
  10. setTimeout(function () {
  11. if (!$(".popover:hover").length) {
  12. $(_this).popover("hide");
  13. }
  14. }, 300);
  15. });

它是使用bootstrap的popover来实现的,从bootstrap的源码能看到popover是继承至tooltip的组件之一。这里是通过将popover的触发方式设为手动触发,由我们自己来控制显示和隐藏它的时机。并且在依赖节点离开的时候,给定300ms的延迟等待用户进入tooltip panel,如果300ms还没有进入tooltip则隐藏它。否则就阻止隐藏tooltip的逻辑。

这代码虽然功能可用,但具有代码洁癖的博主并不太满意这样的代码。它难以阅读维护,同时重用性也将极差。所以笔者决定要以bootstrap插件方式来一bs way写这款插件。

当笔者查阅bootstrap tooltip源码时,发现它是一个扩展性很不错的插件。tooltip的显示和隐藏依赖于它内部的hoverState状态来控制,in代表在依赖节点元素之上,out则代表移出了DOM元素。并且它也支持延迟动画机制。所以我们可以如下方式控制hoverState的状态:

  1. var DelayTooltip = function (element, options) {
  2. this.init('delayTooltip', element, options);
  3. this.initDelayTooltip();
  4. };
  5. DelayTooltip.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
  6. trigger: 'hover',
  7. delay: {hide: 300}
  8. });
  9. DelayTooltip.prototype.delayTooltipEnter = function(){
  10. this.hoverState = 'in';
  11. };
  12. DelayTooltip.prototype.delayTooltipLeave = function(){
  13. this.hoverState = 'out';
  14. this.leave(this);
  15. };
  16. DelayTooltip.prototype.initDelayTooltip = function(){
  17. this.tip()
  18. .on('mouseenter.' + this.type, $.proxy(this.delayTooltipEnter, this))
  19. .on('mouseleave.' + this.type, $.proxy(this.delayTooltipLeave, this));
  20. };

这里在构造tooltip对象同时也注册tooltip panel的mouseenter、mouseleave.事件,并设置对应的hoverState状态。当移出tooltip panel时,这里需要手动的调用来自tooltip继类的leave方法。对于隐藏延时则设置在默认option中,使其能够可配置。

上面的代码就是我们所需要扩展tooltip的所有的代码。当然要想作为一个通用的bootstrap插件,还需要它固定的插件配置代码。插件全部代码如下:

  1. (function ($) {
  2. 'use strict';
  3. var DelayTooltip = function (element, options) {
  4. this.init('delayTooltip', element, options);
  5. this.initDelayTooltip();
  6. };
  7. if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js');
  8. DelayTooltip.VERSION = '0.1';
  9. DelayTooltip.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
  10. trigger: 'hover',
  11. delay: {hide: 300}
  12. });
  13. DelayTooltip.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype);
  14. DelayTooltip.prototype.constructor = DelayTooltip;
  15. DelayTooltip.prototype.getDefaults = function () {
  16. return DelayTooltip.DEFAULTS;
  17. };
  18. DelayTooltip.prototype.delayTooltipEnter = function(){
  19. this.hoverState = 'in';
  20. };
  21. DelayTooltip.prototype.delayTooltipLeave = function(){
  22. this.hoverState = 'out';
  23. this.leave(this);
  24. };
  25. DelayTooltip.prototype.initDelayTooltip = function(){
  26. this.tip()
  27. .on('mouseenter.' + this.type, $.proxy(this.delayTooltipEnter, this))
  28. .on('mouseleave.' + this.type, $.proxy(this.delayTooltipLeave, this));
  29. };
  30. function Plugin(option) {
  31. return this.each(function () {
  32. var $this = $(this);
  33. var data = $this.data('bs.delayTooltip');
  34. var options = typeof option == 'object' && option;
  35. if (!data && /destroy|hide/.test(option)) return;
  36. if (!data) $this.data('bs.delayTooltip', (data = new DelayTooltip(this, options)));
  37. if (typeof option == 'string') data[option]();
  38. });
  39. }
  40. var old = $.fn.delayTooltip;
  41. $.fn.delayTooltip = Plugin;
  42. $.fn.delayTooltip.Constructor = DelayTooltip;
  43. $.fn.delayTooltip.noConflict = function () {
  44. $.fn.delayTooltip = old;
  45. return this;
  46. };
  47. })(jQuery);

这里基本都是bootstrap插件机制的固定模板,仅仅需要套用上就行。有了这个插件扩展,那么我们就可以如下使用这款插件:你也可以在jsbin中查看效果http://jsbin.com/wicoki/edit?html,js,output:

HTML:

  1. <div id="tooltip">bs tooltip:你能点击链接?</div>
  2. <hr>
  3. <div id="delayTooltip">delay tooltip:尝试点击链接</div>
  4. <hr>
  5. <div id="delayTooltipInHtml" data-html="true" data-placement="bottom" data-toggle="delayTooltip">delay tooltip:利用html标签实现</div>

JavaScript 代码:

  1. (function(global, $){
  2. var page = function(){
  3. };
  4. page.prototype.bootstrap = function(){
  5. var html = 'Weclome to my blog <a target="_blank" href="greengerong.github.io">破狼博客</a>!<input type="text" placeholder="input some thing"/>';
  6. $('#tooltip').tooltip( {
  7. html: true,
  8. placement: 'top',
  9. title: html
  10. });
  11. $('#delayTooltip').delayTooltip( {
  12. html: true,
  13. placement: 'bottom',
  14. title: html
  15. });
  16. $('#delayTooltipInHtml').attr('title', html).delayTooltip();
  17. return this;
  18. };
  19. global.Page = page;
  20. })(this, jQuery);
  21. $(function(){
  22. 'use strict';
  23. var page = new window.Page().bootstrap();
  24. //
  25. });

这款插件既支持jQuery在HTML中声明属性的方式,同时也可以在javascript中使用。效果如下:

扩展Bootstrap Tooltip插件使其可交互的更多相关文章

  1. bootstrap插件学习-bootstrap.tooltip.js

    先看bootstrap-tooltip.js的结构 var Tooltip = function ( element, options ){} // 构造器 Tooltip.prototype ={} ...

  2. Bootstrap 提示工具(Tooltip)插件的事件

    事件 下表列出了提示工具(Tooltip)插件中要用到的事件.这些事件可在函数中当钩子使用. 事件 描述 实例 show.bs.tooltip 当调用 show 实例方法时立即触发该事件. $('#m ...

  3. Bootstrap 提示工具(Tooltip)插件方法的用法

    方法 下面是一些提示工具(Tooltip)插件中有用的方法: 方法 描述 实例 Options: .tooltip(options) 向元素集合附加提示工具句柄. $().tooltip(option ...

  4. Bootstrap 提示工具(Tooltip)插件

    当您想要描述一个链接的时候,使用提示工具插件是一个不错的选择.Bootstrap提示工具插件做了很多的改进,例如不需要依赖图像,而是改变Css动画效果,用data属性来存储标题信息. 用法 提示工具( ...

  5. 在angular项目中使用bootstrap的tooltip插件时,报错Property 'tooltip' does no t exist on type 'JQuery<HTMLElement>的解决方法和过程

    在angular4的项目中需要使用bootstrap的tooltip插件. 1. 使用命令安装jQuery和bootstrap npm install bootstrap jquery --save ...

  6. python 全栈开发,Day58(bootstrap组件,bootstrap JavaScript 插件,后台模板,图表插件,jQuery插件库,Animate.css,swiper,运行vue项目)

    一.bootstrap组件 无数可复用的组件,包括字体图标.下拉菜单.导航.警告框.弹出框等更多功能. 组件和插件的区别? 插件:一个功能,比如js文件 组件:html css js 组件包含插件 面 ...

  7. Twitter Bootstrap JavaScript插件

    Twitter Bootstrap JavaScript插件本文收集了10款非常不错的JavaScript Twitter bootstrap扩展插件,利用Boostrap开发者可以节省大量的时间修复 ...

  8. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  9. Bootstrap Tooltip源码分析

    /* ======================================================================== * Bootstrap: tooltip.js ...

随机推荐

  1. 一个轻量级分布式RPC框架--NettyRpc

    1.背景 最近在搜索Netty和Zookeeper方面的文章时,看到了这篇文章<轻量级分布式 RPC 框架>,作者用Zookeeper.Netty和Spring写了一个轻量级的分布式RPC ...

  2. Web GIS离线解决方案

    1.背景 在离线环境下(局域网中)的GIS系统中如何使用地图?这里的地图主要指的是地图底图,有了底图切片数据,我们就可以看到地图,在上面加上自己的业务数据图层,进行相关操作. 要在离线环境下看到GIS ...

  3. Oracle连接与会话

    连接(connection):连接是从客户端到oracle数据库实例的一条物理路径. 会话(session):会话是数据库实例中存在的一个逻辑实体. case1:一个连接可以有多个会话 SQL> ...

  4. js倒计时

    /** * 启动,秒杀倒计时 * totalSecond:剩余秒数 * showTime(tm):回调函数,其中tm={day:"",hour:"",min:& ...

  5. 【Android】一道Android OpenGL笔试题

    一道Android OpenGL笔试题 SkySeraph May. 5th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sky ...

  6. MSSQL2005后版本插入数据返回ID的新写法

    例子: INSERT VolunteerSound_Table (Title,ArticleContent)OUTPUT Inserted.ID VALUES ('FirstVal','bbbbb') ...

  7. Axure RP = Axure Rapid Prototyping

    不要一味追求高保真,特别是交互后产生动态数据.并且将动态数据交互传递出去,违背了做原型的初衷了. 自己做着玩追求高保真可以,有成就感. 但作为工作的话,效率优先.能简单直观地展示必要的交互效果即可.

  8. mysql的查询、子查询及连接查询

    >>>>>>>>>> 一.mysql查询的五种子句         where(条件查询).having(筛选).group by(分组). ...

  9. java-并发-活性

    浏览以下内容前,请点击并阅读 声明 一个并发程序以适时方式执行的能力叫活性.以下部分介绍最常见的一种活性问题,死锁,并简单介绍其他两种活性问题,饥饿和活锁. 死锁 死锁描述了一种情况:两个或两个以上的 ...

  10. android 常用URI

    关于联系人的一些URI: 管理联系人的Uri: ContactsContract.Contacts.CONTENT_URI 管理联系人的电话的Uri: ContactsContract.CommonD ...