背景 - 我有一个带有文本字段的表单。用户输入2-6位整数。在每个键击中,javascript函数被称为匹配下拉列表中的值。
我的文字字段:
<input type="text" name="orgSICCode" value="" allownull="FALSE" size="5" maxlength="10" datatype="dtNumeric" onKeyUp="ActivateOption(description,this.value);" onBlur="this.value = description.options[description.selectedIndex].value;" emsg="Must choose a SIC Code before you can continue.">
我的下拉字段:
<select name="description" STYLE="width:275px;" onChange="orgSICCode.value = this.options[this.selectedIndex].value;sic_code_description.value = this.options[this.selectedIndex].text;">
<option value="">Select One ...</option>
<option value="085101">085101 - Forest management services</option>
<option value="0831">0831 - Forest Products</option>
<option value="083100">083100 - Forest products</option>
<option value="083199">083199 - Forest products, nec</option>
<option value="08">08 - Forestry</option>
</select>
我的javascript函数ActivateOption:
function ActivateOption(selectObj, strValue) {
for(var idx=0;idx<selectObj.options.length;idx++) {
if(selectObj.options[idx].value.substring(0,strValue.length) == strValue) {
selectObj.selectedIndex = idx;
return true;
}
}
selectObj.selectedIndex = 0;
return false;
}
当用户键入“08”时,应填充的第一个选项是08值,“08 - 林业”选项。填充的选项是'085101','085101 - 森林管理服务'。
我做错了吗?
感谢。
答案 0 :(得分:0)
因为您对以strValue
开头的第一个项目返回true,所以您的下拉列表将设置为第一个匹配项目 - 而不是具有最佳匹配项目。
尝试:
function ActivateOption(selectObj, strValue) {
selectObj.selectedIndex = 0;
for(var idx=0;idx<selectObj.options.length;idx++) {
if(selectObj.options[idx].value.substring(0,strValue.length) == strValue) {
selectObj.selectedIndex = idx;
}
}
}
答案 1 :(得分:0)
使用更好的过滤器来检查选项字符串
// this function return the most similer string,
// sarr take a string arr which to filte
function checkString ( sarr, srcStr ) {
var ret = "", val = 0, srcStr = srcStr.split("");
sarr.forEach( function ( content, index ) {
var i, l, curval = 0, cont = content.split("");
for ( i = 0, l = cont.length; i < l; i += 1 ){
if ( cont [i] === srcStr[i] ){
curval += Math.pow ( 10, i );
} else {
break;
}
}
if ( curval > val ){
val = curval;
ret = content;
} else if ( curval === val && Math.abs ( content.length - srcStr.length ) < Math.abs ( ret.length - srcStr.length ) ){
ret = content;
}
})
return ret;
}