Функция onKeyUp не возвращает все результаты - PullRequest
0 голосов
/ 17 февраля 2012

Фон - у меня есть форма с текстовым полем. Пользователь вводит 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 - Услуги лесоуправления».

Я что-то не так делаю?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 17 февраля 2012

используйте лучший фильтр для проверки строки параметров

// 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; 
}
0 голосов
/ 17 февраля 2012

Поскольку вы возвращаете значение true для первого элемента, который начинается с strValue, в раскрывающемся списке будет задан первый соответствующий элемент, а не элемент с наилучшим соответствием.

Попробуйте:

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;
      }
   }
}
...