• 自己实现一些JQuery插件-----------------------------------(四)


    有时候会需要出来自动提示框,例如搜索网站的自动提示,他们是如何实现的

    index.html

    <!DOCTYPE HTML>
    <html>
    <head>
        <link href="style.css" rel="stylesheet" type="text/css" />
        <script src="jquery-1.8.0.min.js" type="text/javascript"></script>
        <script src="main.js" type="text/javascript"></script>
        <title>自动完成</title>
    </head>
    <body>
    <div class="search">
                       
                        <form id="form" action="http://www.baidu.com/s" target="_blank" method="get" accept-charset="utf-8">
                        <div class="text">
                            <input type="text" name="wd" id="searchText" autocomplete="off" />
                            <div id="auto">
                            </div>
                        </div>
                        <input type="submit" value="搜索一下" class="but" id="btnSearch" />
                        </form>
                    </div>
    </body>
    </html>

    相关文件

    style.css

    @charset "utf-8";
    /* CSS Document */
    *{
        margin:0;
        padding:0;
        font:12px  "宋体" ;
    }
    a{
        text-decoration:none;
        outline:none;
        font-size:14px;
        cursor:pointer;
    }
    img{
        border:none;
    }
    ul{
        list-style:none;
    }
    input{
        outline:none;
    }
    body{
        background:#FFF;
    }
    div.main_inner{
        width:960px;
        margin:0 auto;
    }
    div.search{
        clear:both;
        position:relative;
    }
    div.search img,div.search div.text,div.search input.but{
        position:absolute;
        top:0;
    }
    div.search img{
        left:138px;
    }
    div.search div.text{
        width:500px;
        left:228px;
        position:relative;
    }
    div.search div.text input{
        width:500px;
        padding:6px 0 5px;
        border:1px #74c0f9 solid;
        background:#FFF;
        padding-left:6px;
        outline:none;
        font:16px Arial, Helvetica, sans-serif;
    }
    div.search div.text div#auto{
        display:none;
        width:506px; 
        border:1px #74c0f9 solid;
        background:#FFF;
        position:absolute;
        top:31px;
        left:0;
        color:#323232;
    }
    div.search input.but{
        width:82px;
        font-size:14px;
        height:32px;
        border:1px #74c0f9 solid;
        cursor:pointer;
        background:#E1E1E1 url(../images/but_bg.png) no-repeat center -2px;
        color:#323232;
        right:130px;
    }
    div.search input.but:hover{
        background:#E1E1E1 url(../images/but_bg.png) no-repeat center -36px;
    }

    main.js

    var changeStr = '';  
    
    function FillUrls() {
        //获取用户输入的关键字
        var strdomin = $("#searchText").val()
    
        //如果请求为空的话就不进行请求
        if (strdomin == null || strdomin == "") {
            $("#auto").empty();
            $("#auto").hide();
            return;
        }
        changeStr = strdomin;
        window.status = "请求中";
    
        //封装请求百度服务器的参数(只有关键字是动态的,其他几个参数都是固定的)
        var qsData = { 'wd': strdomin, 'p': '3', 'cb': 'ShowDiv' };
        $.ajax({
            async: false,
            url: "http://suggestion.baidu.com/su",
            type: "GET",
            dataType: 'jsonp',
            jsonp: 'jsoncallback',
            data: qsData,
            timeout: 5000,
            success: function (json) {
            },
            error: function (xhr) {
            }
        });
    }
    
    function ShowDiv(strurls) {
        autoDisplay(strurls);
        window.status = "请求结束";
    }
    
    function autoDisplay(autoStr) {
        var Info = autoStr['s']   //拿到关键字提示
    
        var wordText = $("#searchText").val();
        var autoNode = $("#auto");   //缓存对象(弹出框)
    
        if (Info.length == 0) {
            autoNode.hide();
            return false;
        }
    
        autoNode.empty();  //清空上次
        for (var i = 0; i < Info.length; i++) {
            var wordNode = Info[i];   //弹出框里的每一条内容
    
            var newDivNode = $("<div>").attr("id", i);    //设置每个节点的id值
            newDivNode.attr("style", "font:14px/25px arial;height:25px;padding:0 8px;cursor: pointer;");
    
            newDivNode.html(wordNode).appendTo(autoNode);  //追加到弹出框
    
            //鼠标移入高亮,移开不高亮
            newDivNode.mouseover(function () {
                if (highlightindex != -1) {        //原来高亮的节点要取消高亮(是-1就不需要了)
                    autoNode.children("div").eq(highlightindex).css("background-color", "white");
                }
                //记录新的高亮节点索引
                highlightindex = $(this).attr("id");
                $(this).css("background-color", "#ebebeb");
            });
            newDivNode.mouseout(function () {
                $(this).css("background-color", "white");
            });
    
            //鼠标点击文字上屏
            newDivNode.click(function () {
                //取出高亮节点的文本内容
                var comText = autoNode.hide().children("div").eq(highlightindex).text();
                highlightindex = -1;
                //文本框中的内容变成高亮节点的内容
                $("#searchText").val(comText);
                location.href="http://www.baidu.com/s?wd="+comText;
            })
            if (Info.length > 0) {    //如果返回值有内容就显示出来
                autoNode.show();
            } else {               //服务器端无内容返回 那么隐藏弹出框
                autoNode.hide();
                //弹出框隐藏的同时,高亮节点索引值也变成-1
                highlightindex = -1;
            }
    
        }
    
    }
    
    var timeoutId;   //延迟请求服务器
    var highlightindex = -1;   //高亮
    $(function () {
        $("#searchText").keyup(function (event) {
            var myEvent = event || window.event;
            var keyCode = myEvent.keyCode;    //键值 不同的值代表不同的键  13是回车等
            //console.log(keyCode);
    
            //只有按键盘的字母键、退格、删除、空格、ESC等键才进行响应:8退格backspace 46删除delete 空格32
            if (keyCode >= 65 && keyCode <= 90 || keyCode >= 48 && keyCode <= 57 || keyCode >= 96 && keyCode <= 111 || keyCode >= 186 && keyCode <= 222 || keyCode == 8 || keyCode == 46 || keyCode == 32 || keyCode == 13) {
                //再次请求
                FillUrls();
                if (highlightindex != -1) {
                    highlightindex = -1;
                }
            }
    
            else if (keyCode == 38 || keyCode == 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", "#ebebeb");
    
                    //取出当前选中的项 赋值到输入框内
                    var comText = autoNodes.eq(highlightindex).text();
                    $("#searchText").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", "#ebebeb");
    
                    var comText = autoNodes.eq(highlightindex).text();
                    $("#searchText").val(comText);
                }
            } else if (keyCode == 13) {     //回车
                //下拉框有高亮内容
                if (highlightindex != -1) {
                    //取出高亮节点的文本内容
                    var comText = $("#auto").hide().children("div").eq(highlightindex).text();
                    highlightindex = -1;
                    //文本框中的内容变成高亮节点的内容
                    $("#searchText").val(comText);
                } else {
                    //下拉框没有高亮内容
                    $("#auto").hide();
    
                    //已经提交,让文本框失去焦点(再点提交或者按回车就不会触发keyup事件了)
                    $("#searchText").get(0).blur();
                }
            } else if (keyCode == 27) {    //按下Esc 隐藏弹出层
                if ($("#auto").is(":visible")) {
                    $("#auto").hide();
                }
            }
        });
    
        //点击页面隐藏自动补全提示框
        document.onclick = function (e) {
            var e = e ? e : window.event;
            var tar = e.srcElement || e.target;
            if (tar.id != "searchText") {
                if ($("#auto").is(":visible")) {
                    $("#auto").css("display", "none")
                }
            }
        }
    });

    相关js代码来自网络(非本人原创)。。。

  • 相关阅读:
    Qt编写物联网管理平台35实时曲线
    Qt开发经验小技巧221225
    Qt编写物联网管理平台36通信协议
    Qt编写物联网管理平台34地图按钮
    【Python】抛砖引玉连续有序数组的排序问题
    java经验总结
    0618
    面试_子数组类问题
    【segmentation fault】vsnprintf错误用法
    Sword jemalloc使用小结
  • 原文地址:https://www.cnblogs.com/bq12345/p/3426080.html
Copyright © 2020-2023  润新知