tangzhiyou 2009-10-28 23:35
浏览 167
已采纳

jquery 内存占用问题

现在尝试着在用jquery做一个异步加载的菜单,采用的JQUERY中的.append()方法动态生成数据,发现cpu的占用率很高,不知道是不是我的代码哪里存在着问题。请各位帮忙看一下。
下面是html代码:

<ul class="node1">
<li>
<a href="#" id="js_parentNode2" onClick="showChildNode('js_parentNode2', 1, 0, 0, 0,'parentNode');">all sports</a>
<ul id="gameCategory"></ul>

</li>
</ul>


下面是js代码:

function showChildNode(menuId, menuLevel, sportsID, leagueID, eventID,className) {
var ul = $("#"+menuId).siblings("ul");

if(ul.is(":visible")){
ul.parent("li").siblings("li").show();

ul.hide();
$("#"+menuId).removeClass(className);
}else{
var action;
if (menuLevel == 1) {
action = "getAllSportCategory.action";

loadSportsCategoryData(action, "", $("#js_data"));
} else if (menuLevel == 2) {
action = "getLeagueBySportCategory.action";
loadLeagueData(action, sportsID, $("#js_data"));
} else if (menuLevel == 3) {
action = "getEventListByLeague.action";
loadEventData(action, sportsID, leagueID, $("#js_data"));
}
if(leagueID != "0"){
if(menuLevel < 2){
$("#"+menuId).parent("li").parent("ul").prev().hide();
}
}
ul.parent("li").siblings("li").hide();

ul.show();
$("#"+menuId).addClass(className);

}
}

function loadSportsCategoryData(action,param,obj){
$.ajax({
url:action,
type:"post",
data:{searchSportsID:param},
dataType:"json",
success:function(data){
$("#gameCategory").find("#sportsCategoryLevel").remove();
var html = "";
if(data.length > 0 ){
for (var i=0; i<data.length; i++) {
html += "<li id='sportsCategoryLevel'><a href='#' id='sportsCategory"+data[i].sportsID+"' onClick=showChildNode('sportsCategory"+data[i].sportsID+"',2," + data[i].sportsID +",0,0,'childNode');>"+data[i].sportsName+"</a><ul id='subSportsCategory" + data[i].sportsID +"'></ul></li>";
}
$("#gameCategory").append(html);
html = "";
}
},error:function(data){
alert("系统有误!");
}
});

}

function loadLeagueData(action, sportsID, obj) {
$.ajax({
url:action,
type:"post",
data:{searchSportsID:sportsID},
dataType:"json",
success:function(data){
var id = "#subSportsCategory" + sportsID;
$(id).find("#leagueLevel").remove();
var html = "";
if(data.length > 0 ){
for (var i=0; i<data.length; i++) {
html += "<li id='leagueLevel'><a href='#' id='league"+data[i].leagueID+"' onClick=showChildNode('league"+data[i].leagueID+"',3,"+data[i].sportsID+","+data[i].leagueID + ",0,'threeLevelNode');>"+data[i].leagueName+"</a><ul id='subLeague" + data[i].leagueID +"'></ul></li>";
}
$(id).append(html);
html = "";
}
},error:function(data){
alert("系统有误!");
ulLen = 0;

}
});
}

function loadEventData(action, sportsID, leagueID, obj){
$.ajax({
url:action,
type:"post",
data:{searchSportsID:sportsID, searchLeagueID:leagueID},
dataType:"json",
success:function(data){
var id = "#subLeague" + leagueID;
$(id).find("#eventLevel").remove();
var html = "";
if(data.length > 0 ){
for (var i=0; i<data.length; i++) {
html += "<li id='eventLevel'><a href='#' id='event"+data[i].eventID+"' onClick=showChildNode('event"+data[i].eventID+"',4," + data[i].leagueID +",0,0,'leafNode');>"+data[i].homeTeamName+" V"+data[i].awayTeamName+"</a><ul id='subEvent" + data[i].leagueID +"'></ul></li>";
}
$(id).append(html);
html = "";
}
},error:function(data){
alert("系统有误!");
}
});
}


问题补充:
非常感谢wangjinpeng,让我的代码又得到了一次提高,但是经过这样的修改,cpu的占用还是没有得到显著提高。请各位帮忙看一下,代码还有什么问题。

下面是我修改过后的js代码:
var nodeHtml = [];
function loadSportsCategoryData(action,param,obj){
$.ajax({
url:action,
type:"post",
data:{searchSportsID:param},
dataType:"json",
success:function(data){
if(data.length > 0 ){
for (var i=0; i<data.length; i++) {
nodeHtml[i] = "<li><a href='#' id='sportsCategory"+data[i].sportsID+"' onClick=showChildNode('sportsCategory"+data[i].sportsID+"',2," + data[i].sportsID +",0,0,'childNode');>"+data[i].sportsName+"</a><ul id='subSportsCategory" + data[i].sportsID +"'></ul></li>";
}
$("#gameCategory").html(nodeHtml.join(''));
nodeHtml = [];
}
},error:function(data){
alert("系统有误!");
}
});
}

function loadLeagueData(action, sportsID, obj) {
$.ajax({
url:action,
type:"post",
data:{searchSportsID:sportsID},
dataType:"json",
success:function(data){
var id = "#subSportsCategory" + sportsID;
if(data.length > 0 ){
for (var i=0; i<data.length; i++) {
nodeHtml[i] = "<li><a href='#' id='league"+data[i].leagueID+"' onClick=showChildNode('league"+data[i].leagueID+"',3,"+data[i].sportsID+","+data[i].leagueID + ",0,'threeLevelNode');>"+data[i].leagueName+"</a><ul id='subLeague" + data[i].leagueID +"'></ul></li>";
}
$(id).html(nodeHtml.join(''));
nodeHtml = [];
}
},error:function(data){
alert("系统有误!");
}
});
}

  • 写回答

4条回答 默认 最新

  • wangjinpeng 2009-10-28 23:35
    关注

    简单分析你的code:
    var html = "";

    if(data.length > 0 ){

    for (var i=0; i html += ""+data[i].sportsName+"

      ";

      }

      $("#gameCategory").append(html);

      html = "";

      }

      1. var html={}; html.push(...); html.join();这个可以大幅提高字符串操作速度.
      2. $("#gameCategory").append(html);如果gameCategory中是没有内容的,最好用html(),这样可以减少很多dom操作.如果有内容,最后采用after来制定添加到谁的后面.
      3. onClick=showChildNode('sportsCategory"+data[i].sportsID+"',2," + data[i].sportsID +",0,0,'childNode'), 最好是先添加纯的html,最后给你的#sportsCategoryLevel li.a 通过$.live来绑定事件,而且这个方法的2,0,0是怎么回事,重复浪费,没有意义.
      4. 循环添加同样id的dom本身就是一个错误.所以你的这段code本来就没有什么意义. 你可以这样修改一下,写js code最好多思考,保持shorter和simple.
      本回答被题主选为最佳回答 , 对您是否有帮助呢?
      评论
    查看更多回答(3条)

    报告相同问题?

    悬赏问题

    • ¥15 安装svn网络有问题怎么办
    • ¥15 Python爬取指定微博话题下的内容,保存为txt
    • ¥15 vue2登录调用后端接口如何实现
    • ¥65 永磁型步进电机PID算法
    • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
    • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
    • ¥15 如何处理复杂数据表格的除法运算
    • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
    • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
    • ¥15 latex怎么处理论文引理引用参考文献