如何实现select组件的选择输入过滤作用

实现select组件的选择输入过滤作用的js代码如下:

/**

*其中//******之间的部分显示的是在没有选择输入过滤功能的代码上加入的功能代码

**

/

/**
* @description This plugin allows you to make a select box editable like a text box while keeping it‘s select-option features
* @description no stylesheets or images are required to run the plugin
*
* @version 0.0.1
* @author Martin Mende
* @license Attribution-NonCommercial 3.0 Unported (CC BY-NC 3.0)
* @license For comercial use please contact me: martin.mende(at)aristech.de
*
* @requires jQuery 1.9+
*
* @class editableSelect
* @memberOf jQuery.fn
*
* @example
*
* var selectBox = $("select").editableSelect();
* selectBox.addOption("I am dynamically added");
*/

(function ( $ ) {

    $.fn.editableSelect = function() {
        var instanceVar;
        //此this.each()指的就是对当前对象的遍历,这里的当前对象指代的就是对当前两个下拉选择框对象的一一遍历
        this.each(function(){
            var originalSelect = $(this);
            //check if element is a select
            if(originalSelect[0].tagName.toUpperCase()==="SELECT"){
                //wrap the original select在原始的<select>外围插入<div></div>框
                originalSelect.wrap($("<div/>"));
                var wrapper = originalSelect.parent();
                wrapper.css({display: "inline-block"});
                //place an input which will represent the editable select                //在选择菜单上加入input输入框<input alt title ..... style="width:......" value="">                   var inputSelect = $("<input/>").insertBefore(originalSelect);
                    //get and remove the original id
                    var objID = originalSelect.attr("id");
                    originalSelect.removeAttr("id");
                //add the attributes from the original select                //input输入框的各种属性设置
                inputSelect.attr({
                    alt: originalSelect.attr("alt"),
                    title: originalSelect.attr("title"),
                    class: originalSelect.attr("class"),
                    name: originalSelect.attr("name"),
                    disabled: originalSelect.attr("disabled"),
                    tabindex: originalSelect.attr("tabindex"),
                    id: objID
                });
                //get the editable css properties from the select
                var rightPadding = 15;
                inputSelect.css({
                    width: originalSelect.width()-rightPadding,
                    height: originalSelect.height(),
                    fontFamily: originalSelect.css("fontFamily"),
                    fontSize: originalSelect.css("fontSize"),
                    background: originalSelect.css("background"),
                    paddingRight: rightPadding
                });
                inputSelect.val(originalSelect.val());
                //add the triangle at the right
                var triangle = $("<div/>").css({
                    height: 0, width: 0,
                    borderLeft: "5px solid transparent",
                    borderRight: "5px solid transparent",
                    borderTop: "7px solid #999",
                    position: "relative",
                    top: -(inputSelect.height()/2)-5,
                    left: inputSelect.width()+rightPadding-10,
                    marginBottom: "-7px",
                    pointerEvents: "none"
                }).insertAfter(inputSelect);
                //create the selectable list that will appear when the input gets focus                //聚焦的时候加上<ol><ol/>下拉框
                var selectList = $("<ol/>").css({
                    display: "none",
                    listStyleType: "none",
                    width: inputSelect.outerWidth()-2,
                    padding: 0,
                    margin: 0,
                    border: "solid 1px #ccc",
                    fontFamily: inputSelect.css("fontFamily"),
                    fontSize: inputSelect.css("fontSize"),
                    background: "#fff",
                    position: "absolute",
                    zIndex: 1000000
                }).insertAfter(triangle);
                //add options                //在resourceData变量中存储当前下拉框中的所有数据
                //******
                var resourceData = [];                    originalSelect.children().each(function(index, value){
                    prepareOption($(value).text(), wrapper);
                    resourceData.push($(value).text());
                });
                //******
                //bind the focus handler                //在鼠标聚焦的时候fadeIn(100),即下拉显示当前下拉框
                inputSelect.focus(function(){
                    selectList.fadeIn(100);                    //v存储的是在input输入框中输入的内容,如果输入的内容不为空,就在存储原始下拉框的所有数据中找到出现v中字符的数据压入newResourceData变量中
                    //******
                    var v = inputSelect.val();
                    var newResourceData = [];
                    if(v != "") {
                        $.each(resourceData, function(i, t){
                            if(t.indexOf(v) != -1)
                                newResourceData.push(t);
                        });
                    }
                    wrapper.children("ol").empty();
                    $.each(newResourceData, function(i, t){
                        prepareOption(t, wrapper);
                    });
                    //******
                }).blur(function(){
                    selectList.fadeOut(100);
                }).keyup(function(e){
                    if(e.which==13)    inputSelect.trigger("blur");                    //在enter快捷键按下后弹起的时候执行的事件
                    //******
                    var v = inputSelect.val();
                    var newResourceData = [];
                    if(v != "") {
                        $.each(resourceData, function(i, t){
                            if(t.indexOf(v) != -1)
                                newResourceData.push(t);
                        });
                    }
                    wrapper.children("ol").empty();
                    $.each(newResourceData, function(i, t){
                        prepareOption(t, wrapper);
                    });
                    //******
                });
                //hide original element
                originalSelect.css({visibility: "hidden", display: "none"});

                //save this instance to return it
                instanceVar = inputSelect
            }else{
                //not a select
                return false;
            }
        });//-end each

        /** public methods **/

        /**
        * Adds an option to the editable select
        * @param {String} value - the options value
        * @returns {void}
        */
        instanceVar.addOption = function(value){
            prepareOption(value, instanceVar.parent());
        };

        /**
        * Removes a specific option from the editable select
        * @param {String, Number} value - the value or the index to delete
        * @returns {void}
        */
        instanceVar.removeOption = function(value){
            switch(typeof(value)){
                case "number":
                    instanceVar.parent().children("ol").children(":nth("+value+")").remove();
                    break;
                case "string":
                    instanceVar.parent().children("ol").children().each(function(index, optionValue){
                        if($(optionValue).text()==value){
                            $(optionValue).remove();
                        }
                    });
                    break;
            }
        };

           /**
        * Resets the select to it‘s original
        * @returns {void}
        */
        instanceVar.restoreSelect = function(){
            var originalSelect = instanceVar.parent().children("select");
            var objID = instanceVar.attr("id");
            instanceVar.parent().before(originalSelect);
            instanceVar.parent().remove();
            originalSelect.css({visibility: "visible", display: "inline-block"});
            originalSelect.attr({id: objID});
        };

        //return the instance
        return instanceVar;
    };

    /** private methods **/
    //prepareOption函数的作用就是在当前下拉框中添加新选项
    function prepareOption(value, wrapper){
        var selectOption = $("<li>"+value+"</li>").appendTo(wrapper.children("ol"));
        var inputSelect = wrapper.children("input");
        selectOption.css({
               padding: "3px",
               textAlign: "left",
               cursor: "pointer"
           }).hover(
           function(){
               selectOption.css({backgroundColor: "#eee"});
           },
           function(){
               selectOption.css({backgroundColor: "#fff"});
           });
           //bind click on this option
           selectOption.click(function(){
               inputSelect.val(selectOption.text());
               inputSelect.trigger("change");
           });
    }

}( jQuery ));

时间: 2024-10-28 15:36:44

如何实现select组件的选择输入过滤作用的相关文章

vue自定义select组件

1.目的 看了很多element-ui的源码,决定自己实现一个简单的select组件,遇到的几个难点,便记录下来. 2.难点一 element-ui中的select组件通过v-model可以绑定数据,但在我平时用v-model只是在input中使用过,只知道v-model可以双向绑定数据,但并不清楚其中的实现过程,所以 需要清晰的了解v-model是什么,如下. <input v-model="test"/> <input :value="test"

十三 .Flask wtforms组件和选择框动态数据实时更新

一 . wtforms组件     选择框动态数据实时更新 https://www.cnblogs.com/lovershowtime/p/11384494.html 1.wtforms组件使用(登录) 1. 用户登录 当用户登录时候,需要对用户提交的用户名和密码进行多种格式校验.如: 用户不能为空:用户长度必须大于6: 密码不能为空:密码长度必须大于12:密码必须包含 字母.数字.特殊字符等(自定义正则): login.html <!DOCTYPE html> <html lang=&

freemarker写select组件(三)

freemarker写select组件 1.宏定义 <#macro select id datas value="" key="" text=""> <select id="${id}" name="${id}"> <option>---请选择---</option> <#list datas as data> <#if key!="

freemarker写select组件(二)

freemarker写select组件 1.宏定义 <#macro select id datas value=""> <select id="${id}" name="${id}"> <option>---请选择---</option> <#list datas as data> <#if value == data> <option value="${da

freemarker写select组件报错总结(五)

1.错误描述 六月 26, 2014 10:44:49 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template processing error: "The only legal comparisons are between two numbers, two strings, or two dates.\nLeft hand operand is a freemarker.template.SimpleScalar

freemarker写select组件(四)

freemarker写select组件 1.宏定义 <#macro select id datas value="" key="" text="" headKey="" headValue=""> <select id="${id}" name="${id}"> <option>---请选择---</option> &l

freemarker写select组件报错总结(七)

1.错误描述 六月 26, 2014 11:26:27 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template processing error: "Expected collection or sequence. datas evaluated instead to freemarker.core.HashLiteral$SequenceHash on line 7, column 18 in inc/select

freemarker写select组件(五)

freemarker写select组件 1.宏定义 <#macro select id datas value="" key="" text="" headKey="" headValue=""> <select id="${id}" name="${id}"> <option>---请选择---</option> &l

freemarker写select组件报错总结(一)

1.具体错误如下 六月 25, 2014 11:26:29 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template processing error: "Expression name is undefined on line 2, column 33 in inc/select.ftl." Expression name is undefined on line 2, column 33 in inc/s