扩展Bootstrap Tooltip插件使其可交互的方法


Posted in Javascript onNovember 07, 2016

本文实例讲述了扩展Bootstrap Tooltip插件使其可交互的方法。分享给大家供大家参考,具体如下:

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

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

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

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

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

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));
 };

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

上面的代码就是我们所需要扩展tooltip的所有的代码。当然要想作为一个通用的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插件机制的固定模板,仅仅需要套用上就行。有了这个插件扩展,那么我们就可以如下使用这款插件:

HTML:

<div id="tooltip">bs tooltip:你能点击链接?</div>
<hr>
<div id="delayTooltip">delay tooltip:尝试点击链接</div>
<hr>
<div id="delayTooltipInHtml" data-html="true" data-placement="bottom" data-toggle="delayTooltip">delay tooltip:利用html标签实现</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中声明属性的方式,同时也可以在javascript中使用。效果如下:

扩展Bootstrap Tooltip插件使其可交互的方法

希望本文所述对大家基于bootstrap的程序设计有所帮助。

Javascript 相关文章推荐
YUI 读码日记之 YAHOO.util.Dom - Part.1
Mar 22 Javascript
一些实用的jQuery代码片段收集
Jul 12 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
Sep 13 Javascript
jQuery带箭头提示框tooltips插件集锦
Nov 17 Javascript
JS实现鼠标滑过折叠与展开菜单效果代码
Sep 06 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
Dec 04 Javascript
jQuery使用getJSON方法获取json数据完整示例
Sep 13 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
May 23 Javascript
Bootstrap Table使用整理(三)
Jun 09 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
Aug 25 Javascript
express框架下使用session的方法
Jul 31 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
Oct 19 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
Nov 07 #Javascript
jQuery插件WebUploader实现文件上传
Nov 07 #Javascript
jQuery利用sort对DOM元素进行排序操作
Nov 07 #Javascript
AngularJS的ng Http Request与response格式转换方法
Nov 07 #Javascript
easyUI实现(alert)提示框自动关闭的实例代码
Nov 07 #Javascript
AngularJS ng-template寄宿方式用法分析
Nov 07 #Javascript
easyui messager alert 三秒后自动关闭提示的实例
Nov 07 #Javascript
You might like
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
微信公众平台开发之天气预报功能
2015/08/31 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
2016/03/18 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
Laravel利用gulp如何构建前端资源详解
2018/06/03 PHP
jquery.ui.draggable中文文档
2009/11/24 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
2014/03/06 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
JavaScript判断用户名和密码不能为空的实现代码
2016/05/16 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
2016/07/21 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
p5.js入门教程之鼠标交互的示例
2018/03/16 Javascript
vue如何进行动画的封装
2018/09/26 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
js实现点击烟花特效
2020/10/14 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
[03:08]TI9战队档案 - Vici Gaming
2019/08/20 DOTA
python3编写C/S网络程序实例教程
2014/08/25 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
如何解决安装python3.6.1失败
2020/07/01 Python
Django def clean()函数对表单中的数据进行验证操作
2020/07/09 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
详解pandas映射与数据转换
2021/01/22 Python
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
辅导员评语
2014/05/04 职场文书
党员“四风”问题批评与自我批评思想汇报
2014/10/06 职场文书
圣贤教育改变命运观后感
2015/06/16 职场文书
浅谈MySQL user权限表
2021/06/18 MySQL
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server