javascript - change selectbox options and the options text by another selectbox -


i got html form 2 selectbox, 1 design , 1 color. need color options display selected design options, in addition need sanitize color options text. , important thing - html shouldn't changed. managed it, it's work once. coloroption innettext keep changing although i'm pushing elements array.

html

<form action="index.html" method="post">   <div>     <label for="design">design:</label>     <select id="design" name="user_design">       <option>select theme</option>       <option value="js puns">theme - js puns</option>       <option value="heart js">theme - &#9829; js</option>     </select>   </div>    <div id="colors-js-puns" class="">     <label for="color">color:</label>     <select id="color">       <option value="cornflowerblue">cornflower blue (js puns shirt only)</option>       <option value="darkslategrey">dark slate grey (js puns shirt only)</option>        <option value="gold">gold (js puns shirt only)</option>        <option value="tomato">tomato (i &#9829; js shirt only)</option>       <option value="steelblue">steel blue (i &#9829; js shirt only)</option>        <option value="dimgrey">dim grey (i &#9829; js shirt only)</option>      </select>   </div>        </form> 

js

var sanitizestr = function(str) {     var regex = /\(+.+\)/;     var substr = str.match(regex);     str = str.replace(' ' + substr, '');     return str; };  var gettshirtdesign = function() {     var design = document.getelementbyid('design');     var colordiv = document.getelementbyid('colors-js-puns');     var color = document.getelementbyid('color');     var coloroptions = document.queryselectorall('#color option');     var display;     // hide color label , select     colordiv.style.display = 'none';     console.log(coloroptions);     design.onchange = function() {         console.log(coloroptions);         display = [];         color.innerhtml = '';         if (this.value === 'select theme') {             colordiv.style.display = 'none';         } else {             colordiv.style.display = 'block';             // finds coloroptions elements contains part of selected option text , push them display             (var = 0; < coloroptions.length; i++) {                 if (coloroptions[i].innertext.indexof(this.selectedoptions[0].text.substr(8)) > -1) {                     display.push(coloroptions[i]);                 }             }             // sanitize innertext of display elements , append them color             (i = 0; < display.length; i++) {                 display[i].innertext = sanitizestr(display[i].innertext);                 color.appendchild(display[i]);             }         }     }; }; gettshirtdesign(); 

jsfiddle

the main issue here fact color div innerhtml being wiped on change. lose full data list of colors when happens. got around issue manually specifying new coloroptionsvalues object , populating color select boxes that. see snippet:

var sanitizestr = function(str) {      var regex = /\(+.+\)/;      var substr = str.match(regex);      str = str.replace(' ' + substr, '');      return str;  };    var coloroptionsvalues = {    "cornflowerblue" : "cornflower blue (js puns shirt only)",     "darkslategrey" : "dark slate grey (js puns shirt only)",     "gold" : "gold (js puns shirt only)",     "tomato" : "tomato (i ♥ js shirt only)",     "steelblue" : "steel blue (i ♥ js shirt only)",     "dimgrey" : "dim grey (i ♥ js shirt only)"  };    var gettshirtdesign = function() {      var design = document.getelementbyid('design');      var colordiv = document.getelementbyid('colors-js-puns');      var color = document.getelementbyid('color');      var coloroptions = document.queryselectorall('#color option');      var display;      // hide color label , select      colordiv.style.display = 'none';      design.onchange = function() {          display = [];          color.innerhtml = '';          if (this.value === 'select theme') {              colordiv.style.display = 'none';          } else {              colordiv.style.display = 'block';                          // finds coloroptions elements contains part of selected option text , push them display            (var key in coloroptionsvalues) {              if (coloroptionsvalues.hasownproperty(key)) {                if (coloroptionsvalues[key].indexof(this.selectedoptions[0].text.substr(8)) > -1) {                                         display.push(key);                }              }             }            //console.log(display);              // sanitize innertext of display elements , append them color              (i = 0; < display.length; i++) {                  var sanitizedvalue = sanitizestr(coloroptionsvalues[display[i]]);                var optionnode = document.createelement("option");                optionnode.value = display[i];                optionnode.text = sanitizedvalue;                color.appendchild(optionnode);              }          }      };    };    gettshirtdesign();
<form action="index.html" method="post">    <div>      <label for="design">design:</label>      <select id="design" name="user_design">        <option>select theme</option>        <option value="js puns">theme - js puns</option>        <option value="heart js">theme - &#9829; js</option>      </select>    </div>      <div id="colors-js-puns" class="">      <label for="color">color:</label>      <select id="color">        <option value="cornflowerblue">cornflower blue (js puns shirt only)</option>        <option value="darkslategrey">dark slate grey (js puns shirt only)</option>         <option value="gold">gold (js puns shirt only)</option>         <option value="tomato">tomato (i &#9829; js shirt only)</option>        <option value="steelblue">steel blue (i &#9829; js shirt only)</option>         <option value="dimgrey">dim grey (i &#9829; js shirt only)</option>       </select>    </div>         </form>

option 2

var sanitizestr = function(str) {      var regex = /\(+.+\)/;      var substr = str.match(regex);      str = str.replace(' ' + substr, '');      return str;  };    var coloroptions = document.queryselectorall('#color option');  var coloroptionsvalues = {};  function initializecolors(){    (i = 0; < coloroptions.length; ++i) {      coloroptionsvalues[coloroptions[i].value] = coloroptions[i].text;    }  }    var gettshirtdesign = function() {      var design = document.getelementbyid('design');      var colordiv = document.getelementbyid('colors-js-puns');      var color = document.getelementbyid('color');      var display;      // hide color label , select      colordiv.style.display = 'none';      design.onchange = function() {          display = [];          color.innerhtml = '';          if (this.value === 'select theme') {              colordiv.style.display = 'none';          } else {              colordiv.style.display = 'block';                          // finds coloroptions elements contains part of selected option text , push them display            (var key in coloroptionsvalues) {              if (coloroptionsvalues.hasownproperty(key)) {                if (coloroptionsvalues[key].indexof(this.selectedoptions[0].text.substr(8)) > -1) {                                      display.push(key);                }              }             }            //console.log(display);              // sanitize innertext of display elements , append them color              (i = 0; < display.length; i++) {                  var sanitizedvalue = sanitizestr(coloroptionsvalues[display[i]]);                var optionnode = document.createelement("option");                optionnode.value = display[i];                optionnode.text = sanitizedvalue;                color.appendchild(optionnode);              }          }      };    };    initializecolors();  gettshirtdesign();
<form action="index.html" method="post">    <div>      <label for="design">design:</label>      <select id="design" name="user_design">        <option>select theme</option>        <option value="js puns">theme - js puns</option>        <option value="heart js">theme - &#9829; js</option>      </select>    </div>      <div id="colors-js-puns" class="">      <label for="color">color:</label>      <select id="color">        <option value="cornflowerblue">cornflower blue (js puns shirt only)</option>        <option value="darkslategrey">dark slate grey (js puns shirt only)</option>         <option value="gold">gold (js puns shirt only)</option>         <option value="tomato">tomato (i &#9829; js shirt only)</option>        <option value="steelblue">steel blue (i &#9829; js shirt only)</option>         <option value="dimgrey">dim grey (i &#9829; js shirt only)</option>       </select>    </div>         </form>


Comments