对DOJO基本上算是文盲,只是项目中需要一些特效页面,在网上找了找,感觉DOJO做的不错,就拿过来用了,不过感觉性能很不好,页面刷新明显迟钝
我的页面上大概有10几个DOJO,刷一次页面仅仅因为DOJO的widget的初始化的问题就要5-6秒钟,读了一下DOJO的代码,只要的时间都花费在dojo.hostenv.makeWidgets这个方法中,本人的js水平比较低,基本上改不了DOJO的代码,不过在这个方法中却找到了一个稍微提高些性能的办法,这就是 djConfig.searchIds的使用。
dojo.hostenv.makeWidgets = function(){
// you can put searchIds in djConfig and dojo.hostenv at the moment
// we should probably eventually move to one or the other
var sids = [];
if(djConfig.searchIds && djConfig.searchIds.length > 0) {
sids = sids.concat(djConfig.searchIds);
}
if(dojo.hostenv.searchIds && dojo.hostenv.searchIds.length > 0) {
sids = sids.concat(dojo.hostenv.searchIds);
}
if((djConfig.parseWidgets)||(sids.length > 0)){
if(dojo.evalObjPath("dojo.widget.Parse")){
// we must do this on a delay to avoid:
// http://www.shaftek.org/blog/archives/000212.html
// IE is such a tremendous peice of shit.
var parser = new dojo.xml.Parse();
if(sids.length > 0){
for(var x=0; x<sids.length; x++){
var tmpNode = document.getElementById(sids[x]);
if(!tmpNode){ continue; }
var frag = parser.parseElement(tmpNode, null, true);
dojo.widget.getParser().createComponents(frag);
}
}else if(djConfig.parseWidgets){
var frag = parser.parseElement(document.getElementsByTagName("body")[0] || document.body, null, true);
dojo.widget.getParser().createComponents(frag);
}
}
}
}
具体使用方法就是在自己的页面上把所有的dojo的widget都要定义ID,类似这样
<input id="queryStr_0" name="queryStr_0" dojoType="ComboBox" style="width:280px;" autocomplete="false" >
然后加上这样一段js
<script language=javascript>
djConfig.searchIds=['queryStr_0','queryStr_1','queryStr_2'];
</script>
这里的'queryStr_0'之类的就是你的widget的ID,这样对于我的10几个widget的页面,速度基本上会快上1-2倍。