【问题标题】:How do I programmatically set the value of a select box element using JavaScript?如何使用 JavaScript 以编程方式设置选择框元素的值?
【发布时间】:2019-06-24 17:32:10
【问题描述】:

我有以下 HTML <select> 元素:

<select id="leaveCode" name="leaveCode">
  <option value="10">Annual Leave</option>
  <option value="11">Medical Leave</option>
  <option value="14">Long Service</option>
  <option value="17">Leave Without Pay</option>
</select>

使用带有leaveCode 数字作为参数的JavaScript 函数,如何在列表中选择适当的选项?

【问题讨论】:

  • 查看我的答案以比较不同方法的性能

标签: javascript html dom


【解决方案1】:

你可以使用这个功能:

selectElement('leaveCode', '11')

function selectElement(id, valueToSelect) {    
    let element = document.getElementById(id);
    element.value = valueToSelect;
}

【讨论】:

  • 很好的答案,这比遍历选项要容易得多。它符合标准:dev.w3.org/html5/spec/…。如果有浏览器不兼容(当然有:) 我很想知道它们是什么。这就是你通常指望 ppk 的那种东西,但他顽固地拒绝出现在我搜索这个主题的时候。
  • 那么多选呢?如果有多个选项(至少在 Chrome 25 中),这似乎不起作用。
  • 正如@ring0 所指出的,当 valueToSelect 不存在时,它会在 chrome 中插入一个空白条目。而 IE 和 firefox 保留最后选择的值。
  • IE 的注意事项: 中的显示文本用作 valueToSelect
  • 如果你需要触发 change 事件,你也应该这样做:element.dispatchEvent(new Event('change'));
【解决方案2】:

不回答问题,但您也可以按索引选择,其中 i 是您要选择的项目的索引:

var formObj = document.getElementById('myForm');
formObj.leaveCode[i].selected = true;

您还可以循环显示项目以通过循环显示值进行选择:

for (var i = 0, len < formObj.leaveCode.length; i < len; i++) 
    if (formObj.leaveCode[i].value == 'xxx') formObj.leaveCode[i].selected = true;

【讨论】:

  • 不应该形成Obj.leaveCode[i].selected = true;是 formObj.options[i].selected = true; ?
【解决方案3】:

恐怕我目前无法对此进行测试,但在过去,我相信我必须给每个选项标签一个 ID,然后我做了类似的事情:

document.getElementById("optionID").select();

如果这不起作用,也许它会让你更接近解决方案:P

【讨论】:

  • HTMLOptionElement 没有 select() 方法(它没有在所有 HTML 元素的标准集上定义任何其他方法)。但是,您可以将 selected 属性设置为 true。
【解决方案4】:
function foo(value) { var e = document.getElementById('leaveCode'); if(e) e.value = value; }

【讨论】:

    【解决方案5】:
    document.getElementById('leaveCode').value = '10';
    

    这应该将选择设置为“年假”

    【讨论】:

      【解决方案6】:

      应该是这样的:

      function setValue(inVal){
      var dl = document.getElementById('leaveCode');
      var el =0;
      for (var i=0; i<dl.options.length; i++){
        if (dl.options[i].value == inVal){
          el=i;
          break;
        }
      }
      dl.selectedIndex = el;
      }
      

      【讨论】:

        【解决方案7】:

        为什么不为元素的 Id 添加一个变量并使其成为可重用的函数?

        function SelectElement(selectElementId, valueToSelect)
        {    
            var element = document.getElementById(selectElementId);
            element.value = valueToSelect;
        }
        

        【讨论】:

          【解决方案8】:

          假设您的表单名为 form1

          function selectValue(val)
          {
            var lc = document.form1.leaveCode;
            for (i=0; i&lt;lc.length; i++)
            {
              if (lc.options[i].value == val)
              {
                  lc.selectedIndex = i;
                  return;
              }
            }
          }
          

          【讨论】:

            【解决方案9】:
            function setSelectValue (id, val) {
                document.getElementById(id).value = val;
            }
            setSelectValue('leaveCode', 14);
            

            【讨论】:

              【解决方案10】:

              如果你使用 jQuery,你也可以这样做:

              $('#leaveCode').val('14');
              

              这将选择值为 14 的 &lt;option&gt;


              使用纯 Javascript,这也可以通过两个 Document methods 来实现:

              • 使用document.querySelector,您可以根据 CSS 选择器选择元素:

                document.querySelector('#leaveCode').value = '14'
                
              • document.getElementById() 使用更成熟的方法,正如函数名称所暗示的那样,您可以根据其id 选择一个元素:

                document.getElementById('leaveCode').value = '14'
                

              您可以运行以下代码片段来查看这些方法和 jQuery 函数的实际作用:

              const jQueryFunction = () => {
                
                $('#leaveCode').val('14'); 
                
              }
              
              const querySelectorFunction = () => {
                
                document.querySelector('#leaveCode').value = '14' 
                
              }
              
              const getElementByIdFunction = () => {
                
                document.getElementById('leaveCode').value='14' 
                
              }
              input {
                display:block;
                margin: 10px;
                padding: 10px
              }
              <select id="leaveCode" name="leaveCode">
                <option value="10">Annual Leave</option>
                <option value="11">Medical Leave</option>
                <option value="14">Long Service</option>
                <option value="17">Leave Without Pay</option>
              </select>
              
              <input type="button" value="$('#leaveCode').val('14');" onclick="jQueryFunction()" />
              <input type="button" value="document.querySelector('#leaveCode').value = '14'" onclick="querySelectorFunction()" />
              <input type="button" value="document.getElementById('leaveCode').value = '14'" onclick="getElementByIdFunction()" />
              
              <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

              【讨论】:

              • 这个也可以用于多选;只需将字符串数组而不是单个字符串传递给“val”函数。见:stackoverflow.com/a/16583001/88409
              • 有没有办法同时触发 $('#leaveCode').on('change', function() 这样做?
              • $("#leaveCode").val("14").change();
              【解决方案11】:

              如果您需要,最简单的方法是:
              1) 单击定义选择选项的按钮
              2)转到另一个页面,其中选择选项是
              3) 在另一个页面上选择该选项值

              1)您的按钮链接(例如,在主页上)

              <a onclick="location.href='contact.php?option=1';" style="cursor:pointer;">Sales</a>
              <a onclick="location.href='contact.php?option=2';" style="cursor:pointer;">IT</a>
              

              (其中 contact.php 是您的带有选择选项的页面。请注意页面 url 有 ?option=1 或 2)

              2) 将此代码放在您的第二页(我的情况 contact.php

              <?
              if (isset($_GET['option']) && $_GET['option'] != "") {
              $pg = $_GET['option'];              
              } ?>
              

              3)根据点击的按钮选择选项值

              <select>
              <option value="Sales" <? if ($pg == '1') { echo "selected"; } ?> >Sales</option>
              <option value="IT" <? if ($pg == '2') { echo "selected"; } ?> >IT</option>
              </select>
              

              ..等等。
              因此,这是一种通过 url 中的 GET 将值传递到另一个页面(带有选择选项列表)的简单方法。没有表格,没有 ID.. 只需 3 步即可完美运行。

              【讨论】:

                【解决方案12】:

                我比较了不同的方法:

                Comparison of the different ways on how to set a value of a select with JS or jQuery

                代码:

                $(function() {
                    var oldT = new Date().getTime();
                     var element = document.getElementById('myId');
                    element.value = 4;
                    console.error(new Date().getTime() - oldT);
                
                    oldT = new Date().getTime();
                    $("#myId option").filter(function() {
                        return $(this).attr('value') == 4;
                    }).attr('selected', true);
                    console.error(new Date().getTime() - oldT);
                
                    oldT = new Date().getTime();
                    $("#myId").val("4");
                    console.error(new Date().getTime() - oldT);
                });
                

                约 4000 个元素的选择输出:

                • 1 毫秒
                • 58 毫秒
                • 612 毫秒

                使用 Firefox 10。注意:我做这个测试的唯一原因是因为 jQuery 在我们的列表中表现非常糟糕,有大约 2000 个条目(它们在选项之间有更长的文本)。 在 val() 之后我们有大约 2 秒的延迟

                请注意:我根据实际值设置值,而不是文本值。

                【讨论】:

                  【解决方案13】:

                  如果使用 PHP,你可以试试这样的:

                  $value = '11';
                  $first = '';
                  $second = '';
                  $third = '';
                  $fourth = '';
                  
                  switch($value) {
                              case '10' :
                                  $first = 'selected';
                              break;
                              case '11' :
                                  $second = 'selected';
                              break;
                              case '14' :
                                  $third = 'selected';
                              break;
                              case '17' :
                                  $fourth = 'selected';
                              break;
                          }
                  
                  echo'
                  <select id="leaveCode" name="leaveCode">
                    <option value="10" '. $first .'>Annual Leave</option>
                    <option value="11" '. $second .'>Medical Leave</option>
                    <option value="14" '. $third .'>Long Service</option>
                    <option value="17" '. $fourth .'>Leave Without Pay</option>
                  </select>';
                  

                  【讨论】:

                  • 这是一个 JavaScript 问题,不是 PHP/HTML 问题
                  【解决方案14】:

                  我尝试了以上基于 JavaScript/jQuery 的解决方案,例如:

                  $("#leaveCode").val("14");
                  

                  var leaveCode = document.querySelector('#leaveCode');
                  leaveCode[i].selected = true;
                  

                  在一个 AngularJS 应用程序中,其中有一个 必需

                  它们都不起作用,因为没有触发 AngularJS 表单验证。尽管选择了正确的选项(并显示在表单中),但输入仍然无效(ng-pristineng-invalid 类仍然存在)。

                  要强制 AngularJS 验证,请在选择一个选项后调用 jQuery change()

                  $("#leaveCode").val("14").change();
                  

                  var leaveCode = document.querySelector('#leaveCode');
                  leaveCode[i].selected = true;
                  $(leaveCode).change();
                  

                  【讨论】:

                  • 既然已经可以使用 Angular 来实现,为什么还要使用 jQuery 呢?使用 Angular 本身时,您是否无法设置值,并内置支持触发更改(不知道,我使用 React,在 5 秒 google 后才发现这篇文章:stackoverflow.com/questions/50302062/…)?因为这意味着您不必使用额外的 ±30kb 库“只为这个”来破解 Angular :)
                  【解决方案15】:

                  你很可能想要这个:

                  $("._statusDDL").val('2');
                  

                  $('select').prop('selectedIndex', 3); 
                  

                  【讨论】:

                  • 这是假设 OP 正在使用 JQuery
                  • @BarryMichaelDoyle,这不是,因为甚至问题的标题都以using JavaScript 结尾。
                  【解决方案16】:

                  这里提到的大部分代码都不适合我!

                  终于成功了

                  window.addEventListener 很重要,否则,您的 JS 代码将在选项中获取值之前运行

                      window.addEventListener("load", function () {
                              // Selecting Element with ID - leaveCode  //
                              var formObj = document.getElementById('leaveCode');
                  
                              // Setting option as selected
                              let len;
                              for (let i = 0, len = formObj.length; i < len; i++){
                                  if (formObj[i].value == '<value to show in Select>') 
                                   formObj.options[i].selected = true;
                              }
                      });
                  

                  希望,这会有所帮助!

                  【讨论】:

                    【解决方案17】:

                    最短的

                    这是William answer的大小改进

                    leaveCode.value = '14';
                    

                    leaveCode.value = '14';
                    <select id="leaveCode" name="leaveCode">
                      <option value="10">Annual Leave</option>
                      <option value="11">Medical Leave</option>
                      <option value="14">Long Service</option>
                      <option value="17">Leave Without Pay</option>
                    </select>

                    【讨论】:

                    • 这不应该使用 jquery 选择器什么的吗?或者我今天早上只是慢了,可以简单地在 js 中调用 some_id.value?
                    • 这应该是公认的答案!
                    猜你喜欢
                    • 1970-01-01
                    • 2015-12-24
                    • 2010-09-12
                    • 1970-01-01
                    • 2021-11-30
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-01-02
                    相关资源
                    最近更新 更多