封装为HTC方便调用<style>
.box{ behavior:url(selectBox.htc); }
</style><select style="width:150px;" class="box">
<option>sdfsdfsdfdsfsdf</option>
<option>1111111111111</option>
<option>222222222222</option>
</select>====================================================================
参考meizz(梅花雪)的JS封装类
js的构造函数不会用,也找不到相关的资料:(
哪位朋友有?给我地址或者共享一下吧,谢谢~~~~~
.box{ behavior:url(selectBox.htc); }
</style><select style="width:150px;" class="box">
<option>sdfsdfsdfdsfsdf</option>
<option>1111111111111</option>
<option>222222222222</option>
</select>====================================================================
参考meizz(梅花雪)的JS封装类
js的构造函数不会用,也找不到相关的资料:(
哪位朋友有?给我地址或者共享一下吧,谢谢~~~~~
麻烦你了只要找到Bug的根源,总会有办法解决的(废话)
//只是对接问题,因为每台机器的滚动条宽度可能不同(我的就是13px,默认16px),
//现在应该没问题了//==============================================================================// 描述 : HTML ComboBox 可编辑下拉框
// 版本 : 0.3
// 作者 : Brook Qin([email protected])
// 最新更新 : 2003-12-29
// 备注 : 在CSDN上看到梅花雪的ComboBox,也想自己做一个,这个就是了
// 因为水平比较烂,只能做到这样了。
// 更新 : 通过脚本获取垂直滚动条宽度(因为我的机器在桌面属性里把滚动条宽度设为13,所以
// 相同的东西在别的机器上显示对接不好,现在好了)
//<PUBLIC:COMPONENT>
<PUBLIC:ATTACH EVENT="oncontentready" ONEVENT="boxInit()" />
<PUBLIC:ATTACH EVENT="onchange" ONEVENT="setbox()" /><script language="JavaScript">
var selectBox, sSpanSelect, oSpanInput, oInput;
var thread = 0;
var selectedId = -1;function boxInit(){
var oLeft, oTop, oWidth, scrollBarWidth;
oLeft = element.offsetLeft;
oTop = element.offsetTop;
oWidth = element.offsetWidth;//获取滚动条宽度
scrollBarWidth = element.document.body.offsetWidth - element.document.body.scrollWidth-3;//创建对象
selectBox = element;
oSpanSelect = element.document.createElement("span");
oSpanInput = element.document.createElement("span");
oInput = element.document.createElement("input");
var oBlank = element.document.createElement("span"); //这个是占位符oSpanSelect.style.cssText = "position:absolute; top:"+oTop+"px; left:"+oLeft+"px; width:"+oWidth+"px; font-size:9pt;clip:rect(0 "+oWidth+" 20 "+(oWidth-scrollBarWidth-2)+");";
oSpanInput.style.cssText = "position:absolute; top:"+(oTop-1)+"px; left:"+oLeft+"px;";
oInput.style.cssText = "width:"+(oWidth-scrollBarWidth)+"px; font-size:9pt;";
oBlank.style.cssText = "width:"+oWidth+"px; height:20px;";selectBox.insertAdjacentElement("beforeBegin",oBlank);
element.document.body.appendChild(oSpanSelect);
oSpanSelect.appendChild(selectBox);
element.document.body.appendChild(oSpanInput);
oSpanInput.appendChild(oInput);//添加行为
oInput.attachEvent("onpropertychange", inputBoxChg);
oInput.attachEvent("onblur", boxBlur);
oInput.attachEvent("onfocus", boxFocus);setbox();
}function setbox(){
oInput.value = selectBox.options[selectBox.selectedIndex].text;
if(event.srcElement.tagName == "SELECT") oInput.select();
}function inputBoxChg(){
if(thread == 1){
selectBox.options[selectBox.length] = new Option(oInput.value, oInput.value);
selectedId = selectBox.length-1;
thread = 2;
selectBox.options[selectedId].text = oInput.value;
selectBox.options[selectedId].value = oInput.value;
}else if(thread == 2) {
selectBox.options[selectedId].text = oInput.value;
selectBox.options[selectedId].value = oInput.value;
}
}function boxFocus(){
thread = 1;
selectedId = selectBox.selectedIndex;
}function boxBlur(){
thread = 0;
selectBox.selectedIndex = selectedId;
for(i=0; i<selectBox.length; i++){
if(selectBox.options[i].text == selectBox.options[selectedId].text && i!=selectedId){
selectBox.options[selectedId] = null;
selectBox.selectedIndex = i;
setbox();
break;
}
}
selectedId = -1;
}
</script>
</PUBLIC:COMPONENT>
问题还是有一个:IE5下让select取得焦点,然后用鼠标滚轮快速滚几下,列表就乱套了
%^&*(()&$^%$^&%$^% faint!~解决IE6下的一点小毛病:
=================================================================
// 描述 : HTML ComboBox 可编辑下拉框
// 版本 : 0.3
// 作者 : Brook Qin([email protected])
// 最新更新 : 2003-12-29
// 备注 : 在CSDN上看到梅花雪的ComboBox,也想自己做一个,这个就是了
// 因为水平比较烂,只能做到这样了。
// 更新 : 通过脚本获取垂直滚动条宽度(因为我的机器在桌面属性里把滚动条宽度设为13,所以
// 相同的东西在别的机器上显示对接不好,现在好了)
//<PUBLIC:COMPONENT>
<PUBLIC:ATTACH EVENT="oncontentready" ONEVENT="boxInit()" />
<PUBLIC:ATTACH EVENT="onchange" ONEVENT="setbox()" /><script language="JavaScript">
var selectBox, sSpanSelect, oSpanInput, oInput;
var thread = 0;
var selectedId = -1;function boxInit(){
var oLeft, oTop, oWidth, scrollBarWidth;
oLeft = element.offsetLeft;
oTop = element.offsetTop;
oWidth = element.offsetWidth;//获取滚动条宽度
scrollBarWidth = element.document.body.offsetWidth - element.document.body.scrollWidth - 3;//创建对象
selectBox = element;
oSpanSelect = element.document.createElement("span");
oSpanInput = element.document.createElement("span");
oInput = element.document.createElement("input");
var oBlank = element.document.createElement("span"); //这个是占位符//Style
oSpanSelect.style.cssText = "position:absolute; top:"+oTop+"px; left:"+oLeft+"px; width:"+oWidth+"px; font-size:9pt;clip:rect(0 "+oWidth+" 20 "+(oWidth-scrollBarWidth-2)+"); margin:0px;";
oSpanInput.style.cssText = "position:absolute; top:"+(oTop-1)+"px; left:"+oLeft+"px; margin:0px;";
oInput.style.cssText = "width:"+(oWidth-scrollBarWidth)+"px; font-size:9pt;";
oBlank.style.cssText = "width:"+oWidth+"px; height:20px;";selectBox.insertAdjacentElement("beforeBegin",oBlank);
element.document.body.appendChild(oSpanSelect);
oSpanSelect.appendChild(selectBox);
element.document.body.appendChild(oSpanInput);
oSpanInput.appendChild(oInput);
//添加行为
oInput.attachEvent("onpropertychange", inputBoxChg);
oInput.attachEvent("onblur", boxBlur);
oInput.attachEvent("onfocus", boxFocus);setbox();
}function setbox(){
oInput.value = selectBox.options[selectBox.selectedIndex].text;
if(event.srcElement.tagName == "SELECT"){
oInput.select();
selectBox.focus();
}
}function inputBoxChg(){
if(thread == 1){
selectBox.options[selectBox.length] = new Option(oInput.value, oInput.value);
selectedId = selectBox.length-1;
thread = 2;
selectBox.options[selectedId].text = oInput.value;
selectBox.options[selectedId].value = oInput.value;
}else if(thread == 2) {
selectBox.options[selectedId].text = oInput.value;
selectBox.options[selectedId].value = oInput.value;
}
}function boxFocus(){
thread = 1;
selectedId = selectBox.selectedIndex;
}function boxBlur(){
thread = 0;
selectBox.selectedIndex = selectedId;
for(i=0; i<selectBox.length; i++){
if(selectBox.options[i].text == selectBox.options[selectedId].text && i!=selectedId){
selectBox.options[selectedId] = null;
selectBox.selectedIndex = i;
setbox();
break;
}
}
selectedId = -1;
}
</script>
</PUBLIC:COMPONENT>
谢谢~~~~~
IE对事件的处理确实很让人头痛,如果有几个事件同时发生的话,就麻烦了。
不过受你的提示,如果用onkeydown,onkeyup,onkeypress,onpaste,oncut等等这些应该可以模拟onchange和onpropertychange,试试再说~~To: chenlm(李逍遥)
谢谢~~~~~
你所说的筛选是当输入东西后自动找到匹配的吗?现在就应该可以吧~
好象方向键和tab键不会触发onkeypress,就算能触发也可以用程序排除。
if(event.srcElement.tagName == "SELECT"){
oInput.select();
selectBox.focus();
}
没啥具体作用,顶多在initial的时候执行一次,不然selectBox总是占有焦点的。似乎可以优化一下代码。偶没仔细研究,呵呵,说错了勿怪。
oInput.select();
selectBox.focus();
}
这段确实没什么具体作用,只是为了更好的模拟select,可以支持滚轮你说的这个"直接撂在里面"倒是一个好办法!
scrollBarWidth = element.document.body.offsetWidth - element.document.body.scrollWidth - 3;这样取得滚动条的宽度比较无奈,我实在想不出别的办法,那位高手可以支招?
Script本身:prototype prototype允许增加新属性和方法到与现有的类的构造函数相关联的原型来给类添加方法和新属性。
例如,为String类(JS的原生类)增加一个名叫duty的方法(引用setTask函数):///////// Example for PROTOTYPE Begins//////var myTask=new String();
function setTask(str){
var task="Girls go shopping";
if(str != null){
task=str;
}
return task;
}String.prototype.duty=setTask; //这里为String类增加方法,方法名为duty,指向的原生函数为setTaskdocument.write("The first task is:"+mytask.duty("Nothing")+"<br>");
document.write("The first task is:"+mytask.duty());/////// Example 1 Ends //////////简单地创建一个类:
///// Example 2 Begins /////////function person(age,name){
this.name=name;
this.age=age;
}var theOne=new person(25,"Peter"); //这里,创建一个person类的实例document.write("Name is: "+theOne.name+" and age of: "+theOne.age);///// Example 2 Ends /////////========================================================希望上面的东东能帮到你。很惊讶例子2里的玩意是吧?呵呵。都不用象“class person"这样的语法来定义一个新类,function就可以了,里面的变量居然还是没有随函数的执行而消失掉哩!另外,HTML可以自定义tag,你好象可以把你的combox自定义一个为一个新tag,如何继承那些input和select的方法、属性、还有那些表观的东东,再研究嘛。看(DHTML参考)。偶还没有自定义过什么Tag呢,暂时也没有太大发言权,嘿嘿