项目需要使用类似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();
});
};
}
分享到:
相关推荐
在网页设计和开发中,`ComboBox`(组合框或下拉列表框)是一种常见的用户界面元素,它结合了文本输入框和下拉选择列表的功能。本文将深入探讨如何使用JavaScript实现一个可编辑的下拉框,并阐述其核心知识点。 ### ...
通过以上方法,我们可以为C# WinForm中的ListView控件增加可编辑文本和双击出现下拉列表的功能,极大地提高了用户体验和交互性。这个过程涉及到对控件事件的处理、控件的动态创建和定位,以及一些基本的UI设计原则,...
ComboBox控件的基本结构包括一个可编辑的文本框和一个下拉列表。当用户在文本框中输入字符时,系统或应用程序可以根据这些字符过滤下拉列表中的项目,显示与输入字符匹配的选项。这种实时查询功能是ComboBox控件的一...
总结起来,实现ListView可编辑或双击出现下拉列表框的功能,需要对ListView的基础操作有深入理解,包括事件处理和自定义控件的使用。通过适当的编程技巧,我们可以为用户提供更丰富的交互体验,提高应用的易用性。在...
`ComboBox` 是 Visual C++ (VC) 中一个非常常用的控件,它结合了编辑框和列表框的功能,能够为用户提供一个选择项列表,并允许用户在其中进行选择或手动输入。`ComboBox` 控件非常适合用于需要用户从一系列选项中...
标题“下拉框可编辑”指的是在Web开发中,一种具有可编辑功能的组合框(ComboBox)控件。这种控件结合了输入框和下拉列表的特性,用户不仅可以从中选择已有选项,还可以直接在输入框中编辑文本,进行模糊查询。在...
总结起来,jQuery可编辑的下拉框ComboBox是一个强大且实用的UI组件,通过结合输入框和下拉列表的功能,提供了一种高效的选择数据方式。开发者可以通过自定义jQuery插件或者利用现有的解决方案来实现这一功能,同时还...
在MFC框架中,ComboBox控件是一种常用的界面元素,它结合了下拉列表框和文本框的功能,使得用户可以在一个可编辑的文本框中输入文本,并能从下拉列表中选择一个选项。 在MFC中使用ComboBox控件通常包括以下几个步骤...
如果希望ComboBox自动选择某一项,则可以使用`SelectString()`方法: ```cpp int nIndex = m_cbExamble.SelectString(-1, _T("要选择的字符串")); ``` 同样地,参数`-1`表示从第一个项目开始查找。 #### 七、删除...
在IT界,"可编辑下拉框"是一种常见的用户界面元素,它结合了传统下拉框和文本输入框的功能,允许用户既可以从中选择预设的选项,也可以自行输入新的值。这种控件在各种应用程序和网页设计中都有广泛应用,提高了用户...
在网页设计和开发中,创建交互式的用户界面是至关重要的,而`ComboBox`(组合框或下拉文本框)就是实现这一目标的关键组件之一。它结合了文本输入框和下拉选择列表的功能,允许用户既可以手动输入数据,也可以从预...
`Combobox`控件常用于创建下拉列表,用户可以从中选择一个或多个选项,它类似于HTML中的`<select>`元素。 首先,让我们深入理解`Combobox`的基本用法。在给定的代码示例中,我们看到`Combobox`是如何创建和使用的:...
"C#可输入的下拉列表框"是一种交互式控件,它结合了传统的下拉列表功能和文本输入框的功能,允许用户既可以从中选择已有的选项,也可以自由输入新的值。这种控件在提高用户体验和数据输入灵活性方面起到了重要作用。...
Combo组件类似于一个带有下拉选项的输入框,而Combobox则是更高级的选择框,它既可以像Combo一样显示预设选项,也可以像文本框一样进行编辑。 知识点二:添加清除值功能的思路 为了给Combo和Combobox添加清除值功能...
设置一些基本的属性如editable(是否可编辑)、labelSeparator(标签分隔符)、labelWidth(标签宽度)、triggerAction(触发动作)、labelAlign(标签对齐方式)、autoSelect(自动选择)、selectOnfocus(聚焦时...
在创建Dialog类时,可以通过资源编辑器将ComboBox控件拖放到对话框上。然后,使用Class Wizard添加控件变量,例如`CComboBox m_cbExample;`,以便在代码中方便地访问和操作该控件。 2. **添加Items** - **数据...
`success`回调函数会处理返回的数据,将一个默认的提示选项添加到数据的最前面,然后配置combobox组件,使其使用返回的数据,并将combobox设置为不可编辑。 对于解决浏览器的汉字乱码问题,通常情况下,如果是从...
它由两部分组成:一个可编辑的文本框和一个下拉列表。用户可以在文本框中输入或查看当前选中的选项,通过点击下拉箭头可以展开列表,浏览和选择其他选项。 2. **创建组合框** 在VFP的表单设计视图中,可以通过控件...