【问题标题】:How to append <option> tags to a <select> statement in a for loop?如何将 <option> 标签附加到 for 循环中的 <select> 语句?
【发布时间】:2018-12-22 05:31:25
【问题描述】:

我正在尝试在&lt;select&gt; 菜单中动态填充&lt;option&gt; 标签,但是我在这样做时遇到了麻烦。我想要这样做的方式是在一个 for 循环中,其中 JS 循环遍历有许多选项,并将选项附加到 select 标记。

不起作用的代码位(我认为)是这一位:(所有相关代码都在下面)

        for (var i = 0; i < count; i++) {
            //how can I do this part?
            item.appendChild((option + i + 1));
        }

我希望它循环显示,例如,如果 count = 2 附加选项。

所以当i = 0 时它会做:item.appendChild((option1)); 而当i = 1 它会做item.appendChild(option2); 到我的&lt;select id='_second'&gt; 菜单

我不确定发生了什么,如果有人能给我一个方向感,那将不胜感激。

//Javascript
    myFunction = () => {
        //get value of selected <option> in a separate <select> drop down
        var type = document.getElementById('_first').value;
        //get the second <select>
        var item = document.getElementById('_second');
        //set count variable to know how many <options> there should be in second <select> drop down
        var count;
        //assess value
        switch (type) {
            case '1': //First case
                var option1 = document.createElement('option');
                    option1.text = 'SomeText1';
                count = 1;
                break;
            case '2': //Second case
                var option1 = document.createElement('option');
                    option1.text = 'SomeText2';
                var option2 = document.createElement('option');
                    option2.text = 'SomeText3';
                count = 2;
                break;
            case '3': //Third case
                var option1 = document.createElement('option');
                    option1.text = 'SomeText4';
                var option2 = document.createElement('option');
                    option2.text = 'SomeText5';
                var option3 = document.createElement('option');
                    option3.text = 'SomeText6';
                count = 3;
                break;
        }
        //populate select menu
        for (var i = 0; i < count; i++) {
            //how can I do this part?
            item.appendChild((option + i + 1));
        }
    }

//HTML

<p>Select Something:</p>

<div style="width:50%;">
        First Menu: <br>
        <select id='_first' required>
            <option value='0'>Select Type:</option>
            <option value='1'>First Option</option>
            <option value='2'>Second Option</option>
            <option value='3'>Third Option</option>
        </select>
</div>
<div style="width:50%;">
        Dynamic Second Menu: <br>
        <select id='_second'>
            <!-- Doesn't populate! &sadface; -->
        </select>
</div>

【问题讨论】:

  • 您不能将一个变量的值附加到另一个变量以获取名称,然后再附加另一个变量的值。尝试改用array
  • eval(),我的答案如下。它展示了如何做到这一点,只需使用 eval() 和 parseInt() 逻辑将其添加到您自己的代码 Lego 中。祝你好运:)

标签: javascript html ajax dom


【解决方案1】:

一种选择是建立一个这样的选项数组:https://codepen.io/anon/pen/jpbKBx

//Javascript
    function myFunction () {

        //get value of selected <option> in a separate <select> drop down
        var type = document.getElementById('_first').value;
        //get the second <select>
        var item = document.getElementById('_second');

        //Clear child nodes from dynamic <select>
        while (item.hasChildNodes()) {
            item.removeChild(item.lastChild);
        }

        //set count variable to know how many <options> there should be in second <select> drop down
        var count;
        var options = [];
        //assess value
        switch (type) {
            case '1': //First case
                var option1 = document.createElement('option');
                    option1.text = 'SomeText1';
                options.push(option1);
                break;
            case '2': //Second case
                var option1 = document.createElement('option');
                    option1.text = 'SomeText2';
                options.push(option1);
                var option2 = document.createElement('option');
                    option2.text = 'SomeText3';
                options.push(option2);
                break;
            case '3': //Third case
                var option1 = document.createElement('option');
                    option1.text = 'SomeText4';
                options.push(option1);
                var option2 = document.createElement('option');
                    option2.text = 'SomeText5';
                options.push(option2);
                var option3 = document.createElement('option');
                    option3.text = 'SomeText6';
                options.push(option3);
                break;
        }

        //populate select menu
        for (var i = 0; i < options.length; i++) {
            //how can I do this part?
            item.appendChild((options[i]));
        }
    }

【讨论】:

  • 我刚刚获得了答案,但我只想说 Bensmind 的这个答案也是合法的,并且是推荐的选项。它确实改变了 OP 代码的结构,但却是一种有效的方法。如果有数百个选项,我相信 Ben 的代码会比我的更快——如果不是已经更快(运行,而不是编码)。
  • 我的意思不是私人的,只是你的回答更适合我的情况。我无法使用数组作为解决方案来解决这个问题,但它肯定会起作用..只是不适合我的情况。所有很好的答案,谢谢你
【解决方案2】:
var i = 1; 
var option1 = 'test';
var option2 = 'test2';
var number = eval("option"+parseInt(i+1, 10)); 
console.log(number);

它工作了吗...https://jsfiddle.net/ucp9jgnh/1/ 应该做的伎俩...不是一个很好的方法,但它至少可以工作

在本例中,选项 2 是答案...

parseInt(i+1, 10) ...该部分将确保它是数学格式的 i(您的循环)+1。然后它将它添加到“选项”文本中,然后 eval() 允许 JS 将其视为变量而不是字符串。

如果您更改 var i = 0,由于数学原因,它将改为输出“test”而不是“test2”。

这是你在循环中要做的事情......应该按原样工作:

var appendedThing = eval("option"+parseInt(i+1, 10));
item.appendChild(appendedThing);

【讨论】:

    猜你喜欢
    • 2019-08-31
    • 2014-07-25
    • 2018-03-05
    • 2019-02-23
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    相关资源
    最近更新 更多