简体   繁体   中英

Javascript - Selecting options not working

I have a form that can select option from dropdownlist when user entered a value.

For example: enter value 880520 would actually choose Year:1988 Month:May Day:20 . 在此处输入图片说明
The javascript function:

<script type="text/javascript">

function completeDOB() {

var x = document.getElementById('textvalue').value;

var str = x.match(/.{1,2}/g);

var day = parseInt(str[2],10) +1;
document.getElementById("dob-day").options[day].selected=true;

var month = parseInt(str[1],10) +1;
document.getElementById("dob-month").options[month].selected=true;

var year = parseInt(19+str[0],10);
document.getElementById("dob-year").options[year].selected=true;
}

</script>


I'm using onblur for the textfield to execute the completeDOB function.

<input name="textvalue" type="text" id="textvalue" onblur="completeDOB()">

However, the selected options only works on the Day and Month , but the Year don't work.

The dropdownlist code for Year :

<select name="dob_year" id="dob-year">
      <option value="">Year</option>
      <option value="">----</option>
      <?php
        $date = (int) date('Y');
        $numYears = 100;
        for ($i=$date; $i >= $date - $numYears; $i--) {
            echo "<option value=\"$i\">$i</option>";
        }
      ?>
</select>


Also, I've checked the source code of the page and the option value is fine.

<option value="2018">2018</option><option value="2017">2017</option><option value="2016">2016</option><option value="2015">2015</option><option value="2014">2014</option><option value="2013">2013</option><option value="2012">2012</option><option value="2011">2011</option><option value="2010">2010</option><option value="2009">2009</option><option value="2008">2008</option><option value="2007">2007</option><option value="2006">2006</option><option value="2005">2005</option><option value="2004">2004</option><option value="2003">2003</option><option value="2002">2002</option><option value="2001">2001</option><option value="2000">2000</option><option value="1999">1999</option><option value="1998">1998</option><option value="1997">1997</option><option value="1996">1996</option><option value="1995">1995</option><option value="1994">1994</option><option value="1993">1993</option><option value="1992">1992</option><option value="1991">1991</option><option value="1990">1990</option><option value="1989">1989</option><option value="1988">1988</option><option value="1987">1987</option><option value="1986">1986</option><option value="1985">1985</option><option value="1984">1984</option><option value="1983">1983</option><option value="1982">1982</option><option value="1981">1981</option><option value="1980">1980</option><option value="1979">1979</option><option value="1978">1978</option><option value="1977">1977</option><option value="1976">1976</option><option value="1975">1975</option><option value="1974">1974</option><option value="1973">1973</option><option value="1972">1972</option><option value="1971">1971</option><option value="1970">1970</option><option value="1969">1969</option><option value="1968">1968</option><option value="1967">1967</option><option value="1966">1966</option><option value="1965">1965</option><option value="1964">1964</option><option value="1963">1963</option><option value="1962">1962</option><option value="1961">1961</option><option value="1960">1960</option><option value="1959">1959</option><option value="1958">1958</option><option value="1957">1957</option><option value="1956">1956</option><option value="1955">1955</option><option value="1954">1954</option><option value="1953">1953</option><option value="1952">1952</option><option value="1951">1951</option><option value="1950">1950</option><option value="1949">1949</option><option value="1948">1948</option><option value="1947">1947</option><option value="1946">1946</option><option value="1945">1945</option><option value="1944">1944</option><option value="1943">1943</option><option value="1942">1942</option><option value="1941">1941</option><option value="1940">1940</option><option value="1939">1939</option><option value="1938">1938</option><option value="1937">1937</option><option value="1936">1936</option><option value="1935">1935</option><option value="1934">1934</option><option value="1933">1933</option><option value="1932">1932</option><option value="1931">1931</option><option value="1930">1930</option><option value="1929">1929</option><option value="1928">1928</option><option value="1927">1927</option><option value="1926">1926</option><option value="1925">1925</option><option value="1924">1924</option><option value="1923">1923</option><option value="1922">1922</option><option value="1921">1921</option><option value="1920">1920</option><option value="1919">1919</option><option value="1918">1918</option>

And I really have no idea why only the Year list wont work but the other 2 works fine.

Updated:

I've tried entering select options manually and turns out the program recognize the option value as following :

<option value="03">2018</option>
<option value="04">2017</option>
<option value="05">2016</option>
etc.

How would I do to solve the problem? Does the option value must start from 01 ?

Your options is a HTMLOptionsCollection . You actually access options by their index there for day and month , instead by using their value.

Luckily for you, I bet your day and month selectElements have their 0th index defined, therefore the next ones indexes match with your day and month value.

However, this will not work for your year selectElement. You will need to select the correct option element based on its year value, and set its selected to be true .

Eg

function completeDOB() {
  var x = document.getElementById('textvalue').value;
  var str = x.match(/.{1,2}/g);

  var day = parseInt(str[2],10) +1;
  document.getElementById("dob-day").options[day].selected=true;

  var month = parseInt(str[1],10) +1;
  document.getElementById("dob-month").options[month].selected=true;

  var year = parseInt(19+str[0],10);
  var year_options = [].filter.call(document.getElementById('dob-year').options, function (opt) {
    return opt.value == year
  });
  if (year_options && year_options.length) {
    year_options[0].selected = true;
  }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM