使用jQuery向下拉列表添加选项时出现问题

时间:2010-07-21 12:58:01

标签: javascript jquery html

我正在尝试使用jquery在另一个下拉列表中选择特定列表项时填充下拉列表,但由于某种原因,选项是在下拉列表之外创建的,这是我的代码,

function makeModel(obj){ 
    model = new Array();
    model[0] = new Array( '212', 'Ace', 'Aceca', 'Cobra', 'Superblower');
    model[1] = new Array( '145', '146', '147', '147 3 Door', '147 5 Door', '155', '156', '159', '164', '166', '33', '75', '90', 'Alfasud', 'Alfetta', 'Arna', 'Brera', 'GT', 'GTV', 'Giulietta', 'Gold Cloverleaf', 'Mito', 'SZ', 'Spider', 'Sprint');
    model[2] = new Array( 'Rocsta');

    var curSel=obj.options[obj.selectedIndex].value ;
    var x;

    $('#replace').html("<select name=\"test\" id=\"test\">");
    for (x in model[curSel])
    {
        $('#replace').append("<option>" + model[curSel][x] + "</option>");
    }
    $('#replace').append("</select>");  

}  

HTML:

<form>
<fieldset>       
    <p>
      <label for="test">Make: </label>
      <select name="test" id="test" onchange="makeModel(this);">
        <option>Select one</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
      </select>
    </p>
</fieldset>
</form>

<div id="replace"></div>

我确定这是我的某个逻辑错误,但我找不到它!

所以任何帮助都会受到赞赏,谢谢!

2 个答案:

答案 0 :(得分:5)

您要附加到替换div框,而不是选择输入元素。

更改您要添加的内容(而不是#replace,您将使用#test)然而 #test的ID用于 BOTH 选择正在插入到替换区域和用于执行插入的主要选择输入。因此,您需要将其更改为“sub”之类的内容,并最终得到类似的内容:

function makeModel(obj){
    model = new Array();
    model[0] = new Array( '212', 'Ace', 'Aceca', 'Cobra', 'Superblower');
    model[1] = new Array( '145', '146', '147', '147 3 Door', '147 5 Door', '155', '156', '159', '164', '166', '33', '75', '90', 'Alfasud', 'Alfetta', 'Arna', 'Brera', 'GT', 'GTV', 'Giulietta', 'Gold Cloverleaf', 'Mito', 'SZ', 'Spider', 'Sprint');
    model[2] = new Array( 'Rocsta');

    var curSel=obj.options[obj.selectedIndex].value ;
    var x;

    $('#replace').html("<select name=\"test\" id=\"sub\">");
    for (x in model[curSel])
    {
        $('#sub').append("<option>" + model[curSel][x] + "</option>");
    }   

}  

这样就可以了。 See here.

答案 1 :(得分:2)

$('#replace').append("</select>"); 

没有必要。实际上会创建另一个选择元素或只是错误。

在你的问题中,你将选项附加到div,而不是实际选择。我会像这样解决它。

function makeModel(obj){
    model = new Array();
    model[0] = new Array( '212', 'Ace', 'Aceca', 'Cobra', 'Superblower');
    model[1] = new Array( '145', '146', '147', '147 3 Door', '147 5 Door', '155', '156', '159', '164', '166', '33', '75', '90', 'Alfasud', 'Alfetta', 'Arna', 'Brera', 'GT', 'GTV', 'Giulietta', 'Gold Cloverleaf', 'Mito', 'SZ', 'Spider', 'Sprint');
    model[2] = new Array( 'Rocsta');

    var curSel=obj.options[obj.selectedIndex].value ;
    var x;

    var $replace = $('#replace');
    var $sel = $('<select name="test" id="sub">').appendTo($replace);
    $.each(model[curSel], function(i,v){
    {
        var $option = $("<option>" + v + "</option>");
        $sel.append($option);
    })
}

使用jQuery通常更好,而不是for in,就像原型已经扩展一样,你可以获得很多你不会想到的垃圾!