[转] 利用AJAX实现搜索提示功能 (关键字自动匹配功能)

利用AJAX实现搜索提示功能 (关键字自动匹配功能)
2008-05-23 07:44
关于网友提到代码不能在FIREFOX下运行的问题的解决:

1、由于FF各方面的安全性,它不支持跨域的访问,应此注意在调用跨域脚本代码之前加上

document.domain="http://www.yourdomain.com/" ,不过本实例不需要。

2、在FF下,xmlhttpRequest.send方法必须加上参数null,IE下不需要。另外,xmlhttpRequest.open方法的O要小写open,Send 改为send。

3、初始化对象后,注意加上xmlhttpRequest.overrideMimeType('text/xml'); 以便在 错误控制台 看到不符合XML错误的提示。

4、如果是netscape浏览器,注意加上 netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");

5、修改代码 Response.Write("这|下|你|就|满足|了|吧|继续关注") 显示的数据符合XML格式。然后在前台用JAVASCRIPT解析XML。

谢谢大家关注!


注:好多朋友向我发EMAIL,要求源代码,在此感谢他们对这一技术的关注,从今天(08-01-22)开始,我不再发了。有时间把完整的代码贴出来。

希望大家一起学习JAVASCRIPT。。。


原文如下:

希望需要的人慢慢的看,不能急噪。不清楚可以电子邮件给我。

“谷歌主页搜索增加信息提示功能,在用户输入信息时会获得相应的提示与该提示搜索结果数量;其中,提示的数量一般保持在10个内。用户点击提示信息能直接搜索信息,这样能提高信息搜索准确性。”

当然,我们不知道GOOGLE的代码,但是我们也可以实现同样的效果,下面根据自己的实践,一步一步来说,对自己来说,可能更熟练,也希望大家熟练的掌握这一技术。

AJAX是个老话题了,在这里就不费口舌了,直接入题。为了代码的完整性,我尽量写完整。

首先,在HTML页面上放一个文本框。注意要放在form里面哦,属性methord为POST。
<input id="KProvince" style="width: 150px;" autocomplete="off" οnkeyup="beKeyUp();" />
注意这里面有一个属性 autocomplete="off",它的目的的关掉文本框的自动提示,必须要,不然你以前在文本框输入的记录会遮挡要提示的数据。onkeyup 方法是在键盘按下后松开执行,正好实现 即时输入,即时调用。更多请在BAIDU搜索详细的解释。
第二步,在文本框下面放一个DIV,注意样式。z-index属性不能少,不然不能覆盖它下面的其它select控件。
<div id="search_suggest" style="position:absolute;z-index:1;"></div>

下面来开始写JAVASCRIPT。
首先创建XMLHttpRequest对象。我把它写成一个方法,以免多次调用。对它我不做解释,更多请在BAIDU搜索详细的解释。
   var array=new Array(); //定义一个全局变量数组,用来存放拆分字符串的值,后面具体介绍。
        var zz=-1; //此为指针,后面用到
function xmlHttpInitializtions()
        {
            try
            {
                xmlhttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (e)
            {
                try
                {
                    xmlhttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch (e2)
                {
                    xmlhttpRequest = false;
                }
            }
            if (!xmlhttpRequest && typeof XMLHttpRequest != 'undefined')
            {
                xmlhttpRequest = new XMLHttpRequest();
            }
        }
第二步,创建beKeyUp方法,正是键盘按下后松开时的方法,在文本框那里调用。
   function beKeyUp()
        {
            var key = document.getElementById("KProvince").value;
            if(key.length>0)//有值才POST,这里最好加个Trim()方法,但是JAVASCRIPT没有现成的方法,自己定义。
            {
                xmlHttpInitializtions();
                xmlhttpRequest.Open("POST","Test_Ajax.aspx?key=" + key,true);//POST
                xmlhttpRequest.onreadystatechange=stateChange;//返回状态调用方法stateChange
                xmlhttpRequest.Send();
            }
        }
        function stateChange()
        {
            if(xmlhttpRequest.readystate==4)
            {
                if(xmlhttpRequest.status==200)
                {
                    var responseStr=xmlhttpRequest.responseText;//获取返回值
                    if(responseStr.length>0)//返回值不为空才执行下面的代码
                    {
                        array=responseStr.split('|');//根据‘|’拆分,根据自己任意特殊字符,初始化数组
                        positionDiv();//调用方法,定位DIV显示,具体见方法解释
    document.getElementById("search_suggest").innerHTML="";//每次清空DIV内容
                        for(var i=0;i<array.length;i++)
                        {
                            if(array[i]!="")//项值不为空,组合DIV,每个DIV有onmouseover、onmouseout、onclick对应事件
                            {
                                document.getElementById("search_suggest").innerHTML+="<div id='item" + i + "' class='itemBg' οnmοuseοver='beMouseOver(" + i +")' οnmοuseοut='beMouseOut(" + i + ")' οnclick='beClick(" + i + ")'>" + array[i] + "</div>";
                            }
                        }
    //最后一个DIV显示 关闭 效果 onclick方法
                        document.getElementById("search_suggest").innerHTML+="<div class='item_button' οnclick='hiddenDiv();'><font color='#999999'>关闭</font></div>";
                        document.getElementById("search_suggest").style.display="inline";
                    }
                    else
                    {
                        document.getElementById("search_suggest").style.display="none";
                    }
                }
            }
        }
        //定位DIV显示
function positionDiv()
        {
              var DivRef= document.getElementById("search_suggest");
              DivRef.style.position = "absolute";
              var t=document.getElementById("KProvince");
              DivRef.style.top= getAbsolutePos(t).y;//相对文本框的TOP高度,方法见下面
              DivRef.style.left= getAbsolutePos(t).x ;//相对文本框的LEFT宽度
              DivRef.style.height=array.length * 20;//DIV的高度等于每行20个象素乘行数(也就是数组的长度,体现全局数组的作用,不然要传入数组长度的参数)
        }
//实现最后一个DIV 关闭 onclick方法
function hiddenDiv()
        {
            document.getElementById("search_suggest").style.display="none";
        }
//定位方法,不做解释
function getAbsolutePos(el)
        {
            var SL = 0, ST = 0;
            var is_div = /^div$/i.test(el.tagName);
            if (is_div && el.scrollLeft) SL = el.scrollLeft;
            if (is_div && el.scrollTop) ST = el.scrollTop;
            var r = { x: el.offsetLeft - SL, y: el.offsetTop - ST };
            if (el.offsetParent)
            {
                var tmp = this.getAbsolutePos(el.offsetParent);
                r.x += tmp.x;
                r.y += tmp.y;
            }
            return r;
        }

最后是鼠标效果的方法。
        //函数鼠标经过效果       
        function beMouseOverEFF(i)
        {
            if ((i>=0)&(i<=array.length-1))
            {
                document.getElementById("item" + i).className="item_high";
            }
        }

        //函数鼠标移开效果
        function beMouseOutEFF(i)
        {
            if ((i>=0)&(i<=array.length-1))
            {
                document.getElementById("item" + i).className="item_normal";
            }
        }

        //函数鼠标经过
        function beMouseOver(i)
        {
            document.getElementById("KProvince").focus();
            beMouseOutEFF(zz);
            zz=i;
            beMouseOverEFF(zz);
        }

        //函数鼠标移开
        function beMouseOut(i)
        {
            beMouseOutEFF(i);
        }
        //函数单击
        function beClick(i)
{
            document.getElementById("KProvince").value=array[i];
            document.getElementById("search_suggest").style.display="none";
            document.getElementById("KProvince").focus();
        }

对应的样式如下:
.item_normal
{
    BORDER-LEFT: #666 1px solid;
    BORDER-RIGHT: #666 1px solid;
    width:150px;
    background-color:#ffffff;
    overflow:hidden;
}
.itemBg
{
    BORDER-LEFT: #666 1px solid;
    BORDER-RIGHT: #666 1px solid;
    cursor:default;
    background-color:#ffffff;
    width:150px;
}
.item_high
{
    background-color:#326BC5;
    cursor:default;
    width:150px;
    color:white;
}
.item_button
{
    BORDER-LEFT: #666 1px solid;
    BORDER-RIGHT: #666 1px solid;
    BORDER-BOTTOM: #666 1px solid;
    text-align:right;
    background-color:#ffffff;
    width:150px;
    cursor:hand;
}
.suggest_hidden
{
    display:none;
}

至于POST 的页面Test_Ajax.aspx该怎么写,我相信都知道。写个简单的能实现的...注意该页面前端的HTML代码都不要
if(Request.QueryString["key"] != null)
{
Response.Write("这|下|你|就|满|足|了|吧");//你可以从数据库读取,打印出来就OK
}
到此,功能实现了,具体调整根据自己的爱好修改。本地测试通过......
如果还不能实现的话,请EMAIL给我,把源代码发给你BB。(xiaohui_liu0406@163.com)

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值