对csdn论坛的一点点技术上的改进(关于tacontent.htc的绑定问题),欢迎讨论。

Go_Rush 2002-12-01 02:23:09
用过htc的人应该都知道,htc最大的缺陷是重复下载的问题。

比如

something.htc的内容
<PUBLIC:COMPONENT>
<PUBLIC:ATTACH EVENT="oncontentready" ONEVENT="element.init()" />
<PUBLIC:METHOD NAME="init" />
<SCRIPT>
function init(){
element.attachEvent("onclick",function(){alert(event.srcElement.value)};
}
</SCRIPT>
</PUBLIC:COMPONENT>


diaplay.htm内容的:
<html>
<style>input { behavior:url('something.htc')}</style>
<body>
<input type=text><input type=text><input type=text><input type=text><input type=text>
<input type=text><input type=text><input type=text><input type=text><input type=text>
</body></html>

当这个网页被打开的时候,something.htc这个文件不是下载一次,分析一次.
而是被重新下载了并重新分析作用于input标签上。

一共下载了十次,被分析了十次。(尽管something.htc已经在您的浏览器的cache里面)
如果有200个<input type=text>那么将被下载200次,这样鼠标晃动厉害,对性能也有影响。


看看CSDN的代码片段:
if (parseInt(window.IEVersion)<6)
document.write("<style>textarea.content { behavior:url('/Expert/xsl/tacontent.htc')}</style>");

显然,每一个回复内容的显示都用了htc,对于那些热门的帖子(回复超过100的,这种帖子不少哦)。
显示起来是很吃力的。


/************************************************************/

我的解决方法:(看等效代码)

something.htc的内容

<PUBLIC:COMPONENT>
<PUBLIC:ATTACH EVENT="oncontentready" ONEVENT="element.init()" />
<PUBLIC:METHOD NAME="init" />
<SCRIPT>
function init(){
var colls=document.all.tags("INPUT");
var collnum=colls.length
for(var i=0;i<collnum;i++){
colls[i].attachEvent("onclick",function(){alert(event.srcElement.value)};
}
}
</SCRIPT>
</PUBLIC:COMPONENT>


display.htm的内容

<html>
<body style="behavior:url('something.htc')"> <!--绑定到这里-->
<input type=text><input type=text><input type=text><input type=text><input type=text>
<input type=text><input type=text><input type=text><input type=text><input type=text>
<input type=text> ....多少input都不怕了.......... <input type=text>
</body></html>


注意到没有,我把这个htc绑定到body上面,只需要下载和被浏览器分析一次,而
在body的oncontentready事件上运行代码,就相当于在window.onload或者document.onload事件一样。
是在所有input标签都被下载后才访问他们,不存在会访问到一个还没有被下载完的标签的可能。

建议CSDN的相关技术人员关注一下,和大家一起讨论一下,把这个论坛的速度搞上去。

最后,如果我的这个建议有什么不妥的地方,或者我没有考虑周到的地方,请务必让我知道。

...全文
35 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
pzs8888 2002-12-17
  • 打赏
  • 举报
回复
gz
蝈蝈俊 2002-12-12
  • 打赏
  • 举报
回复
修改过的版本,有些人报贴子内容显示限制在4行,一直找不到这个问题的原因,我本地模拟也没有这个问题,这个方案暂停。
Go_Rush 2002-12-04
  • 打赏
  • 举报
回复
呵呵,我看了一下,真的改了呀。感觉是好些了。

CSDN以后会越来越好的嘛
蝈蝈俊 2002-12-04
  • 打赏
  • 举报
回复
非常感谢,当初不是使用htc,是动态分析,速度比使用htc慢,没想到htc中动态分析比不用分析要快。
slyer 2002-12-04
  • 打赏
  • 举报
回复
感谢Go_Rush为CSDN提出的建议!
蝈蝈俊 2002-12-04
  • 打赏
  • 举报
回复
2.xsl
修改为:
if(parseInt(window.IEVersion)<6)document.write("<style>body{ behavior:url('/Expert/xsl/tacontent.htc')}</style>");

tacontent.htc 修改为:
<PUBLIC:COMPONENT>
<PUBLIC:ATTACH EVENT="oncontentready" ONEVENT="element.init()" />
<PUBLIC:METHOD NAME="init" />
<SCRIPT>
function init(){
var colls=element.document.all.tags("textarea");
var collnum=colls.length;
for(var i=0;i<collnum;i++)
{
var height=colls[i].scrollHeight;
colls[i].runtimeStyle.height=height+"px";
}
}
</SCRIPT>
</PUBLIC:COMPONENT>
蝈蝈俊 2002-12-04
  • 打赏
  • 举报
回复
试验了,根据你的建议修改了
tacontent.htc 和 2.xsl 文件

现在ie5.0的显示是比以前快点了
蝈蝈俊 2002-12-04
  • 打赏
  • 举报
回复
刚刚看到,我去做做实验
Go_Rush 2002-12-04
  • 打赏
  • 举报
回复
up
emu 2002-12-03
  • 打赏
  • 举报
回复
就是,在大量绑定的时候用script绑定比htc自己去绑定要快的多。
vivanboy 2002-12-03
  • 打赏
  • 举报
回复
阿猫都要辞职了,找蝈蝈俊吧
vivanboy 2002-12-03
  • 打赏
  • 举报
回复
学习啊
yonghengdizhen 2002-12-03
  • 打赏
  • 举报
回复
这个改进不错,值得推荐..
Go_Rush 2002-12-03
  • 打赏
  • 举报
回复
to ghj1976(蝈蝈俊.net):

怎么会更慢呢?
我是测试过的哦。

我用了2000个<input type=text>来测试,结果,我的方法用了不到1秒
而csdn的方法用了33秒

公布测试代码:


/******************************************************/
gorush.htc
/******************************************************/

<PUBLIC:COMPONENT>
<PUBLIC:ATTACH EVENT="oncontentready" ONEVENT="element.init()" />
<PUBLIC:METHOD NAME="init" />
<SCRIPT>
function init(){
var t1=new Date();
var colls=element.document.all.tags("INPUT");
var collnum=colls.length;
for(var i=0;i<collnum;i++){
colls[i].attachEvent("onclick",function(){alert(event.srcElement.value)});
}
var t2=new Date();
element.setAttribute("htc_time",(t2-t1));
}
</SCRIPT>
</PUBLIC:COMPONENT>


/******************************************************/
gorush.htm
/******************************************************/

<html><style>body { behavior:url('gorush.htc')}</style>
<script>
var d1=new Date(); //纪录起始时间
function window.onload(){
var d2=new Date();
alert("页面加载时间:\t"+(d2-d1)/1000+"\nhtc运行时间:\t"+oBody.getAttribute("htc_time")/1000)
};
</script>
<body id=oBody>
<input type=text><input type=text><input type=text>

....这里放了 2000个<input type=text>

<input type=text><input type=text><input type=text>
</body></html>

/******************************************************/





/******************************************************/
csdn.htc
/******************************************************/

<PUBLIC:COMPONENT>
<PUBLIC:ATTACH EVENT="oncontentready" ONEVENT="element.init()" />
<PUBLIC:METHOD NAME="init" />
<SCRIPT>
function init(){
element.attachEvent("onclick",function(){alert(event.srcElement.uniqueID)});
}
</SCRIPT>
</PUBLIC:COMPONENT>



/******************************************************/
csdn.htm
/******************************************************/

<html><style>input { behavior:url('csdn.htc')}</style>
<script>
var d1=new Date(); //纪录加载前的时间
function window.onload(){
var d2=new Date();
alert("页面加载时间:"+(d2-d1)/1000);
}
</script>
<body id=oBody>
<input type=text><input type=text><input type=text>
....这里放了 2000个<input type=text>

<input type=text><input type=text><input type=text>
</body></html>




测试结果。
gorush.htm 0.88s
csdn.htm 33.67s
蝈蝈俊 2002-12-03
  • 打赏
  • 举报
回复
看到,非常感谢.

var colls=document.all.tags("INPUT");
var collnum=colls.length
for(var i=0;i<collnum;i++){
colls[i].attachEvent("onclick",function(){alert(event.srcElement.value)};
}

象这样的循环,就是当初用到的方式,但是这样的方式比现在的方式要慢很多,有些配置差的机子会死机。所有采用了现在这种方式。
Go_Rush 2002-12-01
  • 打赏
  • 举报
回复
是的,你的方法也可以解决这个问题。

但是我还是认为绑定在body上比较好,毕竟是在所有内容都下载完后才开始分析。

不象绑定在textarea一边下载一边分析。。

对客户端的机器要求很高哦
我在网吧上网的时候常常看到浏览器一片空白,多打开几个窗口,ie就死了。
Lostinet 2002-12-01
  • 打赏
  • 举报
回复
其实

xxx.asp

<%@Language=JScript%>
<%

Response.ContextType="text/x-component";
Response.Expires=3600;

%>
<PUBLIC...
...
..
.

就可以解决这个问题.
Go_Rush 2002-12-01
  • 打赏
  • 举报
回复
up
潇洒 2002-12-01
  • 打赏
  • 举报
回复
哦... 不好意思. 一时糊涂.... 错了错了. :(
潇洒 2002-12-01
  • 打赏
  • 举报
回复
呵呵~~ 楼主说得很对啊 !!

还是把 HTC 绑到 body 上好. 我上次写了一个...就是在input里的.
发觉真的是速度慢.每一个 input 都要加载. 比较麻烦...

不过... 我想, 如果不写在 body 里... 下面这样也应该可以的吧?
<style>
.INPUT {behavior:url('something.htc')}
</style>

<input type=text> ....多少input都不怕了.......... <input type=text>
加载更多回复(1)

87,975

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧