扩展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 相关文章推荐
JavaScript中的6种运算符总结
Oct 16 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
May 25 Javascript
简单的JS控制button颜色随点击更改的实现方法
Apr 17 Javascript
深入浅析Vue不同场景下组件间的数据交流
Aug 15 Javascript
基于JavaScript实现评论框展开和隐藏功能
Aug 25 Javascript
JS函数节流和函数防抖问题分析
Dec 18 Javascript
Vue 中的compile操作方法
Feb 26 Javascript
JavaScript 隐性类型转换步骤浅析
Mar 15 Javascript
详解CommonJS和ES6模块循环加载处理的区别
Dec 26 Javascript
vue项目中使用bpmn-自定义platter的示例代码
May 11 Javascript
nuxt.js写项目时增加错误提示页面操作
Nov 05 Javascript
vue el-upload上传文件的示例代码
Dec 21 Vue.js
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 循环列出目录内容的函数代码
2010/05/26 PHP
解决php接收shell返回的结果中文乱码问题
2014/01/23 PHP
PHP多文件上传类实例
2015/03/07 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
JS图片无缝滚动(简单利于使用)
2013/06/17 Javascript
网站内容禁止复制和粘贴、另存为的js代码
2014/02/26 Javascript
js函数在frame中的相互调用详解
2014/03/03 Javascript
jquery获取tagName再进行判断
2014/05/29 Javascript
浅谈类似于(function(){}).call()的js语句
2015/03/30 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
vue 运用mock数据的示例代码
2017/11/07 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
js实现关闭网页出现是否离开提示
2017/12/07 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
Python实现获取磁盘剩余空间的2种方法
2017/06/07 Python
python通过opencv实现批量剪切图片
2017/11/13 Python
[原创]pip和pygal的安装实例教程
2017/12/07 Python
Django中的Signal代码详解
2018/02/05 Python
python操作kafka实践的示例代码
2019/06/19 Python
Django admin model 汉化显示文字的实现方法
2019/08/12 Python
Python如何爬取51cto数据并存入MySQL
2020/08/25 Python
python中remove函数的踩坑记录
2021/01/04 Python
三维科技面试题
2013/07/27 面试题
介绍一下Linux中的链接
2016/06/05 面试题
关于旷工的检讨书
2014/02/02 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
《活见鬼》教学反思
2016/02/24 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript