javascript 自定义auto_complete

ys_auto_complete.css

.ys-auto-complete{
    position:absolute;
    display:none;
    list-style-type: none;
    padding:0;

    border:1px solid #ccc;
    margin:0;
    background-color:#fff;
    z-index:999;

}

.ys-auto-complete li{
    height:32px;
    line-height: 32px;
    font-size:14px;
    color:#222;
    padding-left:10px;
}

.ys-auto-complete li:hover{
    background-color:#eaeaea;
    cursor: pointer;
}

ys_auto_complete.js

(function($){

    var defaultSettings = {
        loadSource:function(keyWord,callback){ //
            //var data = [];
            //callback(this,data);
        }
    };

    function refreshAutoComplete(target,list){
        if(list==null||list.length==0){
            return;
        }
        var ys_auto_complete_id = $(target).attr("ys_auto_complete");
        var container = $("#"+ys_auto_complete_id);
        var html = "";
        // render the data
        list.forEach(function(item){
            var name = item.name;
            var value = item.value;
            html +="<li value=‘"+value+"‘>"+name+"</li>";
        });
        container.html(html);

        // 计算auto_complete 坐标位置
        var top = $(target).offset().top+$(target).outerHeight()+1;
        var left = $(target).offset().left;

        container.css({
            "left":left+"px",
            "top":top+"px"
        });

        var ys_auto_complete_id = $(target).attr("ys_auto_complete");
        $("#"+ys_auto_complete_id).show();
    }

    var renderHtml =    "<ul class=‘ys-auto-complete‘></ul>";

    function renderAutoComplete(target,settings){
        var id = "ys_auto_complete_"+new Date().getTime()+""+parseInt(Math.random()*10000);
        $(target).attr("ys_auto_complete",id);
        $(renderHtml).attr("id",id).appendTo("html"); // 添加到文档中去

        var container = $("#"+id);

        var width = $(target).outerWidth();

        container.css({
            "width":width+"px"
        });

        return container;
    }

    function bindEventHandlers(target,container,settings){
        var timeout = null;

        var loadSource = settings.loadSource;

        // 目标输入框键盘keypress事件
        $(target).on("keydown",function(e){
            e.stopPropagation();
            clearTimeout(timeout);
            console.log("-------------------------");
            timeout = setTimeout(function(){
               // load the data from backend
                var keyWord = $(target).val();
                loadSource.call(target,keyWord,refreshAutoComplete);
            },300);
        });

        // 点击空白区域 隐藏 auto_complete
        $(document).on("click",function(e){
            e.preventDefault();
            $(".ys-auto-complete").hide();
        });

        // 点击输入框 auto_complete 不隐藏
        $(target).on("click",function(e){
            e.stopPropagation();
            e.preventDefault();
        });

        // auto_complete item click 事件
        $(container).on("click","li",function(e){
            e.stopPropagation();
            e.preventDefault();
            var value = $(this).attr("value");
            var name = $(this).html("name");

            $(target).val(value);
            $(container).hide();
        });

    }

    var options = {
        ysAutoComplete:function(settings) {
            var mergedSettings = {};
            $.extend(mergedSettings,defaultSettings,settings);

            $(this).each(function(){
                var container = renderAutoComplete(this,mergedSettings);

                bindEventHandlers(this,container,mergedSettings);
            });
        }
    };
    $.fn.extend(options);
})(jQuery);

ys_auto_complete_demo.html

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="../static/css/ys_ui_plugin/ys_auto_complete.css">

    <script src="../static/dist/js/jquery-1.11.3.min.js"></script>
    <script src="../static/js/ys_ui_plugin/ys_auto_complete.js"></script>
</head>
<body>
    <input type="text"/>

<script>
    $("input").ysAutoComplete({
            loadSource:function(keyWord,callback){
                var data = [
                                {value:"app",name:"Apple"},
                                {value:"bna",name:"Banana"},
                                {value:"org",name:"Orange"}
                            ];
                var that = this;

                callback(that,data);
            }
    });
</script>
</body>
</html>

时间: 2024-10-28 10:27:23

javascript 自定义auto_complete的相关文章

FineReport中如何用JavaScript自定义地图标签

在日常使用地图过程中,通常会遇到地图标签,提示点等显示不满足我们的需求,需要进行JavaScript代码编写. 例如:在使用地图过程中,会发现很多地名显示的位置偏离.这时候就需要使用JavaScript进行调控.以黑龙江和内蒙古为例,来介绍下如何在FineReport中利用JavaScript自定义地图标签. 新建地图 以区域地图为例,新建表单,拖入地图(新特性)组件,地图边界选择区域地图下的中国(省级): 数据准备 新建工作簿,添加数据集ds1,SELECT*FROM地图1,选中图表,选择图表

JavaScript 自定义事件

Javascript事件模型系列(四)我所理解的javascript自定义事件 漫谈js自定义事件.DOM/伪DOM自定义事件

JavaScript自定义滚动条

原生JavaScript自定义滚动条 版权所有,如若转载请注明出处并附上本文链接 http://www.cnblogs.com/Pengxm-liveShare/p/5953810.html 由于项目需求需要用到滚动条, 但是浏览器自带的太丑, 而且每个浏览器显示的都不同, 所以自己编写了一个自定义的滚动条. (由于是菜鸟, 写的比较乱, 大家仅供参考就好, 能提提意见改进下就更好了!) 话不多说先看下样式: 主要功能: 支持滚动条自定义样式(颜色, 大小) 支持鼠标事件(点击和滑轮滚动) 主要

javascript自定义滚动条插件.

在实际项目中,经常由于浏览器自带的滚动条样式太戳,而且在各个浏览器中显示不一样,所以我们不得不去实现自定义的滚动条,今天我就用最少的代码实现了一个自定义滚动条,代码量区区只有几十行,使用起来也非常方便. <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title

javascript自定义滚动条插件,几行代码的事儿

在实际项目中,经常由于浏览器自带的滚动条样式太戳,而且在各个浏览器中显示不一样,所以我们不得不去实现自定义的滚动条,今天我就用最少的代码实现了一个自定义滚动条,代码量区区只有几十行,使用起来也非常方便. <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title

javascript自定义简单map对象功能

这里介绍一种js创建简单map对象的方法: function Map() { //创建object对象, 并给object对象添加key和value属性 var obj1=new Object(); var obj2=new Object(); obj1.key="zhangsan" ; obj1.value=23; obj2.key="lisi"; obj2.value=25; //创建一个数组,将创建的object对象放如到数组中去 var map=new Ar

javascript自定义右键菜单代码

javascript自定义右键菜单代码: 右键菜单这个再熟悉不过了,使用电脑的话每天几乎都要操作上千遍右键菜单,下面分享一段自定义右键菜单的代码实例,希望能够给需要相关内容的朋友带来帮助,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.51texiao

javascript自定义对象

<!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> <script type="text/javascr

JavaScript自定义事件,动态添加属性

根据事件的不同,可用的自定义方法也不同. document.createEvent('Event'); 实现主要有4个步骤: 1.创建事件. 2.初始化事件(三个参数:事件名,是否起泡,是否取消默认触发) 3.监听事件 4.触发事件 var Evt = document.createEvent('Event');//创建一个事件 Evt.initEvent('inputChangeEvt', true, true);//初始化事件,给定事件名字 window.addEventListener('