首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Ajax >

ajax 搜寻时多关键词,太耗内存cpu

2012-12-16 
ajax 搜索时多关键词,太耗内存cputest.html 页面!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitio

ajax 搜索时多关键词,太耗内存cpu
test.html 页面


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 
<title>搜索提示</title> 
</head> 
<script type="text/javascript" src="jquery.js"></script> 
<script type="text/javascript"> 
var line = 0;//定义一个全局的line以用于记录当前显示的是哪一行 
var keywords = "";//用于记录用户输入的关键字,因为在上下键操作的过程中会改变搜索框的值,用户在通过键盘上下键操作时应该还可以返回到他最初的状态 
 
$(document).keyup(function(event){//用户通过键盘进行操作,按键弹起时                      
 
    $("#keyword").bind("propertychange", showGs);//将mychange事件绑定到propertychange事件上 
    $("#keyword").bind("input", showGs);//firefox  与上面的效果类似,只是在firefox中是input事件 
 
    if(event.keyCode != 40 && event.keyCode != 38 && event.keyCode != 13){//当用户不是在按上下与回车键时,将搜索框中的值赋给keywords,记录用户的初始状态 
          keywords = $("#keyword").val();                                    
    } 
 
 }); 
 
 
$(document).keydown(function (event) {// 38上  40下 13回车  //用户通过键盘进行操作,按键按下起时  
        if($.browser.msie){ 
            var keyStr=event.keyCode; 
        }else{ 
            var keyStr=event.which; 
        } 
        if(document.getElementById("ts").style.display == "block"){ 
            //按键盘的上方向键 
            if(keyStr==38){ 
             
                  $("#keyword").unbind("propertychange");//移除propertychange事件 
                  $("#keyword").unbind("input");//firefox与上面类似 
                   
                  var html = ""; 
                  line = (line == 0 ? $("#newUrl li").length : line-1 ); 
                  if(line == 0){ 
 
                       html = keywords; 


                       $("#newUrl li").removeClass("selecte");//消除选中样式 
                        
                  }else{ 
 
                    $("#newUrl li").removeClass("selecte");//消除选中样式 
                    $("#newUrl li").eq(line-1).addClass("selecte"); 
                    html = $("#newUrl li").eq(line-1).find("a").text(); 
                     
                  } 
 
                  $("#keyword").val(html); 
            }else if(keyStr==40){ 
             
                $("#keyword").unbind("propertychange");//移除propertychange事件 
                $("#keyword").unbind("input");//firefox与上面类似 
             
                var html = ""; 
             
                if(line==$("#newUrl li").length){//如果line值为当前提示信息行数的值时,将用户最初输入的信息赋给搜索框 
                 
                    html = keywords; 
                    $("#newUrl li").removeClass("selecte");//消除选中样式 
                     
                }else{//当有提示信息行选中时 
                     
                    $("#newUrl li").removeClass("selecte");//消除选中样式 
                    html = $("#newUrl li").eq(line).find("a").text();//获取有效提示信息 
                    $("#newUrl li").eq(line).addClass("selecte"); 
                 
                } 


                 
                line = (line == $("#newUrl li").length ? 0 : line + 1);//line值不为提示信息行数的值时line值加1,否则line归0 
                $("#keyword").val(html);//将结果赋给搜索框 
                 
            }//end if keyStr==40 of 
             
        }//en if block 
}); 
 
 
//ajax获取提示内容 
function showGs(event){ 
    if($.browser.msie){ 
        var keyStr=event.keyCode; 
    }else{ 
        var keyStr=event.which; 
    } 
    if(keyStr!=38&&keyStr!=40&&keyStr!=13){ 
        $("#ts").empty(); 
        var vkeyword=$("#keyword").val(); 
        if(vkeyword!=""){ 
            $.post("test.asp","keyword="+escape(vkeyword),function(m){ 
                $("#ts").html(m); 
                document.getElementById("ts").style.display = "block"; 
            }); 
        }else{ 
                document.getElementById("ts").style.display = "none"; 
                line = 0; 
        } 
    } 

 
 
//鼠标单击获取内容给文本框 
function val(th){ 
    var entLiText=$(th).find("a").text(); 
    $("#keyword").val(entLiText); 
    none(); 

 
//鼠标移上添加样式 
function Over(th){ 
    $("#newUrl li").removeClass("selecte"); 
    $(th).addClass("selecte"); 

 
//鼠标离开清除样式 
function Out(){ 
    $("#newUrl li").removeClass("selecte"); 

 
//关闭 
function none(){ 
    document.getElementById("ts").style.display = "none"; 
    line = 0; 

 
//失去焦点之后关闭 
$(document.documentElement).click(function () { 
    none(); 
}); 
</script> 
<body> 
<style>
.search
{
    BACKGROUND: url(search.jpg) no-repeat;
    FLOAT: left;
    MARGIN: 6px 5px 6px 20px;
    WIDTH: 290px;


    HEIGHT: 32px
}
.input
{
    BORDER-RIGHT: medium none;
    PADDING-RIGHT: 6px;
    BORDER-TOP: medium none;
    PADDING-LEFT: 6px;
    FONT-SIZE: 12px;
    BACKGROUND: none transparent scroll repeat 0% 0%;
    FLOAT: left;
    PADDING-BOTTOM: 4px;
    BORDER-LEFT: medium none;
    WIDTH: 200px;
    COLOR: #959595;
    LINE-HEIGHT: 24px;
    PADDING-TOP: 4px;
    BORDER-BOTTOM: medium none;
    HEIGHT: 24px
}
.button
{
    BORDER-RIGHT: medium none;
    BORDER-TOP: medium none;
    FONT-WEIGHT: bolder;
    FONT-SIZE: 14px;
    BACKGROUND: none transparent scroll repeat 0% 0%;
    FLOAT: left;
    MARGIN-LEFT: 180px;
    BORDER-LEFT: medium none;
    WIDTH: 57px;
    COLOR: #fff;
    LINE-HEIGHT: 30px;
    BORDER-BOTTOM: medium none;
    HEIGHT: 32px;
    TEXT-ALIGN: center
}
#newUrl{list-style-type: none;border:1px solid #000;width:232px;} 
#newUrl li{background:#FFF; text-align:left;} 
#newUrl li{display:block; padding:5px 6px; cursor:pointer; color:#666;} /*设置提示框内li标签下的a标签效果*/ 
#newUrl li a:hover{background:#D8D8D8; text-decoration:none; color:#000;} /*当鼠标移入提示框内时的效果*/ 
#newUrl .selecte{background:#CCCCCC;} /*当键盘移入提示框内时的效果*/ 
</style> 
 
<div class="search" style="position:relative;"> 
<form id="searchForm" name="searchForm" method="get"> 
<input name="keywords" autocomplete="off" type="text" id="keyword" onKeyUp="showGs(event)" value="在此输入您要搜索的产品名称" onBlur="if(this.value == '')this.value='在此输入您要搜索的产品名称'" onFocus="if(this.value == '在此输入您要搜索的产品名称')this.value = ''" class="input" /> 
<input name="imageField" style="padding:0; margin:0; float:left; margin-left:20px;" type="submit" value="搜索" class="button" /> 
</form> 
<div id="ts" value="aaa" style="position:absolute;top:30px;left:0px;z-index:1000;"></div> 
</div> 
</body> 
</html>



test.asp 页面

Response.Charset = "gb2312" 
keyword=Trim(Request.Form("keyword"))
keyword=replace(keyword,"+"," ")
if trim(keyword)="" then  response.End()

function seachKey(booksname,keyword) 
MyArray = Split(keyword," ") 
For I = Lbound(MyArray) to Ubound(MyArray) 
if I=0 then
tmpstr=tmpstr & " booksname  like '%"&MyArray(I)&"%'"
else
tmpstr=tmpstr & " and booksname  like '%"&MyArray(I)&"%'"
end if
Next 
seachKey=tmpstr


end function

set rs=server.CreateObject("adodb.recordset")
strWhere=seachKey(booksname,keyword) 
rs.open "select top 10 booksname,chengjiaocount from books where "& strwhere &" order by chengjiaocount desc",conn,1,3
If not (rs.eof and rs.BOF) Then  
 i=1
Response.write "<ul id=""newUrl"" onMouseOut=""Over()"">"
 Do While Not rs.eof
  Response.write "<li onMouseOver=""Over(this)"" onclick=""val(this)""><a>"&rs("booksname")&"</a></li>"
  i=i+1
  if i>=10 then exit do
 rs.movenext
 loop
Response.write "</ul>"
End If  
rs.close:set rs=nothing



现在在test.html中如果进行多个关键词搜索时(本地测试),内存,CPU会一下很高,如果是胡乱输入关键词,页面就会变的很慢。该如何解决,望版主,高手赐教。
[最优解释]
在1#基础上修改后,$(document).keydown中移除事件的代码可以不用要了
// $("#keyword").unbind("propertychange");//移除propertychange事件 
//$("#keyword").unbind("input");//firefox与上面类似
 

而且延时执行查询好些,这样对于输入快的人只需要发送1,2次请求就行了,要不每次keydown都发送浪费资源


var timer
//ajax获取提示内容 
function showGs(event){ 
    if($.browser.msie){ 
        var keyStr=event.keyCode; 
    }else{ 
        var keyStr=event.which; 
    } 
    if(keyStr!=38&&keyStr!=40&&keyStr!=13){ 
        $("#ts").empty(); 
        var vkeyword=$("#keyword").val(); 
        if(vkeyword!=""){ 

///////////////////
clearTimeout(timer);///////////////
timer=setTimeout(function(){
            $.post("test.asp","keyword="+escape(vkeyword),function(m){ 
                $("#ts").html(m); 
                document.getElementById("ts").style.display = "block"; 
            }); 
},300);//这个延时自己决定,一般300ms够了
        }else{ 
                document.getElementById("ts").style.display = "none"; 
                line = 0; 
        } 
    } 
}
 
[其他解释]
$(document).keyup(function(event){//用户通过键盘进行操作,按键弹起时                      
  /*///////////放到外面来,要不每次keyup就绑定一次showGs,这样会执行n次的showGs,当然慢了
    $("#keyword").bind("propertychange", showGs);//将mychange事件绑定到propertychange事件上 
    $("#keyword").bind("input", showGs);//firefox  与上面的效果类似,只是在firefox中是input事件 */
  
    if(event.keyCode != 40 && event.keyCode != 38 && event.keyCode != 13){//当用户不是在按上下与回车键时,将搜索框中的值赋给keywords,记录用户的初始状态 


          keywords = $("#keyword").val();                                    
    } 
  
 }); 

$(function(){/////////
 
    $("#keyword").bind("propertychange", showGs);//将mychange事件绑定到propertychange事件上 
    $("#keyword").bind("input", showGs);//firefox  与上面的效果类似,只是在firefox中是input事件 

})



你直接给input绑定事件不行吗,干嘛要给document绑定??document要处理的对象这么多,你主要的不就是input对象的处理,给document添加事件有点大材小用
[其他解释]
版主,你太有才了。

热点排行