首页 新闻 会员 周边

求个自动完成代码

0
悬赏园豆:10 [待解决问题]

我用jquery autocomplete实现自动完成,但是对中文支持不好,在网上查了很多,也都试试了,还是不行,求写好的自动完成

王涛1的主页 王涛1 | 初学一级 | 园豆:148
提问于:2012-11-09 13:54
< >
分享
所有回答(5)
0

但是对中文支持不好

怎么个不好法?

chenping2008 | 园豆:9836 (大侠五级) | 2012-11-09 14:22

难道是中文编码的问题?

支持(0) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-11-09 22:22

@chenping2008: 输入个汉字,还要在按下个键才会提交,不信你试试

支持(0) 反对(0) 王涛1 | 园豆:148 (初学一级) | 2012-11-10 12:04
0

详细注释的代码,不会用的话给我留个邮箱,我给你发demo

//自己写的自动补全js
var highlightindex = -1;   //高亮
var timeoutId;   //延迟请求服务器
$(function () {
    var wordInput = $("#word");   //文本框
    var wordInputOffset = wordInput.offset();    //文本框的top、left属性 拿到这些属性 弹出框就好绝对定位了

    $("#auto").hide().css("border", "1px #DDDDDD solid").css("position", "absolute")   //弹出框默认隐藏,有边框
            .css("top", wordInputOffset.top + wordInput.height() + 6 + "px")    //绝对定位确定弹出框的位置
            .css("left", wordInputOffset.left + "px").width(wordInput.width() + 4);

    wordInput.keyup(function (event) {   //event取当前键盘按下的键
        var myEvent = event || window.event;
        var keyCode = myEvent.keyCode;    //键值 不同的值代表不同的键  13是回车等
        //alert(keyCode); //按键就能得到键值

        //如果输入的是字母(65到90),应该将文本框中最新的信息发送给服务器
        //如果输入的是退格键、删除键或者空格键,也应该将文本框中的最新信息发送给服务器    其他之外的情况都不向服务器请求
        if (keyCode >= 65 && keyCode <= 90 || keyCode == 8 || keyCode == 46 || keyCode == 32) {
            var wordText = $("#word").val();
            var autoNode = $("#auto");   //缓存对象(弹出框)

            //用户有输入才发送异步请求(wordText是文本框内容)
            if (wordText != "") {
                //取消上次未完成的延时操作
                clearTimeout(timeoutId);
                timeoutId = setTimeout(function () {      //延迟再提交(500毫秒),防止每按下键盘就向服务器发送一次请求
                    $.get("HandlerXML.ashx?timeStamp=" + (+new Date), { keyword: wordText }, function (data) {
                        var wordNodes = $(data).find("word");   //找到xml下word节点下内容(data是返回的整个xml内容)

                        //先清空弹出框(否则每次输入都再累加)
                        autoNode.html("");
                        wordNodes.each(function (i) {   //定义i 每个div节点都有id属性 就是下拉框的索引值
                            var wordNode = $(this);   //弹出框里的每一条内容

                            var newDivNode = $("<div>").attr("id", i);    //设置每个节点的id值
                            newDivNode.html(wordNode.text()).appendTo(autoNode);

                            //鼠标移入高亮,移开不高亮
                            newDivNode.mouseover(function () {
                                if (highlightindex != -1) {        //原来高亮的节点要取消高亮(是-1就不需要了)
                                    $("#auto").children("div").eq(highlightindex)
                                                  .css("background-color", "white");

                                }
                                //记录新的高亮节点索引
                                highlightindex = $(this).attr("id");
                                $(this).css("background-color", "#FFDFC6");

                                //输入放置的那个节点也要将其内容添加到输入框内
                                var showText = $("#auto").children("div").eq(highlightindex).text();
                                $("#word").val(showText);
                            });
                            newDivNode.mouseout(function () {
                                $(this).css("background-color", "white");
                            });

                            //鼠标点击文字上屏
                            newDivNode.click(function () {
                                //取出高亮节点的文本内容
                                var comText = $("#auto").hide().children("div").eq(highlightindex).text();
                                highlightindex = -1;
                                //文本框中的内容变成高亮节点的内容
                                $("#word").val(comText);
                            })
                        });
                        if (wordNodes.length > 0) {    //如果返回值有内容就显示出来
                            autoNode.show();
                        } else {               //服务器端无内容返回 那么隐藏弹出框
                            autoNode.hide();
                            //弹出框隐藏的同时,高亮节点索引值也变成-1
                            highlightindex = -1;
                        }
                    }, "xml")
                }, 500)   //延迟500毫秒再想服务器发送请求
            } else {
                autoNode.hide();
                highlightindex = -1;   //框隐藏了  就没有高亮了 故设置highlightindex为初始值 下次按上下键从0开始
            }
        } else if (keyCode == 38 || keyCode == 40) {
            //如果输入的是向上38向下40按键
            if (keyCode == 38) {
                //向上
                var autoNodes = $("#auto").children("div")
                if (highlightindex != -1) {
                    //如果原来存在高亮节点,则将背景色改称白色
                    autoNodes.eq(highlightindex).css("background-color", "white");
                    highlightindex--;
                } else {
                    highlightindex = autoNodes.length - 1;
                }
                if (highlightindex == -1) {
                    //如果修改索引值以后index变成-1,则将索引值指向最后一个元素
                    highlightindex = autoNodes.length - 1;
                }
                //让现在高亮的内容变成红色
                autoNodes.eq(highlightindex).css("background-color", "#FFDFC6");

                //取出当前选中的项 赋值到输入框内
                var comText = autoNodes.eq(highlightindex).text();
                $("#word").val(comText);
            }
            if (keyCode == 40) {
                //向下
                var autoNodes = $("#auto").children("div")
                if (highlightindex != -1) {
                    //如果原来存在高亮节点,则将背景色改称白色
                    autoNodes.eq(highlightindex).css("background-color", "white");
                }
                highlightindex++;
                if (highlightindex == autoNodes.length) {
                    //如果修改索引值以后index变成-1,则将索引值指向最后一个元素
                    highlightindex = 0;
                }
                //让现在高亮的内容变成红色
                autoNodes.eq(highlightindex).css("background-color", "#FFDFC6");

                var comText = autoNodes.eq(highlightindex).text();
                $("#word").val(comText);
            }
        } else if (keyCode == 13) {
            //如果输入的是回车

            //下拉框有高亮内容
            if (highlightindex != -1) {
                //取出高亮节点的文本内容
                var comText = $("#auto").hide().children("div").eq(highlightindex).text();
                highlightindex = -1;
                //文本框中的内容变成高亮节点的内容
                $("#word").val(comText);
            } else {
                //下拉框没有高亮内容
                alert("文本框中的 " + $("#word").val() + " 被提交了");
                $("#auto").hide();

                //已经提交,让文本框失去焦点(再点提交或者按回车就不会触发keyup事件了)
                $("#word").get(0).blur();
            }
        } else if (keyCode == 27) {    //按下Esc 隐藏弹出层
            if ($("#auto").is(":visible")) {
                $("#auto").hide();
            }
        }
    });

    //给按钮添加事件,表示文本框中的数据被提交
    $("input[id='btnSubmit']").click(function () {
        alert("文本框中的 " + $("#word").val() + " 被提交了");
    });

    document.onclick = function (e) {
        var e = e ? e : window.event;
        var tar = e.srcElement || e.target;
        if (tar.id != "word") {        //id等于word就说明点击的是搜索框 那么不需要执行隐藏和显示等任何操作 根据输入的关键字显示弹出层
            if ($("#auto").is(":visible")) {    //如果点击的不是搜索框  并且当前弹出层是显示的 那么隐藏弹出层
                $("#auto").css("display", "none")
            }
        }
    }
})
oppoic | 园豆:770 (小虾三级) | 2012-11-09 15:15

不怎么用xml传递数据,你还是给我发个例子让我学习下wang1787326278@163.com

支持(0) 反对(0) 王涛1 | 园豆:148 (初学一级) | 2012-11-10 12:00
0

你是说的代码生成器吗?

jerry-Tom | 园豆:4077 (老鸟四级) | 2012-11-12 10:39
0

使用这个吧:ajaxToolkit AutoComplete,已经封装好的,只用写c#代码返回数据。

Cat Qi | 园豆:761 (小虾三级) | 2012-11-20 10:38
0

我写的补丁,能修复那个bug

https://github.com/ltcszk/jquery.autocomplete.fix.js

ltcszk | 园豆:257 (菜鸟二级) | 2012-12-21 15:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册