[JavaScript]自定义Title的显示方式
好久没有写blog了,今天更新下最近在做的事情,顺便让朋友们了解下,我还顽强地活着
...
最近刚做完公司的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的所有元素集合进行自定义显示
2.循环出来每个挂载mouse事件
3.Event采用赋值形式
OK.针对这些问题,我们开始我们的重构之旅
1.首先,我希望页面控件的所有Tag只要有Title的,我都要采用自定义显示,这时想到一个最土的招就是
var anchors = document.all;
2.它的实现方式是循环找到所有的有标记的Tag,然后设置mouse事件.
这一步我觉得有2个问题:
a.每个tag都设置mouse的事件,显然页面变大了,特别是我现在要求所有的Tag都要自定义显示
b.Event采用赋值.......寒一个
我的思路是使用事件的串连机制,把mouse的事件直接挂载到document上面,然后进行冒泡处理(我不知道这样的效率实际上是更好呢,还是更坏,自我感觉应该会好些吧?:))
当然这里或许会碰到的所谓的IE 内存泄漏,因为没有detachEvent.(本来想使用Event.observer的,不过prototype还不谈熟,加上脑子也晕乎乎了,留待下次重构吧)...
document.attachEvent
看来好像只支持IE哦....还是对少数的其他Fans支持一下吧,修改一下系统方法,让它适当兼容一下其他浏览器
if(!tipContainer) {
tipContainer = document.createElementNS ? document.createElementNS(tipNameSpaceURI, "div") : document.createElement("div");
tipContainer.setAttribute("id", tipContainerID);
//美化下?
document.getElementsByTagName("body").item(0).appendChild(tipContainer);
}
qTip.js
qTip.css

最近刚做完公司的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
var qTipTag = "a"; //Which tag do you want to qTip-ize? Keep it lowercase!//

2.循环出来每个挂载mouse事件
1
var anchors = document.getElementsByTagName (qTipTag);
2
3
for (var i = 0; i < anchors.length; i ++) {
4
//
.
5
}

2

3

4


5

3.Event采用赋值形式
1
a.onmouseover = function() {tooltip.show(this.getAttribute('tiptitle'))};
2
a.onmouseout = function() {tooltip.hide()};
3

2

3

OK.针对这些问题,我们开始我们的重构之旅
1.首先,我希望页面控件的所有Tag只要有Title的,我都要采用自定义显示,这时想到一个最土的招就是

2.它的实现方式是循环找到所有的有标记的Tag,然后设置mouse事件.
这一步我觉得有2个问题:
a.每个tag都设置mouse的事件,显然页面变大了,特别是我现在要求所有的Tag都要自定义显示
b.Event采用赋值.......寒一个
我的思路是使用事件的串连机制,把mouse的事件直接挂载到document上面,然后进行冒泡处理(我不知道这样的效率实际上是更好呢,还是更坏,自我感觉应该会好些吧?:))
1
document.attachEvent("onmouseover",function(e)
2
{
3
if(typeof(event)=="undefined"){
4
sTitle = e.target.getAttribute("title")
5
e.target.removeAttribute("title");
6
}else{
7
e = event;
8
sTitle = e.srcElement.title;
9
e.srcElement.title = "";
10
};
11
12
if(!sTitle == "")
13
{
14
tooltip.show(sTitle);
15
}
16
}
17
);
18
19
document.attachEvent('onmouseout',function(e)
20
{
21
22
if(typeof(event)=="undefined"){
23
e.target.setAttribute("title",sTitle);
24
}else{
25
e = event;
26
e.srcElement.title = sTitle;
27
};
28
29
tooltip.hide();
30
31
}
32
);
33

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

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

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

2

3

4

5

6

7

8

9

10

这样子,大概qTip的功能就重构结束了...
当然还有很多可以改进的地方,比如把提示用的层设计得漂亮一点...







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


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述