javascript 实现的ToolTip

1 纯javascript实现的toolTip 

2 实现当鼠标在要展示的Dom上移动时,显示的toolTip可以在不同位置显示

3 可以控制toolTip的显示样式

4 可以控制toolTip关闭方式

5 可以控制是否定时关闭

源代码:

  1 /* ToolTip */
  2 GLOBAL.namespace("Component");
  3 GLOBAL.Component.EnumType ={
  4    StyleHeadDefault:{‘backgroundColor‘:‘#f7f7f7‘,‘color‘:‘#000000‘,‘width‘:‘150px‘,‘padding‘:‘1px‘},
  5    StyleBodyDefault:{‘backgroundColor‘:‘#ffffff‘,‘color‘:‘#000000‘,‘width‘:‘150px‘,‘padding‘:‘1px 2px‘},
  6    StyleBoxDefault:{‘border‘ :‘1px #e0e0e0 solid‘,‘width‘:‘150px‘,‘height‘:‘200px‘},
  7    StyleHeadDark:{‘backgroundColor‘:‘#f7f7f7‘,‘color‘:‘#000000‘,‘width‘:‘150px‘,‘padding‘:‘1px‘},
  8    StyleBodyDark:{‘backgroundColor‘:‘#8a8a8a‘,‘color‘:‘#000000‘,‘width‘:‘150px‘,‘padding‘ :‘1px 2px‘},
  9    StyleBoxDark:{‘border‘ :‘1px #e0e0e0 solid‘,‘width‘:‘150px‘,‘height‘:‘200px‘},
 10    StyleHeadYellow:{‘backgroundColor‘:‘#f7f7f7‘,‘color‘:‘#000000‘,‘width‘:‘150px‘,‘padding‘:‘1px‘},
 11    StyleBodyYellow:{‘backgroundColor‘:‘#ffffa9‘,‘color‘:‘#000000‘,‘width‘:‘150px‘,‘padding‘ :‘1px 2px‘},
 12    StyleBoxYellow:{‘border‘:‘1px #e0e0e0 solid‘,‘width‘:‘150px‘,‘height‘:‘200px‘},
 13    StyleHeadGreen:{‘backgroundColor‘:‘#f7f7f7‘,‘color‘:‘#000000‘,‘width‘ : ‘150px‘,‘padding‘:‘1px‘},
 14    StyleBodyGreen:{‘backgroundColor‘:‘#4db135‘,‘color‘:‘#ffffff‘,‘width‘:‘150px‘,‘padding‘ :‘1px 2px‘},
 15    StyleBoxGreen:{‘border‘:‘1px #e0e0e0 solid‘,‘width‘:‘150px‘,‘height‘:‘200px‘},
 16    StyleHeadBlue:{‘backgroundColor‘:‘#f7f7f7‘,‘color‘:‘#000000‘,‘width‘:‘150px‘,‘padding‘:‘1px‘},
 17    StyleBodyBlue:{‘backgroundColor‘:‘#4182c2‘,‘color‘:‘#ffffff‘,‘width‘:‘150px‘,‘padding‘ :‘1px 2px‘},
 18    StyleBoxBlue:{‘border‘:‘1px #e0e0e0 solid‘,‘width‘:‘150px‘,‘height‘:‘200px‘},
 19    StyleRadius:{‘borderRadius‘: ‘4px‘},
 20    StyleShadow:{‘box_shadow‘:‘gray 0.33em 0.25em 0.25em‘},
 21    PlaceWTop:‘top‘,
 22    PlaceWRight:‘right‘,
 23    PlaceWLeft:‘left‘,
 24    PlaceWButton:‘button‘,
 25    PlaceBT:‘T‘,
 26    PlaceBC:‘C‘,
 27    PlaceBB:‘B‘
 28 };
 29 
 30 GLOBAL.Component.ToolTip = function(nodeID) {
 31     this._tipNode = GLOBAL.Dom.get(nodeID);
 32     if(this._tipNode == null)
 33       return;
 34     /*toolTip基础结构*/
 35     this._tipBox = null;
 36     this._tipBoxID = nodeID+"tipBox";
 37     this._tipHead=null;
 38     this._tipHeadID = nodeID+"tipHead";
 39     this._tipBody = null;
 40     this._tipBodyID = nodeID+"tipBody";
 41     this._tipBodyContent = null;
 42     this._tipBodyContentID = nodeID +"tipBodyContent";
 43     this._tipScroll = null;
 44     this._tipClose = null;
 45     this._tipCloseID = nodeID+"tipClose";
 46     /*操作特性*/
 47     this._isClear = 0;
 48     this._isEventClear = 0;
 49     this._isHide = 1;
 50     this._isTimer = 0;
 51     this._timerID = null;
 52     this._EventMap = {};
 53     this._timerMilliseconds = 2000;
 54     this._isShowClose = 1;
 55     this._isAuto = 1;
 56     /*显示特性*/
 57     this._tipBoxStyle = GLOBAL.Component.EnumType.StyleBoxDefault;
 58     this._tipHeadStyle = GLOBAL.Component.EnumType.StyleHeadDefault;
 59     this._tipBodyStyle = GLOBAL.Component.EnumType.StyleBodyDefault;
 60     /*位置特性*/
 61     this._placeW = GLOBAL.Component.EnumType.PlaceWButton;
 62     this._placeB = GLOBAL.Component.EnumType.PlaceBC;
 63     /*创建Div*/
 64     this._createContainer();
 65     /*设置内容,*/
 66     this.setTip();
 67     /*设置样式*/
 68     this.setStyle();
 69     /*并设置高度,添加滚动条*/
 70     this.scaleHeight();
 71     /*设置显示方式*/
 72     this.setShowType();
 73     /*绑定事件*/
 74     this.bindEvent();
 75 };
 76 /*外部调用显示paramters{
 77 isEventClear,isTimer,timerMilliseconds,placeW,placeB,isShowClose,isAuto}*/
 78 GLOBAL.Component.ToolTip.prototype.showToolTip = function(headHtml,bodyHtml,parameters) {
 79    this.setTip(headHtml,bodyHtml);
 80    this.scaleHeight();
 81    this.setShowType(parameters);
 82    this.bindEvent();
 83 };
 84 /*创建Div*/
 85 GLOBAL.Component.ToolTip.prototype._createContainer = function() {
 86     this._tipBox = document.createElement("div");
 87     this._tipBox.id = this._tipBoxID;
 88     GLOBAL.Dom.setStyle(this._tipBox,{‘position‘:‘absolute‘,‘visibility‘:‘hidden‘,‘overflow‘:‘hidden‘});
 89     this._tipHead = document.createElement("div");
 90     this._tipHead.id = this._tipHeadID;
 91     GLOBAL.Dom.setStyle(this._tipHead,{‘position‘:‘absolute‘,‘top‘:‘0px‘,‘left‘:‘0px‘,‘width‘:‘100%‘});
 92     this._tipBox.appendChild(this._tipHead);
 93     this._tipBody = document.createElement("div");
 94     this._tipBody.id = this._tipBodyID;
 95     GLOBAL.Dom.setStyle(this._tipBody,{‘position‘:‘absolute‘,‘left‘:‘0px‘,‘width‘:‘100%‘});
 96     this._tipBox.appendChild(this._tipBody);
 97     this._tipBodyContent = document.createElement("div");
 98     this._tipBodyContent.id = this._tipBodyContentID;
 99     this._tipBody.appendChild(this._tipBodyContent);
100     this._tipClose = document.createElement("button");
101     this._tipClose.id = this._tipCloseID;
102     this._tipClose.innerHTML = "×";
103     GLOBAL.Dom.setStyle(this._tipClose,{‘position‘:‘absolute‘,‘top‘:‘0px‘,‘right‘:‘0px‘,‘color‘:‘#FF0000‘,‘backgroundColor‘:‘transparent‘,‘border‘:‘1px solid transparent‘,‘padding‘: ‘0px‘});
104     this._tipBox.appendChild(this._tipClose);
105     document.body.appendChild(this._tipBox);
106 };
107 
108 GLOBAL.Component.ToolTip.prototype.setStyle = function(tipBoxStyle,tipHeadStyle,tipBodyStyle) {
109     this._tipBoxStyle = tipBoxStyle || this._tipBoxStyle;
110     this._tipHeadStyle = tipHeadStyle || this._tipHeadStyle;
111     this._tipBodyStyle = tipBodyStyle || this._tipBodyStyle;
112     GLOBAL.Dom.setStyle(this._tipBox,this._tipBoxStyle);
113     GLOBAL.Dom.setStyle(this._tipHead,this._tipHeadStyle);
114     GLOBAL.Dom.setStyle(this._tipBody,this._tipBodyStyle);
115 };
116 
117 GLOBAL.Component.ToolTip.prototype.setTip = function(headHtml,bodyHtml) {
118    var v_headHtml = headHtml || "";
119    var v_bodyHtml = bodyHtml || "Default body";
120    this._tipHead.innerHTML = v_headHtml;
121    this._tipBodyContent.innerHTML = v_bodyHtml;
122    /*清除滚动条*/
123    if(this._tipScroll)
124    {   
125       this._tipScroll.clearAll();
126    }
127    /*设置高度*/
128    if(GLOBAL.TOOL.isEmpty(v_headHtml))
129    {
130      this._tipHead.style.height = "0px";
131    } else
132    {
133      this._tipHead.style.height = "20px";
134    }
135 };
136 
137 GLOBAL.Component.ToolTip.prototype.scaleHeight = function()
138 {   
139    var headHeight = this._tipHead.clientHeight;
140    var boxHeight =this._tipBox.clientHeight;
141    if(boxHeight === 0)
142    {
143      boxHeight = 100;
144      this._tipBox.style.height = boxHeight+"px";
145    }
146    if(headHeight === 0)
147    {
148       //不显示_tipHead
149       this._tipBody.style.height = boxHeight+"px";
150       this._tipBody.style.top = "0px";
151    }else{
152       this._tipBody.style.height = (boxHeight - headHeight)+"px";
153       this._tipBody.style.top = headHeight+"px";
154    }
155     /*添加滚动条*/
156    this._tipScroll = new GLOBAL.Component.TinyVScrollBar(this._tipBodyContentID);
157 };
158 
159 /*清理事件*/
160 GLOBAL.Component.ToolTip.prototype._clearEvent = function () {
161     if (this._EventMap != null) {
162         var key, comArray, tmp;
163         for (key in this._EventMap) {
164             comArray = key.split(‘$‘);
165             if (this._EventMap[key] == null)
166                 continue;
167             if (comArray.length >= 2) {
168                 tmp = comArray[0];
169                 if (tmp.indexOf(‘_‘) >= 0) {
170                     eval(‘GLOBAL.Event.remove(this.‘ + GLOBAL.TOOL.trim(comArray[0]) + ‘,"‘ + GLOBAL.TOOL.trim(comArray[1]) + ‘",this._EventMap["‘ + key + ‘"]);‘);
171                 } else {
172                     eval(‘GLOBAL.Event.remove(‘ + GLOBAL.TOOL.trim(comArray[0]) + ‘,"‘ + GLOBAL.TOOL.trim(comArray[1]) + ‘",this._EventMap["‘ + key + ‘"]);‘);
173                 }
174             }
175         }
176     }
177 };
178 
179 /* 设置显示方式 paramters{
180 isEventClear,isTimer,timerMilliseconds,placeW,placeB,isShowClose,isAuto}
181 */
182 GLOBAL.Component.ToolTip.prototype.setShowType=function(paramters) {
183    if(typeof(paramters) =="undefined"||paramters == null)
184    {
185      return ;
186    }
187    if(typeof(paramters.isAuto)!="undefined")
188    {
189       this._isAuto = paramters.isAuto ||this._isAuto;
190    }
191    if(typeof(paramters.isEventClear)!="undefined")
192    {
193       this._isEventClear = paramters.isEventClear ||this._isEventClear;
194    }
195    if(typeof(paramters.isTimer)!="undefined")
196    {
197    this._isTimer = paramters.isTimer ||this._isTimer;
198    }
199    if(typeof(paramters.timerMilliseconds)!="undefined")
200    {
201    this._timerMilliseconds = paramters.timerMilliseconds || this._timerMilliseconds;
202    }
203    if(typeof(paramters.placeW)!="undefined")
204    {
205    this._placeW = paramters.placeW ||this._placeW;
206    }
207    if(typeof(paramters.placeB)!="undefined")
208    {
209    this._placeB = paramters.placeB ||this._placeB;
210    }
211    if(typeof(paramters.isShowClose)!="undefined")
212    {
213    this._isShowClose = paramters.isShowClose ||this._isShowClose;
214    if(this._isShowClose ===1)
215    {
216      GLOBAL.Dom.setStyle(this._tipClose,{‘display‘:‘block‘});
217    }else
218    {
219      GLOBAL.Dom.setStyle(this._tipClose,{‘display‘:‘none‘});
220    }
221    }
222 };
223 
224 /*显示窗口*/
225 GLOBAL.Component.ToolTip.prototype._showWindow = function () {
226     if (this._isClear === 0) {
227         /*未被移除*/
228         if(this._isHide === 1)
229         {
230            GLOBAL.Dom.setStyle(this._tipBox,{‘visibility‘:‘visible‘});
231            this._isHide = 0;
232         }
233     }
234 };
235 /*隐藏窗口*/
236 GLOBAL.Component.ToolTip.prototype._hideWindow = function () {
237     if (this._isClear === 0) {
238         /*未被移除*/
239         if(this._isHide === 0)
240         {
241            GLOBAL.Dom.setStyle(this._tipBox,{‘visibility‘:‘hidden‘});
242            this._isHide = 1;
243         }
244     }
245 };
246 /*显示窗口*/
247 GLOBAL.Component.ToolTip.prototype.show = function () {
248         if(this._isHide === 0)
249         {
250            this._hideWindow();
251         }else
252         {
253            this._showWindow();
254         }
255 };
256 
257 /*清理所有资源 调用后控件则作废*/
258 GLOBAL.Component.ToolTip.prototype.clearAll = function () {
259     if(this._isClear === 1)
260        return ;
261     if(this._timerID)
262     {
263      GLOBAL.Timer.clearTimeout(this._timerID);
264     }
265     this._clearEvent();
266     if(this._tipBox)
267     {
268        this._tipBox.parentNode.removeChild(this._tipBox);
269     }
270     this._isClear = 1;
271 };
272 
273 /*绑定事件*/
274 GLOBAL.Component.ToolTip.prototype.bindEvent=function() {
275   this._clearEvent();
276   if(this._isEventClear === 1)
277   {
278     /*关闭按钮事件*/
279     this._EventMap._tipClose$click = GLOBAL.Event.on(this._tipClose,"click",this.clearAll,this);
280   }else
281   {
282       /*关闭按钮事件*/
283     this._EventMap._tipClose$click = GLOBAL.Event.on(this._tipClose,"click",this._hideWindow,this);
284   }
285   /*主体事件*/
286   this._EventMap._tipNode$mouseover = GLOBAL.Event.on(this._tipNode, ‘mouseover‘, this.mouseoverEventHandler, this);
287 };
288 
289 /*主体事件*/
290 GLOBAL.Component.ToolTip.prototype.mouseoverEventHandler=function(e) {
291     /*如果isAuto==1 则使用鼠标移动事件*/
292     var mousePosition = GLOBAL.Event.getMouseEventDocumentPostion(e);
293     var nodePosition = GLOBAL.TOOL.getPosition(this._tipNode);
294     var nodeSize = GLOBAL.TOOL.getNodeClientSize(this._tipNode);
295     var tipSize =  GLOBAL.TOOL.getNodeClientSize(this._tipBox);
296     if(this._isAuto == 1)
297     {
298        /*计算显示位置*/
299        /*上边比右边*/
300        var scaleMax = 0;
301        scaleMax = (mousePosition.x-nodePosition.x);
302        if(scaleMax<=(mousePosition.y-nodePosition.y))
303        {    
304           this._placeW = GLOBAL.Component.EnumType.PlaceWLeft;
305        }else
306        {
307            scaleMax = (mousePosition.y-nodePosition.y);
308            this._placeW = GLOBAL.Component.EnumType.PlaceWTop;
309        }
310        if(scaleMax >=(nodePosition.x+nodeSize.x-mousePosition.x))
311        {
312            scaleMax = (nodePosition.x+nodeSize.x-mousePosition.x);
313            this._placeW = GLOBAL.Component.EnumType.PlaceWRight;
314        }
315        if(scaleMax >=(nodePosition.y+nodeSize.h-mousePosition.y))
316        {
317            scaleMax = (nodePosition.y+nodeSize.h-mousePosition.y);
318            this._placeW = GLOBAL.Component.EnumType.PlaceWButton;
319        }
320       /*计算显示的中间位置*/
321        if(this._placeW == GLOBAL.Component.EnumType.PlaceWTop ||this._placeW == GLOBAL.Component.EnumType.PlaceWButton )
322        {
323          /*以x轴做计算*/
324          scaleMax = nodeSize.w/4;
325          if(mousePosition.x<=(nodePosition.x+scaleMax))
326          {
327            this._placeB = GLOBAL.Component.EnumType.PlaceBT;
328          }else if(mousePosition.x>=(nodePosition.x+scaleMax*3))
329          {
330            this._placeB = GLOBAL.Component.EnumType.PlaceBB;
331          }else
332          {
333             this._placeB = GLOBAL.Component.EnumType.PlaceBC;
334          }
335        }else
336        {
337          scaleMax = nodeSize.h/4;
338          if(mousePosition.y<=(nodePosition.y+scaleMax))
339          {
340            this._placeB = GLOBAL.Component.EnumType.PlaceBT;
341          }else if(mousePosition.y>=(nodePosition.y+scaleMax*3))
342          {
343            this._placeB = GLOBAL.Component.EnumType.PlaceBB;
344          }else
345          {
346             this._placeB = GLOBAL.Component.EnumType.PlaceBC;
347          }
348        }       
349     }
350     /*计算x和y*/
351     var topX,topY;
352     var offset = 10;
353     if(this._placeW === GLOBAL.Component.EnumType.PlaceWTop)
354     {  
355        /*位于顶边 只需设置一次topY*/
356        topY = nodePosition.y-tipSize.h -offset;
357        if(this._placeB === GLOBAL.Component.EnumType.PlaceBT)
358        {  
359           /*位于头*/
360           topX = nodePosition.x-tipSize.w/2;  
361        }else if(this._placeB === GLOBAL.Component.EnumType.PlaceBC){
362           /*位于中*/
363           topX = nodePosition.x+nodeSize.w/2-tipSize.w/2;
364        }else{
365           /*位于尾*/
366           topX = nodePosition.x+nodeSize.w-tipSize.w/2;
367        }
368     }else if(this._placeW === GLOBAL.Component.EnumType.PlaceWLeft)
369     {  
370        /*位于左边 只需设置一次topX*/
371        topX = nodePosition.x - tipSize.w -offset;
372         if(this._placeB === GLOBAL.Component.EnumType.PlaceBT)
373        {  
374           /*位于头*/
375           topY = nodePosition.y - tipSize.h/2;
376        }else if(this._placeB === GLOBAL.Component.EnumType.PlaceBC){
377           /*位于中*/
378            topY = nodePosition.y +nodeSize.h/2- tipSize.h/2;
379        }else{
380           /*位于尾*/
381           topY = nodePosition.y +nodeSize.h- tipSize.h/2;
382        }
383     }else if(this._placeW === GLOBAL.Component.EnumType.PlaceWRight)
384     {
385        /*位于右边  只需设置一次topX*/
386        topX = nodePosition.x + nodeSize.w +offset;
387         if(this._placeB === GLOBAL.Component.EnumType.PlaceBT)
388        {  
389           /*位于头*/
390           topY = nodePosition.y - tipSize.h/2;
391        }else if(this._placeB === GLOBAL.Component.EnumType.PlaceBC){
392           /*位于中*/
393           topY = nodePosition.y +nodeSize.h/2- tipSize.h/2;
394        }else{
395           /*位于尾*/
396           topY = nodePosition.y +nodeSize.h- tipSize.h/2;
397        }
398     }
399     else 
400     {
401        /*位于底边 只需设置一次topY*/
402        topY = nodePosition.y +nodeSize.h+offset;
403         if(this._placeB === GLOBAL.Component.EnumType.PlaceBT)
404        {  
405           /*位于头*/
406            topX = nodePosition.x-tipSize.w/2;  
407        }else if(this._placeB === GLOBAL.Component.EnumType.PlaceBC){
408           /*位于中*/
409           topX = nodePosition.x+nodeSize.w/2-tipSize.w/2;
410        }else{
411           /*位于尾*/
412            topX = nodePosition.x+nodeSize.w-tipSize.w/2;
413        }
414     }
415     this._tipBox.style.left = topX+"px";
416     this._tipBox.style.top = topY+"px";
417     /*显示窗口*/
418     this._showWindow();
419     if(this._isEventClear === 1)
420   {
421     /*定时器事件*/
422     if(this._isTimer ==1)
423     {
424      this._timerID = GLOBAL.Timer.setTimeout(this.clearAll,null,this._timerMilliseconds,this);
425     }
426   }else
427   {
428     /*定时器事件*/
429     if(this._isTimer==1)
430     {
431      this._timerID = GLOBAL.Timer.setTimeout(this._hideWindow,null,this._timerMilliseconds,this);
432     }
433   }
434     GLOBAL.Event.stopPropagation(e);
435 };

使用:

   

var toolTip = new GLOBAL.Component.ToolTip("node#ID");
toolTip.showToolTip("测试函数","测试内容为:显示位置追随鼠标!",{isTimer:1});

测试结果:

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。