关于js智能提示的封装(修订版)

简介: 修改后的智能提示,下拉框的样式兼容了IE6,7,8,9.  没有了之前的css文件和下拉框的html代码。清除了textbox的记忆功能和点击enter时页面回传。只须一个Bonker.js文件即可。            使用非常简单调用bonker.js文件里面的 init(id, url, fun);的方法。
修改后的智能提示,下拉框的样式兼容了IE6,7,8,9.  没有了之前的css文件和下拉框的html代码。清除了textbox的记忆功能和点击enter时页面回传。只须一个Bonker.js文件即可。
           使用非常简单调用bonker.js文件里面的 init(id, url, fun);的方法。
           说明:id为输入框的客户端id,url为ajax响应的地址。多条数据用逗号分隔。fun为当选择下拉框的一条数据后执行的函数
                    id和url为必须传的参数。fun为可选参数。没有则不用填写
 
js文件代码:
                               bonker.js文件内容
//初始化,为text绑定事件,定义url,回调函数fun(可选)
var bonkerDiv;
var bonkerFun;
var txtId;
function init(id, url, fun) {
    txtId = id;
    if (url) {
        bonkerUrl = url;
    } else { return; } if (fun) {
        bonkerFun = fun;
    }
    textControl = document.getElementById(id);
    //清除输入框记忆功能
    textControl.autocomplete = "off";
    if (textControl.attachEvent) {
        textControl.attachEvent("onkeyup", main);
        textControl.attachEvent("onkeypress", pressEnter);
    } else {
        textControl.addEventListener("keyup", main, false);
        textControl.addEventListener("keypress", pressEnter, false);
    }
}
//阻止输入enter,页面回传
function pressEnter(ev) {
    if (window.event) {
        ev = window.event;
    }
    if (ev.keyCode == 13) {
        if (navigator.userAgent.indexOf("MSIE") > 0)
            ev.returnValue = false;
        else
            ev.preventDefault();
    }
}
//处理键盘事件主要是enter  向上 向下键
function main(ev) {
    if (window.event) {
        ev = window.event;
    }
    if (ev.keyCode == 40) {
        divNext();
    } else if (ev.keyCode == 38) {
        divPre();
    } else if (ev.keyCode == 13) {
        bonkerFunction();
        bonkerDiv.style.display = "none";
        return false;
    }
    else {
        bonkerData = textControl.value;
        if (bonkerData.length == 0 && bonkerDiv) {
            bonkerDiv.style.display = "none";
        } else {
            getData(textControl.value, textControl);
        }
    }
}

//创建xmlhttp对象
var xhr = function () {
    if (!arguments.callee.single) {
        var fns = [
      function () { return new XMLHttpRequest(); },
      function () { return new ActiveXObject('Msxml2.XMLHTTP'); },
      function () { return new ActiveXObject('Microsoft.XMLHTTP'); },
    ];
        for (var i = 0, n = fns.length; i < n; i++) {
            try {
                fns[i]();
                arguments.callee.single = fns[i];
                break;
            } catch (e) { }
        }
        return arguments.callee.single();
    } else {
        return arguments.callee.single();
    }
}
//ajax获取数据 数据以逗号分开
function getData(va, obj) {
    var xmlHttp = xhr();
    xmlHttp.open("POST", bonkerUrl, true);
    xmlHttp.onreadystatechange = function () {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            showData(obj, xmlHttp.responseText);
        }
    }
    xmlHttp.send(va);
}


//兼容获取offsetTop和offsetLeft
function getAbsoluteOffsetTop(obj) {
    var top = obj.offsetTop;
    while (obj = obj.offsetParent) top += obj.offsetTop;
    return top;
}
function getAbsoluteOffsetLeft(obj) {
    var left = obj.offsetLeft;
    while (obj = obj.offsetParent) left += obj.offsetLeft;
    return left;
}
//展示数据,动态生成下拉框,为每个选项绑定事件
function showData(obj, result) {
    var resArr = result.split(",");
    bonkerDiv = document.getElementById("showDivBonker");
    if (!bonkerDiv) {
        bonkerDiv = document.createElement("div");
        bonkerDiv.id = "showDivBonker";
        bonkerDiv.style.display = "none";
        bonkerDiv.style.position = "absolute";
        bonkerDiv.style.border = "1px solid #817F82";
        bonkerDiv.style.zIndex = "9999";
        bonkerDiv.style.backgroundColor = "#ffffff";
        document.body.appendChild(bonkerDiv);
        var bonkerBody = document;
        if (bonkerBody.attachEvent) {
            bonkerBody.attachEvent("onmousedown", showBonkerBlur);
        } else {
            bonkerBody.addEventListener("mousedown", showBonkerBlur, false);
        }
    }
    var bonkerTop = getAbsoluteOffsetTop(obj);
    var bonkerLeft = getAbsoluteOffsetLeft(obj);

    bonkerDiv.style.top = (bonkerTop + obj.offsetHeight) + "px";
    bonkerDiv.style.left = bonkerLeft + "px";
    bonkerDiv.style.width = obj.offsetWidth + "px";
    bonkerDiv.style.height = obj.offsetHeight * resArr.length + "px";
    bonkerDiv.style.display = "inline";
    bonkerTotalLength = resArr.length;
    bonkerLength = -1;
    var innerStr = "";
    for (var item in resArr) {
        innerStr += "<div id='bonker" + item + "' style='height:" + obj.offsetHeight + "px;cursor:pointer;width:100%;' onclick='setText(this);' onmouseover='setColor(this);' onmouseout='clearColor(this);'>" + resArr[item] + "</div>";
    }
    bonkerDiv.innerHTML = innerStr;
}

function showBonkerBlur(ev) {
    var divTarget = ev.srcElement ? ev.srcElement : ev.target;
    if (divTarget.id.indexOf("bonker") < 0 && divTarget.id != txtId)
        bonkerDiv.style.display = "none";
}
//点击每个选项执行的函数
function setText(obj) {
    textControl.value = obj.innerHTML;
    bonkerFunction();
    bonkerDiv.style.display = "none";
}
//鼠标移动到选项执行
function setColor(obj) {
    if (bonkerLength != -1) {
        document.getElementById("bonker" + bonkerLength).style.backgroundColor = "";
    }
    obj.style.backgroundColor = "#EBEBEB";
    bonkerLength = (Number)(obj.id.replace(/bonker/, ""));
}
//鼠标移走时执行
function clearColor(obj) {
    obj.style.backgroundColor = "";
}
//向下键 执行函数
function divNext() {
    try {
        if (bonkerLength != -1) {
            document.getElementById("bonker" + bonkerLength).style.backgroundColor = "";
        }
        bonkerLength++;
        if (bonkerLength == bonkerTotalLength) {
            bonkerLength = -1;
        }
        if (bonkerLength == -1) {
            textControl.value = bonkerData;
        } else {
            var obj = document.getElementById("bonker" + bonkerLength);
            obj.style.backgroundColor = "#EBEBEB";
            textControl.value = obj.innerHTML;
        }
    } catch (e) {
        return;
    }

}
//向上键 执行函数
function divPre() {
    try {
        if (bonkerLength != -1) {
            document.getElementById("bonker" + bonkerLength).style.backgroundColor = "";
        } else {
            bonkerLength = bonkerTotalLength;
            textControl.value = bonkerData;
        }
        bonkerLength--;
        if (bonkerLength == -1) {
            textControl.value = bonkerData;
        } else {
            var obj = document.getElementById("bonker" + bonkerLength);
            obj.style.backgroundColor = "#EBEBEB";
            textControl.value = obj.innerHTML;
        }
    } catch (e) {
        return;
    }

}
function bonkerFunction() {
    if (bonkerFun) {
        bonkerFun();
    }
}

 

 

 

 
                                 前台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>
    <title></title>
    <script src="bonker.js" type="text/javascript"></script>
    <script type="text/javascript">
        window.onload = function () {
            init("myText", "AjaxHandler.ashx", btnclick);//调用封装的方法init(文本框id,后台ajax对应的地址,响应完执行的函数名(可选))
        }
        function btnclick() {
            alert(document.getElementById("myText").value);
        }
    </script>
</head>
<body>关键字:<input id="myText" type="text" />
    <input type="button"  value="搜索" id="btnSearch" onclick="btnclick();" />

</body>
</html>

 

         AjaxHandler.ashx文件内容
<%@ WebHandler Language="C#" class="AjaxHandler" %>
using System;
using System.Web;
using System.IO;
public class AjaxHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "text/plain";
        StreamReader sr = new StreamReader(context.Request.InputStream);
        string arg = sr.ReadToEnd();
        context.Response.Write(arg+"1,ddfds ,dsfsdf,dsfsd,sdfsdf,ff,s,d,t,y");
    }
    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

 

作者:Bonker
出处:http://www.cnblogs.com/Bonker
QQ:519841366
       
本页版权归作者和博客园所有,欢迎转载,但未经作者同意必须保留此段声明, 且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利
目录
相关文章
|
1月前
sd.js 2.0封装:更加简化请求传参内容(逐步废弃、逐渐日落2024.01.02)
sd.js 2.0封装:更加简化请求传参内容(逐步废弃、逐渐日落2024.01.02)
|
2月前
|
JavaScript
JS封装节流函数
JS封装节流函数
19 0
|
2月前
uni-app 65egg.js聊天类chat.js封装(二)
uni-app 65egg.js聊天类chat.js封装(二)
28 1
|
7月前
|
前端开发 JavaScript 数据挖掘
医院LIS管理系统源码,DEV报表、前端js封装、分布式文件存储
云LIS系统还支持质控管理,为实验室提供科学的质量控制机制。用户可以根据需要调整质控参数,并可自动生成质控图表和统计分析报告。提供了数据分析功能,可以通过数据挖掘和分析来发现潜在关联性,为实验室提供更多的参考和决策支持
|
12天前
|
SQL 存储 前端开发
React&Nest.js全栈社区平台(五)——👋封装通用分页Service实现文章流与详情
React&Nest.js全栈社区平台(五)——👋封装通用分页Service实现文章流与详情
React&Nest.js全栈社区平台(五)——👋封装通用分页Service实现文章流与详情
|
2月前
uni-app 66聊天类chat.js封装(三)
uni-app 66聊天类chat.js封装(三)
31 6
|
2月前
uni-app 64聊天类chat.js封装(一)
uni-app 64聊天类chat.js封装(一)
26 2
|
5月前
|
自然语言处理 算法 数据库
【JavaScript+自然语言处理+HTML+CSS】实现Web端的智能聊天问答客服实战(附源码 超详细必看)
【JavaScript+自然语言处理+HTML+CSS】实现Web端的智能聊天问答客服实战(附源码 超详细必看)
57 0
|
5月前
|
XML JavaScript 前端开发
【Web智能聊天客服】之JavaScript、jQuery、AJAX讲解及实例(超详细必看 附源码)
【Web智能聊天客服】之JavaScript、jQuery、AJAX讲解及实例(超详细必看 附源码)
54 0
|
5月前
|
JavaScript 前端开发
函数:函数是JS的基本组成单元,用于封装代码块以实现特定功能。理解函数的定义、调用和参数传递方式非常重要。
函数:函数是JS的基本组成单元,用于封装代码块以实现特定功能。理解函数的定义、调用和参数传递方式非常重要。
32 0