JQuery气泡提示插件jquery.contip.js

本文介绍了一个基于 jQuery 的自定义气泡提示插件 Contip.js 的实现原理与使用方法。该插件支持多种触发方式及自定义样式,并提供了详细的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jquery.contip.js源码:

;(function($){

  // 气泡缓存
  var _id = 0
    , Contips = {};

  //窗口大小改变,更新气泡位置
  window.onresize = update_all;

  // jQuery 扩展
  $.fn.contip = function(opt){

    opt = opt || {};
    for(var d in defOpt){
      if(opt.hasOwnProperty(d))
        continue;
      opt[d] = defOpt[d];
    }

    //新建提示框
    var that = new Contip(this, opt);
    that.id = ++_id;
    Contips['id'+that.id] = that;
    return that;

  };


  // 刷新所有气泡
  function update_all(){
    for(var i in Contips) {
      Contips[i].update();
    };
  }


  // 气泡类
  function Contip(elm, opt){
    this.options = opt;//$.extend(true, {}, defOpt, opt);
    this.$elm = $(elm);
    this.exist = false;
    this.enabled = true;
    var that = this
      , $elm = this.$elm
      , opt = this.options;
    //提示内容处理
    this.fixtitle();
    // 默认显示
    if(opt.show)
      this.show();
    // 如果不始终显示
    if(!opt.live){
      //点击空白区域 关闭 sidebar
      $(document).click(function(e){ that.hide() });
      $elm.click(function(event){
          event.stopPropagation(); // 防止事件冒泡
      });
    }
    // 气泡打开事件监听
    this.trigger();
  }


  Contip.prototype = {

    timeout: null, //显示或关闭延迟
    onFunc: {}, //事件监听

    html: function(html){
      if(!this.enabled)
        return
      var $tip = this.tip()
        , $con = $tip.find('.contip-con');
      $con.html(html);
      //更新显示位置
      this.update();
    },

    show: function(){
      if(!this.enabled || this.exist)
        return
      //表示正在显示中
      this.exist = true;
      var opt = this.options
        , $tip = this.tip();
      // $tip.attr('original-style', $tip.attr('style'));
      $tip.remove().css({ display: 'block', visibility: 'hidden'}).prependTo(document.body);
      // 更新显示位置
      this.update();
      // 显示
      $tip.stop().css({opacity: 0, visibility: 'visible'}).animate({opacity: this.options.opacity}, this.options.fade);
      // 激活气泡,绑定事件
      this.revive();
      // 显示事件
      this._do('show', this.$tip);
      return this;
    },

    tip: function(){
        if (!this.$tip){
          var that = this
            , o = this.options
            , html = o.html || '';
          this.$tip = $('<div class="contip" style="z-index:10000; position:absolute; opacity:'+o.opacity+'; background:'+o.bg+'; max-width:'+o.max_width+'px; padding:'+o.padding+'px; border-radius:'+o.radius+'px;"></div>')
          .html('<div class="contip-v" style="position:absolute; width:0; height:0; border:solid transparent '+o.v_size+'px;"></div><div class="contip-con" style="color:'+o.color+'; font-size:'+o.font_size+'; background:'+o.fg+'; border-radius:'+o.radius+'px;">'+html+'</div>');
          // 创建事件
          this._do('create', this.$tip);
        }
        return this.$tip;
    },

    // 初始化 绑定事件
    revive: function(){
      var that = this
        , opt = this.options
        , $tip = this.tip();
      // 如果不始终显示
      if(!opt.live){
        $tip.click(function(event){
            event.stopPropagation(); // 防止事件冒泡
        });
      }
      // 鼠标移入不关闭,移出关闭
      if(opt.hold){
        $tip.mouseenter(function(event){
          clearTimeout(that.timeout);
        });
        $tip.mouseleave(function(event){
          clearTimeout(that.timeout);
          that.$elm.mouseleave(); // 调用关闭逻辑
        });
      }
      return this;
    },

    // 刷新显示位置等样式
    update: function(){
      // alert(this.$tip);
      if(!this.exist)
        return
      var tip_w = this.$tip[0].offsetWidth
        , tip_h = this.$tip[0].offsetHeight
        , elm_w = this.$elm[0].offsetWidth
        , elm_h = this.$elm[0].offsetHeight;
      //改变位置等样式
      // console.log([tip_w, tip_h, elm_w, elm_h]);
      this.offset(tip_w, tip_h, elm_w, elm_h);
      return this;
    },

    // tip 气泡样式
    offset: function(tip_w, tip_h, elm_w, elm_h){
      var $tip = this.tip()
        , $v = $tip.find('.contip-v')
        , o = this.options
        , ofs = this.$elm.offset()
        , vsize = o.v_size*2;

      //$v.attr('already', true); //已经初始化

      switch(o.align){

        case 'left':
          var vright = -vsize
            , vtop = o.v_px + (tip_h-vsize)*o.v_pos
            , ttop = ofs.top -vtop -o.v_size + elm_h*o.elm_pos + o.elm_px
            , tleft = ofs.left -tip_w -o.v_size - o.rise;
          $v.css({right: vright, top: vtop, borderLeftColor: o.bg});
          $tip.css({left: tleft, top: ttop});
          return

        case 'right':
          var vleft = -vsize
            , vtop = o.v_px + (tip_h-vsize)*o.v_pos
            , ttop = ofs.top -vtop -o.v_size + elm_h*o.elm_pos + o.elm_px
            , tleft = ofs.left + elm_w + o.v_size + o.rise;
          $v.css({left: vleft, top: vtop, borderRightColor: o.bg});
          $tip.css({left: tleft, top: ttop});
          return

        case 'bottom':
          var vtop = -vsize
            , vleft = o.v_px + (tip_w-vsize)*o.v_pos
            , tleft = ofs.left -vleft -o.v_size + elm_w*o.elm_pos + o.elm_px
            , ttop = ofs.top +elm_h +o.v_size + o.rise;
          $v.css({left: vleft, top: vtop, borderBottomColor: o.bg});
          $tip.css({left: tleft, top: ttop});
          return

        case 'top':
        default:
          var vbottom = -vsize
            , vleft = o.v_px + (tip_w-vsize)*o.v_pos
            , tleft = ofs.left -vleft -o.v_size + elm_w*o.elm_pos + o.elm_px
            , ttop = ofs.top -tip_h -o.v_size - o.rise;
          $v.css({left: vleft, bottom: vbottom, borderTopColor: o.bg});
          $tip.css({left: tleft, top: ttop});
          // console.log({left: tleft, top: ttop});
          return
      }

    },

    // 关闭提示框
    hide: function(){
      if(!this.exist)
        return
      if(this.options.fade) {
        this.tip().stop().fadeOut(this.options.fade, function(){ $(this).remove();});
      } else {
        this.tip().remove();
      }
      this.exist = false;
      this._do('hide');
      return this;
    },

    fixtitle: function(){
      var opt = this.options;
      if(opt.html)
        return
      var $elm = this.$elm;
      opt.html = $elm.attr(opt.attr);
      if(opt.attr=='title'){
        $elm.attr('original-title', $elm.attr('title') || '').removeAttr('title');
      }
    },


    // 事件监听
    trigger: function(){
      var that = this
        , $elm = this.$elm
        , opt = this.options;
      //事件监听
      switch(opt.trigger){

        case 'click':
          $elm.on('click', function(){ that.show() });
        break;

      }
    },


    // 事件监听
    // show hide 
    on: function(name, func){
      if(!this.onFunc[name])
        this.onFunc[name] = [];
      this.onFunc[name].push(func);
      return this;
    },


    // 执行监听的事件
    _do: function(name, err, data){
      if(!this.onFunc[name])
        return
      for(var o in this.onFunc[name]){
        this.onFunc[name][o](err, data);
      }
    },

  
    enable: function() { this.enabled = true; return this;},
    disable: function() { this.enabled = false; return this;},
    toggleEnabled: function() { this.enabled = !this.enabled; return this;}
  };


  var defOpt = {

    align: 'top', // 气泡出现的位置, top right bottom left
    padding: 7,
    radius: 4, // 气泡圆角大小 px
    opacity: 1, // 透明度
    max_width: 222, // 气泡最大宽度 px
    rise: 0, // 气泡相对浮动位置,可为负值

    bg: '#FFFF80', // 背景颜色
    fg: 'transparent', // 气泡内部颜色
    color: '#FF4040', // 正文字体颜色
    font_size: '12px', // 正文字体

    fade: 0, // 渐入渐出
    delay_in: 0, //延迟显示
    delay_out: 0, //延迟关闭
    live: true, // 总是显示
    hold: true, //鼠标移入不关闭

    html: '',
    attr: 'title', // attr 要处理的属性
    trigger: 'hover', // 绑定的事件 hover click dblclick focus ..
    show: false, // 是否默认显示

    v_size: 6, // 尖角的大小,像素
    v_pos: 0.5, // 尖角出现的位置
    v_px: 0, // 尖角出现的位置的偏移 px像素 可为负值

    elm_pos: 0.5, // 尖角相对于elm出现的位置
    elm_px: 0 // 尖角偏移 可为负值

  }

})(jQuery);




例子:

jsp:

               <th>用户名:</th>
                <td>
                <s:textfield key="registerInfoBean.userId" cssClass="inputtext" data-rule-required="true" maxlength="30" />
<!--                 <label id="userId_cue" ></label> -->
                </td>
              </tr>
              <tr>
                <th>请设置密码:</th>
                <td> <s:password showPassword="true" key="registerInfoBean.password" cssClass="inputtext" minlength="6" data-rule-required="true"/>
                </td>
              </tr>

js:

    //初始化
    var pop = $('#registerInfoBean_userId').contip({
        align: 'bottom', //出现在元素底部
        html: "该用户名已存在。请重新输入!"
      });
 
    $("#registerInfoBean_userId,#registerInfoBean_userTypeId").focus(function(){
        //关闭提示
        pop.hide();
    });

//查询用户id是否可用
	$("#registerInfoBean_userId,#registerInfoBean_userTypeId").blur(function(){	
	if($("#registerInfoBean_userId").val()!=""){
	var param={'registerInfoBean.userTypeId': $("#registerInfoBean_userTypeId").val(),
			'registerInfoBean.userId':$("#registerInfoBean_userId").val().trim()};
	  $.post($('#baseUrl').val() + 'registerCheck.action', param, function(data){

           var jsonData=jQuery.parseJSON(data);
             // $("#userId_cue").css({color:"red"}); 
			  $("#message1").val(jsonData.result);			
		      //$("#userId_cue").text(jsonData.message);		      		    	 		    	
		      if(jsonData.result!="true"){
		    	//显示提示
		    	  pop.show();
		      }
	      },"json");
		}
	});



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值