添加选项以使用javascript选择


161

我希望这个javascript在id =“ mainSelect”的选择中创建12到100个选项,因为我不想手动创建所有选项标签。你能给我一些指导吗?谢谢

function selectOptionCreate() {

  var age = 88;
  line = "";
  for (var i = 0; i < 90; i++) {
    line += "<option>";
    line += age + i;
    line += "</option>";
  }

  return line;
}


14
投票要重新打开,因为链接的“重复项”仅具有基于jQuery的答案,而此答案需要(或至少意味着要求)纯JavaScript。
大卫说恢复莫妮卡(Monica)

3
伟大的答案在这里mySelect.options[mySelect.options.length] = new Option('Text 1', 'Value1');
鲁芬2015年

Answers:


254

您可以通过一个简单的for循环来实现:

var min = 12,
    max = 100,
    select = document.getElementById('selectElementId');

for (var i = min; i<=max; i++){
    var opt = document.createElement('option');
    opt.value = i;
    opt.innerHTML = i;
    select.appendChild(opt);
}

JS Fiddle演示

JS Perf比较了我和Sime Vidas的答案,是因为我认为他的看上去比我的理解/直观得多,而且我想知道这将如何转化为实现。根据Chromium 14 / Ubuntu 11.04的说法,其速度要快一些,但其他浏览器/平台的结果可能会有所不同。


根据OP的评论进行了编辑

[如何]将[I]应用于多个元素?

function populateSelect(target, min, max){
    if (!target){
        return false;
    }
    else {
        var min = min || 0,
            max = max || min + 100;

        select = document.getElementById(target);

        for (var i = min; i<=max; i++){
            var opt = document.createElement('option');
            opt.value = i;
            opt.innerHTML = i;
            select.appendChild(opt);
        }
    }
}
// calling the function with all three values:
populateSelect('selectElementId',12,100);

// calling the function with only the 'id' ('min' and 'max' are set to defaults):
populateSelect('anotherSelect');

// calling the function with the 'id' and the 'min' (the 'max' is set to default):
populateSelect('moreSelects', 50);

JS Fiddle演示

最后,(经过相当长的延迟之后),一种方法扩展了原型,HTMLSelectElement以便将populate()函数作为一种方法链接到DOM节点:

HTMLSelectElement.prototype.populate = function (opts) {
    var settings = {};

    settings.min = 0;
    settings.max = settings.min + 100;

    for (var userOpt in opts) {
        if (opts.hasOwnProperty(userOpt)) {
            settings[userOpt] = opts[userOpt];
        }
    }

    for (var i = settings.min; i <= settings.max; i++) {
        this.appendChild(new Option(i, i));
    }
};

document.getElementById('selectElementId').populate({
    'min': 12,
    'max': 40
});

JS Fiddle演示

参考文献:


@杰克:同意,我在后者的编辑中使用了这种方法:)
大卫说恢复莫妮卡

同样,扩展主机原型(在诱人的同时)也被认为是一个坏主意
RobG '16

我认为应该对此进行更新以使用,innerText而不是innerHTML避免跨站点脚本漏洞。您如何看待@DavidThomas?
Abhi Beckert

20

干得好:

for ( i = 12; i <= 100; i += 1 ) {
    option = document.createElement( 'option' );
    option.value = option.text = i;
    select.add( option );
}

现场演示: http //jsfiddle.net/mwPb5/


更新:由于您想重用此代码,因此它的功能如下:

function initDropdownList( id, min, max ) {
    var select, i, option;

    select = document.getElementById( id );
    for ( i = min; i <= max; i += 1 ) {
        option = document.createElement( 'option' );
        option.value = option.text = i;
        select.add( option );
    }
}

用法:

initDropdownList( 'mainSelect', 12, 100 );

现场演示: http //jsfiddle.net/mwPb5/1/


如何将其应用于多个元素?
jacktheripper 2011年

9

最简洁直观的方法是:

var selectElement = document.getElementById('ageselect');

for (var age = 12; age <= 100; age++) {
  selectElement.add(new Option(age));
}
Your age: <select id="ageselect"><option value="">Please select</option></select>

您还可以区分名称和值,或者在列表的开头添加项,并为使用的函数添加其他参数:
HTMLSelectElement.add(item [,before]);
新的选项(文本,值,defaultSelected,选中);


8

我不建议在循环内进行DOM操作-这在大型数据集中可能会变得昂贵。相反,我会做这样的事情:

var elMainSelect = document.getElementById('mainSelect');

function selectOptionsCreate() {
  var frag = document.createDocumentFragment(),
    elOption;
  for (var i=12; i<101; ++i) {
    elOption = frag.appendChild(document.createElement('option'));
    elOption.text = i;
  }
  elMainSelect.appendChild(frag);
}

您可以在MDN上阅读有关DocumentFragment的更多信息,但这是要点:

它用作Document的轻量级版本,就像标准文档一样,存储由节点组成的文档结构的一部分。关键区别在于,由于文档片段不是实际DOM结构的一部分,因此对该片段所做的更改不会影响文档,不会导致重排或在进行更改时对性能产生任何影响。


4

我要避免的一件事是在循环中执行DOM操作,以避免重复重新呈现页面。

var firstSelect = document.getElementById('first select elements id'),
    secondSelect = document.getElementById('second select elements id'),
    optionsHTML = [],
    i = 12;

for (; i < 100; i += 1) {
  optionsHTML.push("<option value=\"Age" + i + "\">Age" + i + "</option>";
}

firstSelect.innerHTML = optionsHTML.join('\n');
secondSelect.innerHTML = optionsHTML.join('\n');

编辑:删除了该函数,以显示如何将已构建的html分配给另一个select元素-从而通过重复该函数调用来避免不必要的循环。


如何将其应用于多个元素?
jacktheripper 2011年

不确定我是否要遵循-您要将相同的选项添加到多个选择元素中吗?
kinakuta 2011年

是的,我要选择具有相同选项的盒子
jacktheripper

我将其分解为一个函数,您可以调用该函数,只需在其中传递要向其附加选项的select元素的ID。
kinakuta 2011年

2
这就是documentFragment的用途。您可以轻松地修改接受的答案,以便首先将选项附加到documentFragment,以防止出现多个渲染。
Sam Braslavskiy 2014年


1

创建新Option对象时,有两个参数要传递:第一个是要显示在列表中的文本,第二个是要分配给该选项的值。

var myNewOption = new Option("TheText", "TheValue");

然后,您只需将此Option对象分配给一个空数组元素,例如:

document.theForm.theSelectObject.options[0] = myNewOption;


0

通常,您会拥有一系列相关记录,我发现用select这种方式填充起来很容易且相当声明:

selectEl.innerHTML = array.map(c => '<option value="'+c.id+'">'+c.name+'</option>').join('');

这将替换现有选项。
您可以selectEl.insertAdjacentHTML('afterbegin', str);用来将它们添加到顶部。
selectEl.insertAdjacentHTML('beforeend', str);将它们添加到列表的底部。

IE11兼容语法:

array.map(function (c) { return '<option value="'+c.id+'">'+c.name+'</option>'; }).join('');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.