2013-04-26 2 views
0

Моя форма получает предварительно загруженную нагрузку со значениями из строки запроса. В запросе, когда страна = Австралия, выбирается «Австралия». Но когда страна = АВСТРАЛИЯ или страна = австралия, ничего не выбирается.Сделать выбор значения параметра нечувствительным к регистру/иметь несколько значений

Мой поле выбора:

<select id="country" name="country" style="border: 1px solid rgb(204, 204, 204); font-family: Arial,Helvetica,sans-serif; font-size: 9pt; width: 150px;"> 
    <option value="" selected="selected">Please select country</option> 
    <option value="Australia">Australia</option> 
    <option value="Austria">Austria</option> 
</select> 

Я думаю <option value="Australia, AUSTRALIA, australia"> бы заставить его работать. Как мне это сделать? Будет ли это (Can an Option in a Select tag carry multiple values?) вариантом?

В противном случае, как я могу сделать поле выбора поля незаметным для предпопуляции с значениями запроса?

JS для строки запроса добавил:

function populate(form) { 
    if (location.search == null || location.search.length < 1) return; // no querystring 
    var pairs = location.search.substring(1).split("+"); 
    for (var p = 0; p < pairs.length; ++p) { 
     var pair = pairs[p].split("="); 
     var name = pair[0]; 
     var value = unescape(pair[1].replace(/\+/g, " ")); 
     var fld = form.elements[name]; 
     var ftype = null; 
     var farray = false; 
     var atype = Array; 
     if (fld != null) { 
      if (fld.length != null && fld.length >= 1 && fld[0].type != null && fld[0].type != undefined) { 
       ftype = fld[0].type; 
       farray = true; 
      } else { 
       ftype = fld.type; 
      } 
     } 
     switch (ftype) { 
     case "text": 
     case "hidden": 
     case "textarea": 
      if (farray) fld = fld[0]; // only handle first-named for this type 
      fld.value = value; 
      break; 
     case "select-one": 
     case "select-multiple": 
      if (farray) fld = fld[0]; // only handle first-named for this type 
      for (var o = 0; o < fld.options.length; ++o) { 
       var opt = fld.options[o]; 
       var oval = opt.value; 
       if (oval == null || oval == "") oval = opt.text; 
       if (oval == value) { 
        opt.selected = true; 
        break; 
       } 
      } 
      break; 
     case "checkbox": 
     case "radio": 
      if (!farray) { 
       // single checbox or radio of that name: 
       fld.checked = true; 
      } else { 
       for (var cr = 0; cr < fld.length; ++cr) { 
        if (fld[cr].value == value) { 
         fld[cr].checked = true; 
         break; 
        } 
       } 
      } 
      break; 
     default: 
      alert("Unknown field type encountered for field " + name + ": " + ftype); 
      break; 
     } // end of switch 
    } // end of loop on fields from qs 
} 
+0

Показать код, в котором вы предварительно заполняете запрос на основе строки запроса – Ian

+0

Из немного расплывчатой ​​информации. Похоже, что у вас есть потенциальная точка входа XSS, если вы просто выводите информацию непосредственно из QS в источник, без предварительной обработки на нем (иначе вы уже превратили бы его в известное значение для своего раскрывающегося списка). – Psytronic

+0

Извините за неопределенность моего оригинального сообщения. Первый таймер здесь! Итак, @psytronic, вы говорите, что я должен добавить материал для предварительной обработки того, что исходит из запроса? – pedroargenti

ответ

2

Когда вы prepopulating (я предполагаю, что вы сравните значения в for цикле), сравнивать значения с .toLowerCase(). Например:

if (querystringValue.toLowerCase() === optionValue.toLowerCase()) { 
    // Select this option 
    break; 
} 

UPDATE:

Для вашего обновленного кода, я думаю, было бы здесь:

if (oval == value) { 
    opt.selected = true; 
    break; 
} 

Так измените его на:

if (oval.toLowerCase() === value.toLowerCase()) { 
    opt.selected = true; 
    break; 
} 

В зависимости если это применимо, вы можете сделать то же самое с вашим флажком/радио установка кнопок:

if (fld[cr].value == value) { 

Но это действительно зависит от вас.

+0

Так что лучше изменить способ, которым я preopulate вместо добавления нескольких значений. Интересно! Я добавил свой код в preopulate. Не могли бы вы помочь мне установить это условие? – pedroargenti

+0

@pedroargenti часть, которую вам нужно изменить, является 'if (oval == value) {' to 'if (oval.toLowerCase() == value.toLowerCase()) {' –

+1

@ GabyakaG.Petrioli Ха-ха, спасибо, я буквально получил ваш комментарий, когда я редактировал свой ответ, чтобы объяснить это (после того, как я переформатировал код OP, чтобы я мог его прочитать/найти) :) – Ian

Смежные вопросы