且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

[JavaScript]自定义Title的显示方式

更新时间:2022-08-19 23:22:31

好久没有写blog了,今天更新下最近在做的事情,顺便让朋友们了解下,我还顽强地活着[JavaScript]自定义Title的显示方式...


最近刚做完公司的WEB MVP 开发框架.累得脑子快要抽筋了,可是即使要抽筋了,也得继续上啊...谁叫俺是打工仔呢.

现在研究的重点转移到了客户端,于是开始钻研起dojo,prototype,yui......

发现javascript也在OO呢(虽然只是同vb一样基于对象的)~~~呵呵

以前只会找要的js代码,然后改啊改啊...从来没有认真的学习过,这次决定好好学学这个Web开发必不可少的东东...

好了废话不扯了,这次的任务就是做Title的自定义显示.

我想IE的Tip显示方式,肯定大家都不满意吧.每一天有多少人在做着自己的自定义显示.

俺可没有那么多精力,先是从网络上找找到了一个老外的程序 qTip:http://solardreamstudios.com/_img/learn/css/qtip/qTip.html

仔细看了看代码,发现几个问题:
1.这个老外只做了一半,它只对单个Tag的所有元素集合进行自定义显示
1[JavaScript]自定义Title的显示方式var qTipTag = "a"; //Which tag do you want to qTip-ize? Keep it lowercase!//

2.循环出来每个挂载mouse事件
1[JavaScript]自定义Title的显示方式var anchors = document.getElementsByTagName (qTipTag);
2[JavaScript]自定义Title的显示方式
3[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    for (var i = 0; i < anchors.length; i ++) [JavaScript]自定义Title的显示方式{
4[JavaScript]自定义Title的显示方式//[JavaScript]自定义Title的显示方式.
5[JavaScript]自定义Title的显示方式}


3.Event采用赋值形式
1[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    a.onmouseover = function() [JavaScript]自定义Title的显示方式{tooltip.show(this.getAttribute('tiptitle'))};
2[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式            a.onmouseout = function() [JavaScript]自定义Title的显示方式{tooltip.hide()};
3[JavaScript]自定义Title的显示方式

OK.针对这些问题,我们开始我们的重构之旅

1.首先,我希望页面控件的所有Tag只要有Title的,我都要采用自定义显示,这时想到一个最土的招就是
[JavaScript]自定义Title的显示方式var anchors = document.all;

2.它的实现方式是循环找到所有的有标记的Tag,然后设置mouse事件.
  这一步我觉得有2个问题:
  a.每个tag都设置mouse的事件,显然页面变大了,特别是我现在要求所有的Tag都要自定义显示
  b.Event采用赋值.......寒一个

  我的思路是使用事件的串连机制,把mouse的事件直接挂载到document上面,然后进行冒泡处理(我不知道这样的效率实际上是更好呢,还是更坏,自我感觉应该会好些吧?:))

 
 1[JavaScript]自定义Title的显示方式document.attachEvent("onmouseover",function(e)
 2[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式        [JavaScript]自定义Title的显示方式{            
 3[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式            if(typeof(event)=="undefined")[JavaScript]自定义Title的显示方式{
 4[JavaScript]自定义Title的显示方式                sTitle = e.target.getAttribute("title")
 5[JavaScript]自定义Title的显示方式                e.target.removeAttribute("title");
 6[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式            }
else[JavaScript]自定义Title的显示方式{
 7[JavaScript]自定义Title的显示方式                e    = event;
 8[JavaScript]自定义Title的显示方式                sTitle = e.srcElement.title;
 9[JavaScript]自定义Title的显示方式                e.srcElement.title = "";
10[JavaScript]自定义Title的显示方式            }
;
11[JavaScript]自定义Title的显示方式    
12[JavaScript]自定义Title的显示方式            if(!sTitle == "")
13[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式            [JavaScript]自定义Title的显示方式{        
14[JavaScript]自定义Title的显示方式                tooltip.show(sTitle);
15[JavaScript]自定义Title的显示方式            }

16[JavaScript]自定义Title的显示方式        }

17[JavaScript]自定义Title的显示方式    );
18[JavaScript]自定义Title的显示方式
19[JavaScript]自定义Title的显示方式    document.attachEvent('onmouseout',function(e)
20[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式        [JavaScript]自定义Title的显示方式{
21[JavaScript]自定义Title的显示方式
22[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式            if(typeof(event)=="undefined")[JavaScript]自定义Title的显示方式{
23[JavaScript]自定义Title的显示方式                e.target.setAttribute("title",sTitle);
24[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式            }
else[JavaScript]自定义Title的显示方式{
25[JavaScript]自定义Title的显示方式                e    = event;
26[JavaScript]自定义Title的显示方式                e.srcElement.title = sTitle;
27[JavaScript]自定义Title的显示方式            }
;
28[JavaScript]自定义Title的显示方式            
29[JavaScript]自定义Title的显示方式            tooltip.hide();
30[JavaScript]自定义Title的显示方式        
31[JavaScript]自定义Title的显示方式        }

32[JavaScript]自定义Title的显示方式    );
33[JavaScript]自定义Title的显示方式

当然这里或许会碰到的所谓的IE 内存泄漏,因为没有detachEvent.(本来想使用Event.observer的,不过prototype还不谈熟,加上脑子也晕乎乎了,留待下次重构吧)...

[JavaScript]自定义Title的显示方式document.attachEvent 

看来好像只支持IE哦....还是对少数的其他Fans支持一下吧,修改一下系统方法,让它适当兼容一下其他浏览器
 1[JavaScript]自定义Title的显示方式if(!document.attachEvent)//Not IE
 2[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式{
 3[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    document.attachEvent = function()[JavaScript]自定义Title的显示方式{document.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
 4[JavaScript]自定义Title的显示方式}

 5[JavaScript]自定义Title的显示方式
 6[JavaScript]自定义Title的显示方式if(!window.attachEvent)//Not IE
 7[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式{
 8[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    window.attachEvent = function()[JavaScript]自定义Title的显示方式{window.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
 9[JavaScript]自定义Title的显示方式}

10[JavaScript]自定义Title的显示方式


这样子,大概qTip的功能就重构结束了...

当然还有很多可以改进的地方,比如把提示用的层设计得漂亮一点...

[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    if(!tipContainer) [JavaScript]自定义Title的显示方式{
[JavaScript]自定义Title的显示方式      tipContainer = document.createElementNS ? document.createElementNS(tipNameSpaceURI, "div") : document.createElement("div");
[JavaScript]自定义Title的显示方式        tipContainer.setAttribute("id", tipContainerID);
[JavaScript]自定义Title的显示方式//美化下?
[JavaScript]自定义Title的显示方式
      document.getElementsByTagName("body").item(0).appendChild(tipContainer);
[JavaScript]自定义Title的显示方式    }

[JavaScript]自定义Title的显示方式


重构后的源文件(在需要的页面link这2个文件就好了):

[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式qTip.js
  1[JavaScript]自定义Title的显示方式//偷抄的^_^
  2[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式function $() [JavaScript]自定义Title的显示方式{
  3[JavaScript]自定义Title的显示方式  var elements = new Array();
  4[JavaScript]自定义Title的显示方式
  5[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式  for (var i = 0; i < arguments.length; i++) [JavaScript]自定义Title的显示方式{
  6[JavaScript]自定义Title的显示方式    var element = arguments[i];
  7[JavaScript]自定义Title的显示方式    if (typeof element == 'string')
  8[JavaScript]自定义Title的显示方式      element = document.getElementById(element);
  9[JavaScript]自定义Title的显示方式
 10[JavaScript]自定义Title的显示方式    if (arguments.length == 1)
 11[JavaScript]自定义Title的显示方式      return element;
 12[JavaScript]自定义Title的显示方式
 13[JavaScript]自定义Title的显示方式    elements.push(element);
 14[JavaScript]自定义Title的显示方式  }

 15[JavaScript]自定义Title的显示方式
 16[JavaScript]自定义Title的显示方式  return elements;
 17[JavaScript]自定义Title的显示方式}

 18[JavaScript]自定义Title的显示方式
 19[JavaScript]自定义Title的显示方式//兼容性
 20[JavaScript]自定义Title的显示方式if(!document.attachEvent)//Not IE
 21[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式{
 22[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    document.attachEvent = function()[JavaScript]自定义Title的显示方式{document.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
 23[JavaScript]自定义Title的显示方式}

 24[JavaScript]自定义Title的显示方式
 25[JavaScript]自定义Title的显示方式if(!window.attachEvent)//Not IE
 26[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式{
 27[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    window.attachEvent = function()[JavaScript]自定义Title的显示方式{window.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
 28[JavaScript]自定义Title的显示方式}

 29[JavaScript]自定义Title的显示方式
 30[JavaScript]自定义Title的显示方式//位置
 31[JavaScript]自定义Title的显示方式var qTipX = -30; //This is qTip's X offset//
 32[JavaScript]自定义Title的显示方式var qTipY = 25; //This is qTip's Y offset//
 33[JavaScript]自定义Title的显示方式
 34[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式tooltip = [JavaScript]自定义Title的显示方式{
 35[JavaScript]自定义Title的显示方式  name : "qTip",
 36[JavaScript]自定义Title的显示方式  offsetX : qTipX,
 37[JavaScript]自定义Title的显示方式  offsetY : qTipY,
 38[JavaScript]自定义Title的显示方式  tip : null
 39[JavaScript]自定义Title的显示方式}

 40[JavaScript]自定义Title的显示方式
 41[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式tooltip.init = function () [JavaScript]自定义Title的显示方式{
 42[JavaScript]自定义Title的显示方式    var tipNameSpaceURI = "http://www.w3.org/1999/xhtml";
 43[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    if(!tipContainerID)[JavaScript]自定义Title的显示方式var tipContainerID = "qTip";}
 44[JavaScript]自定义Title的显示方式    var tipContainer = document.getElementById(tipContainerID);
 45[JavaScript]自定义Title的显示方式
 46[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    if(!tipContainer) [JavaScript]自定义Title的显示方式{
 47[JavaScript]自定义Title的显示方式      tipContainer = document.createElementNS ? document.createElementNS(tipNameSpaceURI, "div") : document.createElement("div");
 48[JavaScript]自定义Title的显示方式        tipContainer.setAttribute("id", tipContainerID);
 49[JavaScript]自定义Title的显示方式      document.getElementsByTagName("body").item(0).appendChild(tipContainer);
 50[JavaScript]自定义Title的显示方式    }

 51[JavaScript]自定义Title的显示方式
 52[JavaScript]自定义Title的显示方式    this.tip = $(this.name);
 53[JavaScript]自定义Title的显示方式    if (this.tip) 
 54[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    [JavaScript]自定义Title的显示方式{
 55[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式        document.attachEvent("onmousemove",function (e) [JavaScript]自定义Title的显示方式{tooltip.move (e)});
 56[JavaScript]自定义Title的显示方式    }

 57[JavaScript]自定义Title的显示方式    var sTitle="";
 58[JavaScript]自定义Title的显示方式    
 59[JavaScript]自定义Title的显示方式        //串连onmouseover事件
 60[JavaScript]自定义Title的显示方式    document.attachEvent("onmouseover",function(e)
 61[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式        [JavaScript]自定义Title的显示方式{            
 62[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式            if(typeof(event)=="undefined")[JavaScript]自定义Title的显示方式{
 63[JavaScript]自定义Title的显示方式                sTitle = e.target.getAttribute("title")
 64[JavaScript]自定义Title的显示方式                e.target.removeAttribute("title");
 65[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式            }
else[JavaScript]自定义Title的显示方式{
 66[JavaScript]自定义Title的显示方式                e    = event;
 67[JavaScript]自定义Title的显示方式                sTitle = e.srcElement.title;
 68[JavaScript]自定义Title的显示方式                e.srcElement.title = "";
 69[JavaScript]自定义Title的显示方式            }
;
 70[JavaScript]自定义Title的显示方式    
 71[JavaScript]自定义Title的显示方式            if(!sTitle == "")
 72[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式            [JavaScript]自定义Title的显示方式{        
 73[JavaScript]自定义Title的显示方式                tooltip.show(sTitle);
 74[JavaScript]自定义Title的显示方式            }

 75[JavaScript]自定义Title的显示方式        }

 76[JavaScript]自定义Title的显示方式    );
 77[JavaScript]自定义Title的显示方式
 78[JavaScript]自定义Title的显示方式        //串连onmouseout事件
 79[JavaScript]自定义Title的显示方式    document.attachEvent('onmouseout',function(e)
 80[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式        [JavaScript]自定义Title的显示方式{
 81[JavaScript]自定义Title的显示方式
 82[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式            if(typeof(event)=="undefined")[JavaScript]自定义Title的显示方式{
 83[JavaScript]自定义Title的显示方式                e.target.setAttribute("title",sTitle);
 84[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式            }
else[JavaScript]自定义Title的显示方式{
 85[JavaScript]自定义Title的显示方式                e    = event;
 86[JavaScript]自定义Title的显示方式                e.srcElement.title = sTitle;
 87[JavaScript]自定义Title的显示方式            }
;
 88[JavaScript]自定义Title的显示方式            
 89[JavaScript]自定义Title的显示方式            tooltip.hide();
 90[JavaScript]自定义Title的显示方式        
 91[JavaScript]自定义Title的显示方式        }

 92[JavaScript]自定义Title的显示方式    );
 93[JavaScript]自定义Title的显示方式}

 94[JavaScript]自定义Title的显示方式
 95[JavaScript]自定义Title的显示方式//移动事件
 96[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式tooltip.move = function (evt) [JavaScript]自定义Title的显示方式{
 97[JavaScript]自定义Title的显示方式//Get mouse X & Y
 98[JavaScript]自定义Title的显示方式    var x=0, y=0;
 99[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    if (document.all) [JavaScript]自定义Title的显示方式{//IE
100[JavaScript]自定义Title的显示方式        x = (document.documentElement && document.documentElement.scrollLeft) ? document.documentElement.scrollLeft : document.body.scrollLeft;
101[JavaScript]自定义Title的显示方式        y = (document.documentElement && document.documentElement.scrollTop) ? document.documentElement.scrollTop : document.body.scrollTop;
102[JavaScript]自定义Title的显示方式        x += window.event.clientX;
103[JavaScript]自定义Title的显示方式        y += window.event.clientY;
104[JavaScript]自定义Title的显示方式        
105[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式    }
 else [JavaScript]自定义Title的显示方式{//Good Browsers
106[JavaScript]自定义Title的显示方式        x = evt.pageX;
107[JavaScript]自定义Title的显示方式        y = evt.pageY;
108[JavaScript]自定义Title的显示方式    }

109[JavaScript]自定义Title的显示方式    this.tip.style.left = (x + this.offsetX) + "px";
110[JavaScript]自定义Title的显示方式    this.tip.style.top = (y + this.offsetY) + "px";
111[JavaScript]自定义Title的显示方式}

112[JavaScript]自定义Title的显示方式
113[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式tooltip.show = function (text) [JavaScript]自定义Title的显示方式{
114[JavaScript]自定义Title的显示方式    if (!this.tip) return;
115[JavaScript]自定义Title的显示方式    this.tip.innerHTML = text;
116[JavaScript]自定义Title的显示方式    this.tip.style.display = "block";
117[JavaScript]自定义Title的显示方式}

118[JavaScript]自定义Title的显示方式
119[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式tooltip.hide = function () [JavaScript]自定义Title的显示方式{
120[JavaScript]自定义Title的显示方式    if (!this.tip) return;
121[JavaScript]自定义Title的显示方式    this.tip.innerHTML = "";
122[JavaScript]自定义Title的显示方式    this.tip.style.display = "none";
123[JavaScript]自定义Title的显示方式}

124[JavaScript]自定义Title的显示方式
125[JavaScript]自定义Title的显示方式//load的时候初始化自定义显示方式
126[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式window.attachEvent("onload",function(e)[JavaScript]自定义Title的显示方式{tooltip.init();});
127[JavaScript]自定义Title的显示方式
128[JavaScript]自定义Title的显示方式
129[JavaScript]自定义Title的显示方式
130[JavaScript]自定义Title的显示方式
131[JavaScript]自定义Title的显示方式
132[JavaScript]自定义Title的显示方式

 

[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式qTip.css
 1[JavaScript]自定义Title的显示方式[JavaScript]自定义Title的显示方式div#qTip {[JavaScript]自定义Title的显示方式}{
 2[JavaScript]自定义Title的显示方式  padding: 3px;
 3[JavaScript]自定义Title的显示方式  border: 1px solid gray;
 4[JavaScript]自定义Title的显示方式  border-right-width: 2px;
 5[JavaScript]自定义Title的显示方式  border-bottom-width: 2px;
 6[JavaScript]自定义Title的显示方式  display: none;
 7[JavaScript]自定义Title的显示方式  background: #999;
 8[JavaScript]自定义Title的显示方式  background-color:#ffffff;
 9[JavaScript]自定义Title的显示方式  color: #349045;
10[JavaScript]自定义Title的显示方式  font-size:9pt;
11[JavaScript]自定义Title的显示方式  font: bold 9px Verdana, Arial, Helvetica, sans-serif;
12[JavaScript]自定义Title的显示方式  text-align: left;
13[JavaScript]自定义Title的显示方式  position: absolute;
14[JavaScript]自定义Title的显示方式  z-index: 1000;
15[JavaScript]自定义Title的显示方式  padding:"5px 8px 3px 8px"; 
16[JavaScript]自定义Title的显示方式}

17[JavaScript]自定义Title的显示方式


 



本文转自浪子博客园博客,原文链接:http://www.cnblogs.com/walkingboy/archive/2006/08/03/ClientScript_qTip.html,如需转载请自行联系原作者