扩展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插件机制的固定模板,仅仅需要套用上就行。有了这个插件扩展,那么我们就可以如下使用这款插件:你也可以在jsbin中查看效果http://jsbin.com/wicoki/edit?html,js,output:

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中使用。效果如下:

时间: 2024-11-03 21:22:10

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

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

方法 下面是一些提示工具(Tooltip)插件中有用的方法: 方法 描述 实例 Options: .tooltip(options) 向元素集合附加提示工具句柄. $().tooltip(options) Toggle: .tooltip('toggle') 切换显示/隐藏元素的提示工具. $('#element').tooltip('toggle') Show: .tooltip('show') 显示元素的提示工具. $('#element').tooltip('show') Hide: .t

Bootstrap 提示工具(Tooltip)插件

当您想要描述一个链接的时候,使用提示工具插件是一个不错的选择.Bootstrap提示工具插件做了很多的改进,例如不需要依赖图像,而是改变Css动画效果,用data属性来存储标题信息. 用法 提示工具(Tooltip)插件根据要求生成内容和标记,默认情况是把提示工具放在它们触发元素的后面,您可以有以下两种方式来添加提示工具. 1.通过data属性,如需要添加一个提示工具,只需要向一个锚链标签添加data-toggle="tooltip"即可.锚的title即为提示工具(tooltip)的

使用bootstrap的插件实现模态框效果方法步骤详解

本文和大家分享的主要是使用bootstrap 库的模态框插件 modal.js 来实现模态框效果相关内容,同时也使大家进一步熟悉 bootstrap 的插件使用,一起来看看吧,希望对大家学习bootstrap有所帮助. 一. bootstrap 的 js 插件的简单介绍 1.引入 我们在使用 bootstrap 库时,引入的文件 bootstrap.js 或者 bootstrap.min.js 就是 bootstrap的插件文件,这两种文件都集成了 bootstrap 的所有插件,区别在于 *.

Bootstrap按钮插件

前面的话 按钮插件提供了一组可以控制按钮多种状态的功能,比如按钮的禁用状态.正在加载状态.正常状态等.本文将详细介绍Bootstrap按钮插件 加载状态 通过按钮可以设计状态提示,当单击按钮时,会显示loading状态信息.例如,点击"加载"按钮,会触发按钮的加载的状态 通过添加 data-loading-text="Loading..." 可以为按钮设置正在加载的状态,但从 v3.3.5 版本开始,此特性不再建议使用,并且已经在 v4 版本中删除了 [注意]如果不

使用bootstrap的插件实现模态框效果

在上一篇文章中,我们使用 js+css 实现了模态框效果,在理解了模态框的基本实现方法和实现效果后,我们就要寻找更快捷的方法,又快又好的来完成模态框开发需求,从而节约时间,提高效率.一个好的轮子,不仅能大幅减轻工作量,而且能让我们的代码更简明和优雅. 今天我们选择使用著名的 bootstrap 库的模态框插件 modal.js 来实现模态框效果,同时也使大家进一步熟悉 bootstrap 的插件使用. 一. bootstrap 的 js 插件的简单介绍 1.引入 我们在使用 bootstrap

结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程

1.bootstrap-fileinpu的简单介绍 在前面的随笔,我介绍了Bootstrap-table表格插件的具体项目应用过程,本篇随笔介绍另外一个Bootstrap FieInput插件的使用,整合两者可以实现我们常规的Web数据导入操作,导入数据操作过程包括有上传文件,预览数据,选择并提交记录等一系列操作. 关于这个插件,我在早期随笔<Bootstrap文件上传插件File Input的使用>也做了一次介绍,这是一个增强的 HTML5 文件输入控件,是一个 Bootstrap 3.x

来说一说chrome扩展和chrome插件到底有什么区别?

想讨论chrome扩展和chrome插件区别这个话题很久了!但是迟迟没有写.因为我自己也没有搞清楚这两者之间的区别!回想当初是因为需要寻找番羽墙插件才想到去搜索到chrome插件. 想讨论chrome扩展和chrome插件区别这个话题很久了!但是迟迟没有写.因为我自己也没有搞清楚这两者之间的区别!回想当初是因为需要寻找番羽墙插件才想到去维护一个类似的插件网.我甚至问过身边很多程序员这两者之间的区别,说实话能说清楚的也没有几个.今日在论坛里看到有热心的网友推荐这个chrome网,甚是欣慰.但是看到

bootstrap时间插件 火狐不显示 完美解决方法

原文链接:http://www.phpbiji.cn/article/index/id/141/cid/4.html bootstrap时间插件火狐 bootstrap-datetimepicker火狐 不管用 不显示:解决方案:     在项目开发中用到了bootstrap-datetimepicker的时间插件,但是在火狐下却不能使用,在网上找到的方法什么外层模态框去掉tabindex="-1" role="dialog"属性,不管用的!!或许仅仅只是适用于他的

BootStrap iCheck插件全选与获取value值的解决方法

这篇文章主要介绍了BootStrap iCheck插件全选与获取value值的解决方法,解决方法其实很简单,下面小编给大家分享下这方面的知识 在使用jQuery iCheck 插件的时候遇到了一个问题,就是当我们使用普通的js全选功能无效了. $("#checkall").click( function(){ if(this.checked){ $("input[name='checkname']").each(function(){this.checked=tru