Javascript选择多个选项

IT技术 javascript forms html-select options
2021-02-22 23:43:07

我有一个带有允许多个选项的选择框的表单。用户保存这些选项后,将它们存储在数据库表中。

然后我可以读取这个数据库表以获取他们再次选择的选项。我需要能够从数据库中获取这些数据,将其放入一个数组中,然后在他们转到“编辑”选项时预先选择该选择框中的选项。

将数据读入数组很好,我知道如何在选择框中选择单个选项,但是我不确定如何处理在 javascript 中选择的多个选项。

有人可以帮我找出执行此操作所需的 javascript 吗?

5个回答

一个纯javascript解决方案

<select id="choice" multiple="multiple">
  <option value="1">One</option>
  <option value="2">two</option>
  <option value="3">three</option>
</select>
<script type="text/javascript">

var optionsToSelect = ['One', 'three'];
var select = document.getElementById( 'choice' );

for ( var i = 0, l = select.options.length, o; i < l; i++ )
{
  o = select.options[i];
  if ( optionsToSelect.indexOf( o.text ) != -1 )
  {
    o.selected = true;
  }
}

</script>

虽然我同意这应该在服务器端完成。

值得注意的Array.prototoype.indexOf是,直到版本 9 才在 IE 中可用。
2021-04-21 23:43:07
这很接近,但是存储的值不是选项的“索引”,它们是选项的值。
2021-04-23 23:43:07
嗨,你能解释一下你的循环吗?我不太明白
2021-05-03 23:43:07
你能发布一个jsfiddle吗,我想我也这样做,但它不起作用
2021-05-06 23:43:07
非常感谢。我会将它与 o.value 而不是 o.text 一起使用,但效果很好
2021-05-12 23:43:07

这种类型的事情应该在服务器端完成,以限制客户端为此类琐碎任务使用的资源量。话虽如此,如果您要在前端执行此操作,我建议您考虑使用underscore.js 之类的内容来保持代码简洁明了:

var values = ["Red", "Green"],
    colors = document.getElementById("colors");

_.each(colors.options, function (option) {
    option.selected = ~_.indexOf(values, option.text);
});

如果您使用 jQuery,它可能会更简洁:

var values = ["Red", "Green"];

$("#colors option").prop("selected", function () {
    return ~$.inArray(this.text, values);
});

如果您在没有 underscore.js 或 jQuery 之类的工具的情况下执行此操作,您将需要编写更多内容,并且可能会发现它有点复杂:

var color, i, j,
    values = ["Red", "Green"],
    options = document.getElementById("colors").options;

for ( i = 0; i < values.length; i++ ) {
    for ( j = 0, color = values[i]; j < options.length; j++ ) {
        options[j].selected = options[j].selected || color === options[j].text;
    }
}
在服务器端执行它更有意义,并且您最终仍会为客户端代码生成一个数组服务器端。
2021-04-28 23:43:07
服务器端确实更有意义,但我不想重做已经完成的所有事情。以前的开发人员使用了所有 javascript,所以我将坚持使用它。
2021-05-06 23:43:07
我已经有了选择表单,我正在寻找更多自动选择的 javascript 解决方案。表单的每个其他部分都使用 javascript,我只是不确定如何使用 javascript 代码选择多个选项。
2021-05-10 23:43:07
@ChrisMoschini 这个答案已经有很多年了,但我很高兴再次将它带到表面,这样我就可以刷新它的内容。不错的解决方案,虽然你可以让它更短:) 请参阅我上面的答案。
2021-05-17 23:43:07
这里的 JS 可以简化,但有一个错误 - HTML 值大写,而所选变量不是,这意味着此代码不会选择任何内容。固定版本:jsfiddle.net/b9chris/RZT72
2021-05-20 23:43:07
<script language="JavaScript" type="text/javascript">
<!--
function loopSelected()
{
  var txtSelectedValuesObj = document.getElementById('txtSelectedValues');
  var selectedArray = new Array();
  var selObj = document.getElementById('selSeaShells');
  var i;
  var count = 0;
  for (i=0; i<selObj.options.length; i++) {
    if (selObj.options[i].selected) {
      selectedArray[count] = selObj.options[i].value;
      count++;
    }
  }
  txtSelectedValuesObj.value = selectedArray;
}
function openInNewWindow(frm)
{
  // open a blank window
  var aWindow = window.open('', 'Tutorial004NewWindow',
   'scrollbars=yes,menubar=yes,resizable=yes,toolbar=no,width=400,height=400');

  // set the target to the blank window
  frm.target = 'Tutorial004NewWindow';

  // submit
  frm.submit();
}
//-->
</script>
The HTML
<form action="tutorial004_nw.html" method="get">
  <table border="1" cellpadding="10" cellspacing="0">
  <tr>
    <td valign="top">
      <input type="button" value="Submit" onclick="openInNewWindow(this.form);" />
      <input type="button" value="Loop Selected" onclick="loopSelected();" />
      <br />
      <select name="selSea" id="selSeaShells" size="5" multiple="multiple">
        <option value="val0" selected>sea zero</option>
        <option value="val1">sea one</option>
        <option value="val2">sea two</option>
        <option value="val3">sea three</option>
        <option value="val4">sea four</option>
      </select>
    </td>
    <td valign="top">
      <input type="text" id="txtSelectedValues" />
      selected array
    </td>
  </tr>
  </table>
</form>

根据@Peter Baley 的回答,我创建了一个更通用的函数:

   @objectId: HTML object ID
   @values: can be a string or an array. String is less "secure" (should not contain repeated value).
   function checkMultiValues(objectId, values){
        selectMultiObject=document.getElementById(objectId);
        for ( var i = 0, l = selectMultiObject.options.length, o; i < l; i++ )
        {
          o = selectMultiObject.options[i];
          if ( values.indexOf( o.value ) != -1 )
          {
            o.selected = true;
          } else {
            o.selected = false;
          }
        }
    }

例子: checkMultiValues('thisMultiHTMLObject','a,b,c,d');

o.selected = (values.indexOf (o.value) != -1)将使if-block 过时。
2021-05-11 23:43:07

您可以通过转到document.getElementById("cars").options“cars”是选择对象的位置来访问所选对象的选项数组

一旦你有了它,你就可以打电话option[i].setAttribute('selected', 'selected');来选择一个选项。

我同意其他人的看法,尽管您最好做这个服务器端。