`
ufoqhmdt
  • 浏览: 37819 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

现实ComboBox(可编辑且可以自动提示的select选择框)

阅读更多

项目需要使用类似comboBox的web控件.如今现存的相关控件非常好.而且参差不齐.extjs等大型控件有一定的实现.但是如果为了一个控件而依赖extjs等大型前端js是非常不好的.为此花了2天在前人的基础上写了一个龊劣的可以编辑并自动提示过滤的select控件.和大家共同探讨.

附件有完整的demo和源码.

在HTML页面中需要使用DIV里面依次嵌套input和select.

 

<div id='netdbzonesDiv' style="float:left;" class="ctrlHeight">
                            <input id="netdbzonesInput" name="netdbzonesInput" type="text" class="ufo-conbobox-input box_shadow" />
                            <select name="zones" id="netdbzonesSelect" class="ufo-combobox-select">
                                <option value="1">aroduction_levels</option>
                                <option value="2">free type regex</option>
                                <option value="1">production_levels</option>
                                <option value="2">free type regex</option>
                                <option value="1">ebay</option>
                                <option value="2">free type regex</option>
                                <option value="1">probbbb</option>
                                <option value="2">free type regex</option>
                                <option value="1">croduction_levelsdfsf</option>
                                <option value="2">free type regex</option>
                                <option value="1">brodueeee</option>
                                <option value="2">free type regex</option>
                                <option value="2">abcdefg</option>
                                <option value="2">abc</option>
                                <option value="2">free type regex</option>
                            </select>
                        </div>

 然后使用下面的js传入input,select,div的各自ID.

 

var combo1 = new Combobox({
                    _inputId : "devicesValueInput",
                    _selectId : "devicesValueSelect",
                    _divId : "devicesValueDiv"
                });
 combo1.make();

 OK.浏览页面控件会自动生成comboBox.在实际项目中如果需要填入相关的数据.可以自己把select里面的option数据进行替换即可!

 

 

附上核心代码以便查看批评:

/**
 * @author UFO
 */
function log(a) {
    console.log(a);
}

function Combobox(config) {
    if(config) {
        this.inputId = config._inputId || "";
        this.selectId = config._selectId || "";
        this.divId = config._divId || "";
    }
    this.divObj = $("#" + this.divId);
    this.inputObj = $("#" + this.inputId);
    this.selectObj = $("#" + this.selectId);
    this.widthInit = 200;
    this.inputWidth = this.widthInit - 20;
    this.divHeigth = $("#" + this.divId).height() - 41;

    this.make = function() {
        this.setSelectEvent(this);
        this.setInputEvent(this);
        this.setMouseEvent(this);
    };
    this.setMouseEvent = function(_self) {
        if($("body").data("comboDivs")) {
            var comboDivs = $("body").data("comboDivs");
            comboDivs.push(_self);
            $("body").data("comboDivs", comboDivs);
        } else {
            var comboDivs = new Array();
            comboDivs.push(_self);
            $("body").data("comboDivs", comboDivs);
        }

        function mouseCoords(ev) {
            if(ev.pageX || ev.pageY) {
                return {
                    x : ev.pageX,
                    y : ev.pageY
                };
            };
            return {
                x : ev.clientX + document.body.scrollLeft - document.body.clientLeft,
                y : ev.clientY + document.body.scrollTop - document.body.clientTop
            };
        };
        document.onmousedown = function(ev) {
            var ev = ev || window.event;
            var mousePos = mouseCoords(ev);
            var comboDivs = $("body").data("comboDivs");
            for(var i = 0; i < comboDivs.length; i++) {
                var _self = comboDivs[i];
                var selectDiv = $("#select_div_on_key" + _self.selectId);
                if(selectDiv.get(0)) {
                    var osx = selectDiv.offset().left;
                    var oex = selectDiv.offset().left + selectDiv.width();
                    var osy = selectDiv.offset().top;
                    var oey = selectDiv.offset().top + selectDiv.height();
                    // $("#info").html(mousePos.x + "  " + mousePos.y + "<br>" + "osx:" + osx + "  oex:" + oex + "<br>" + "osy:" + osy + "  oey:" + oey);
                    // $("#info").append((mousePos.x < osx) + "  " + (mousePos.x > oex) + "   " + (mousePos.y < osy) + "   " + (mousePos.y > oey));
                    if((mousePos.x < osx || mousePos.x > oex) || (mousePos.y < osy || mousePos.y > oey)) {
                        _self.removeSelectDiv(_self.selectId);
                    }
                }
            };
        }
    };
    this.setSelectEvent = function(_self) {
        var _self = _self;
        $("#" + _self.selectId).change(function() {
            var newvar = $("#" + _self.selectId).find("option:selected").text();
            $("#" + _self.inputId).val(newvar);
        }).click(function() {
            $("#select_div_on_key" + _self.selectId).remove();
        }).css({
            "display" : "block",
            "width" : _self.widthInit + "px",
            "z-index" : 1,
            "clip" : "rect(0px " + _self.widt + "px 51px 151px)"
        });
    };
    this.setInputEvent = function(_self) {
        var _self = _self;
        var aa = this;
        //这里需要传入对象,这里需要强调.如果不传入,jquery的事件处理函数无法得到this.因为事件处理函数里面的this是那个DOM元素.而且事件处理函数里面只能访问到他所在函数里面的数据.这是闭包吗?
        $("#" + _self.inputId).keyup(function() {
            // _self.keyupFlag = 1;
            _self.ShowSelectCombo(_self);
        }).click(function() {
            _self.ShowSelectCombo(_self);
        }).css({
            "z-index" : 2,
            "width" : this.inputWidth + "px"
        });
    };
    this.removeSelectDiv = function(selectId) {
        var ulDIV = $("#select_div_on_key" + selectId);
        ulDIV.remove();
    };
    this.hideSelectDiv = function(selectId) {
        var ulDIV = $("#select_div_on_key" + selectId);
        ulDIV.hide();
    };
    this.ShowSelectCombo = function(_self) {
        console.log("---------------")
        var _self = _self;
        //这里为什么不能用this?因为在click事件里面的this是元素自己.所以先把context上下文_self又传进来处理.
        var inputObjVal = _self.inputObj.val();
        var inputObjOffset = _self.inputObj.offset();
        var inputObjWidth = _self.inputObj.width() + 20;
        var html = "";
        if(inputObjVal == "") {
            html = "<div class='select_div_list' id='select_div_on_key" + _self.selectId + "' style='display:none;position:absolute;width:" + inputObjWidth + "px;margin-top:" + _self.inputObj.outerHeight() + "px;z-index:1000;'><ul class='select_div_list_ul'>";
        } else {
            html = "<div class='select_div_list' id='select_div_on_key" + _self.selectId + "' style='position:absolute;width:" + inputObjWidth + "px;margin-top:" + _self.inputObj.outerHeight() + "px;z-index:1000;'><ul class='select_div_list_ul'>";
            $("#" + _self.selectId).find("option").each(function() {
                var tk = $(this);
                if(tk.html().indexOf(inputObjVal) != -1) {
                    html += "<li val='" + tk.val() + "' ht='" + encodeURIComponent(tk.html()) + "'>" + tk.html() + "</li>";
                }
            });
        }

        html += "</ul></div>";
        _self.removeSelectDiv(_self.selectId);
        _self.divObj.append(html);
        var ulDIV = $("#select_div_on_key" + _self.selectId);
        var hei = ulDIV.find("ul").height();
        var newHeight = hei > _self.divHeigth ? _self.divHeigth : hei;

        ulDIV.css({
            height : newHeight + "px"
        });
        ulDIV.find("li").hover(function() {
            $(this).css({
                "background-color" : "#079BD5"
            });
        }, function() {
            $(this).css({
                "background-color" : "white"
            });
        });
        ulDIV.find("li").click(function() {
            var _selfLi = $(this);
            var va = _selfLi.attr("val");
            var htm = _selfLi.attr("ht");
            htm = decodeURIComponent(htm);
            $("#" + _self.inputId).val(htm);
            $("#" + _self.selectId).val(va);
            ulDIV.remove();
        });
    };
}
 
分享到:
评论

相关推荐

    combox实现的可编辑下拉框

    在网页设计和开发中,`ComboBox`(组合框或下拉列表框)是一种常见的用户界面元素,它结合了文本输入框和下拉选择列表的功能。本文将深入探讨如何使用JavaScript实现一个可编辑的下拉框,并阐述其核心知识点。 ### ...

    C# winform ListView 中实现可编辑文本或双击出现下拉列表框

    通过以上方法,我们可以为C# WinForm中的ListView控件增加可编辑文本和双击出现下拉列表的功能,极大地提高了用户体验和交互性。这个过程涉及到对控件事件的处理、控件的动态创建和定位,以及一些基本的UI设计原则,...

    带查询功能的ComboBox控件

    ComboBox控件的基本结构包括一个可编辑的文本框和一个下拉列表。当用户在文本框中输入字符时,系统或应用程序可以根据这些字符过滤下拉列表中的项目,显示与输入字符匹配的选项。这种实时查询功能是ComboBox控件的一...

    ListView 实现可编辑或双击出现下拉列表框

    总结起来,实现ListView可编辑或双击出现下拉列表框的功能,需要对ListView的基础操作有深入理解,包括事件处理和自定义控件的使用。通过适当的编程技巧,我们可以为用户提供更丰富的交互体验,提高应用的易用性。在...

    VC中ComboBox使用详解

    `ComboBox` 是 Visual C++ (VC) 中一个非常常用的控件,它结合了编辑框和列表框的功能,能够为用户提供一个选择项列表,并允许用户在其中进行选择或手动输入。`ComboBox` 控件非常适合用于需要用户从一系列选项中...

    下拉框可编辑

    标题“下拉框可编辑”指的是在Web开发中,一种具有可编辑功能的组合框(ComboBox)控件。这种控件结合了输入框和下拉列表的特性,用户不仅可以从中选择已有选项,还可以直接在输入框中编辑文本,进行模糊查询。在...

    jquery可编辑的下拉框combox

    总结起来,jQuery可编辑的下拉框ComboBox是一个强大且实用的UI组件,通过结合输入框和下拉列表的功能,提供了一种高效的选择数据方式。开发者可以通过自定义jQuery插件或者利用现有的解决方案来实现这一功能,同时还...

    MFC ComboBox控件的使用方法

    在MFC框架中,ComboBox控件是一种常用的界面元素,它结合了下拉列表框和文本框的功能,使得用户可以在一个可编辑的文本框中输入文本,并能从下拉列表中选择一个选项。 在MFC中使用ComboBox控件通常包括以下几个步骤...

    MFC使用\combobox使用

    如果希望ComboBox自动选择某一项,则可以使用`SelectString()`方法: ```cpp int nIndex = m_cbExamble.SelectString(-1, _T("要选择的字符串")); ``` 同样地,参数`-1`表示从第一个项目开始查找。 #### 七、删除...

    可编辑 下拉框

    在IT界,"可编辑下拉框"是一种常见的用户界面元素,它结合了传统下拉框和文本输入框的功能,允许用户既可以从中选择预设的选项,也可以自行输入新的值。这种控件在各种应用程序和网页设计中都有广泛应用,提高了用户...

    具有可选选项的输入文本框(ComboBox)

    在网页设计和开发中,创建交互式的用户界面是至关重要的,而`ComboBox`(组合框或下拉文本框)就是实现这一目标的关键组件之一。它结合了文本输入框和下拉选择列表的功能,允许用户既可以手动输入数据,也可以从预...

    Python 窗体(tkinter)下拉列表框(Combobox)实例

    `Combobox`控件常用于创建下拉列表,用户可以从中选择一个或多个选项,它类似于HTML中的`&lt;select&gt;`元素。 首先,让我们深入理解`Combobox`的基本用法。在给定的代码示例中,我们看到`Combobox`是如何创建和使用的:...

    c#可输入的下拉列表框

    "C#可输入的下拉列表框"是一种交互式控件,它结合了传统的下拉列表功能和文本输入框的功能,允许用户既可以从中选择已有的选项,也可以自由输入新的值。这种控件在提高用户体验和数据输入灵活性方面起到了重要作用。...

    jQuery EasyUI 为Combo,Combobox添加清除值功能的实例

    Combo组件类似于一个带有下拉选项的输入框,而Combobox则是更高级的选择框,它既可以像Combo一样显示预设选项,也可以像文本框一样进行编辑。 知识点二:添加清除值功能的思路 为了给Combo和Combobox添加清除值功能...

    Extjs让combobox写起来简洁又漂亮

    设置一些基本的属性如editable(是否可编辑)、labelSeparator(标签分隔符)、labelWidth(标签宽度)、triggerAction(触发动作)、labelAlign(标签对齐方式)、autoSelect(自动选择)、selectOnfocus(聚焦时...

    MFC_ComboBox_使用方法.doc

    在创建Dialog类时,可以通过资源编辑器将ComboBox控件拖放到对话框上。然后,使用Class Wizard添加控件变量,例如`CComboBox m_cbExample;`,以便在代码中方便地访问和操作该控件。 2. **添加Items** - **数据...

    EasyUI学习之Combobox下拉列表(1)

    `success`回调函数会处理返回的数据,将一个默认的提示选项添加到数据的最前面,然后配置combobox组件,使其使用返回的数据,并将combobox设置为不可编辑。 对于解决浏览器的汉字乱码问题,通常情况下,如果是从...

    VFP 组合框

    它由两部分组成:一个可编辑的文本框和一个下拉列表。用户可以在文本框中输入或查看当前选中的选项,通过点击下拉箭头可以展开列表,浏览和选择其他选项。 2. **创建组合框** 在VFP的表单设计视图中,可以通过控件...

Global site tag (gtag.js) - Google Analytics