【问题标题】:Set select option 'selected', by value按值设置选择选项“已选择”
【发布时间】:2012-10-31 20:49:54
【问题描述】:

我有一个 select 字段,其中包含一些选项。现在我需要使用 jQuery 选择其中一个 options。但是当我只知道必须选择的option 中的value 时,我该怎么做呢?

我有以下 HTML:

<div class="id_100">
  <select>
    <option value="val1">Val 1</option>
    <option value="val2">Val 2</option>
    <option value="val3">Val 3</option>
  </select>
</div>

我需要选择值为val2 的选项。如何做到这一点?

这是一个演示页面: http://jsfiddle.net/9Stxb/

【问题讨论】:

    标签: jquery jquery-selectors html-select


    【解决方案1】:

    我需要选择一个选项,但两个选项可能具有相同的值。
    这纯粹是为了视觉(前端)差异。
    您可以像这样选择一个选项(即使 2 具有相同的值):

    let options = $('#id_100 option')
    options.prop('selected', false)   // Deselect all currently selected ones
    let option = $(options[0])        // Select option from the list
    option.prop('selected', true)
    option.parent().change()          // Find the <select> element and call the change() event.
    

    这会取消选择所有当前选择的&lt;option&gt; 元素。选择第一个(使用options[0])并使用change 事件更新&lt;select&gt; 元素。

    【讨论】:

      【解决方案2】:

      有一种更简单的方法,不需要你进入选项标签:

      $("div.id_100 select").val("val2");
      

      看看这个jQuery method

      注意:以上代码不会触发 change 事件。 为了完全兼容,您需要这样称呼它:

      $("div.id_100 select").val("val2").change();
      

      【讨论】:

      • 这可能会导致 FF 中的错误(至少)出现在空选择框中
      • 问题的海报开头是:“我有一个包含一些选项的选择字段......”所以它不是空的,因此解决方案仍然正确。
      • @JamesCazzetta 将数组发送到 val:.val(["Multiple2", "Multiple3"])api.jquery.com/val/#val-value
      • 我不得不手动调用 .val(x).change(); 来触发 select 的 onChange 事件,似乎设置 val() 不会触发它。
      • 注意:val() 可能会设置选项中不存在的值。
      【解决方案3】:

      这里有很多解决方案可以更改所选值,但没有一个对我有用,因为我的挑战与 OP 略有不同。我需要根据此值过滤另一个选择下拉列表。

      大多数人使用$("div.id_100").val("val2").change(); 让它为他们工作。我不得不将它稍微修改为$("div#idOfDiv select").val("val2").trigger("change")

      这也不够,我还必须确保等待文档加载。我的完整代码如下所示:

      $(document).ready(function() {
          $("div#idOfDiv select").val("val2").trigger("change");
      });
      

      我希望这可以帮助遇到同样挑战的人!

      【讨论】:

      • 我使用查询移动设备,需要使用触发器(“更改”)来更新 UI。谢谢
      【解决方案4】:

      您可以通过不同的方法实现此目的:
      (请记住,如果要操作一个元素,最好给它一个 id 或类,而不是让它的父元素一个 id 或类)。
      这里, 由于 div 有一个类来定位其中的选择,代码将是:

      $("div.id_100 select").val("val2");
      

      $('div.id_100  option[value="val2"]').prop("selected", true);
      

      如果该类被赋予选择自身,代码将是:

      $(".id_100").val("val2");
      

      $('.id_100 option[value=val2]').attr('selected','selected');
      

      $('.id_100 option')
          .removeAttr('selected')
          .filter('[value=val1]')
          .attr('selected', true);
      

      要动态传递值,代码将是:
      值="val2";

      $("div.id_100 select").val(valu);
      $("div.id_100 > select > option[value=" + valu + "]").prop("selected",true);
      

      如果元素是通过ajax添加的, 您必须为您的元素提供“id”并使用
      window.document.getElementById 别的 您必须为您的元素提供“类”并使用
      window.document.getElementById

      您还可以通过选择元素的索引号来选择它的值。
      如果您为您的选择元素提供了 ID,代码将为:

      window.document.getElementById('select_element').selectedIndex = 4;
      

      请记住,当您如上所述更改选择值时,不会调用更改方法。
      即,如果您编写了代码来更改选择,则上述方法将更改选择值但不会触发更改。
      要触发更改功能,您必须在最后添加 .change() 。 所以代码将是:

      $("#select_id").val("val2").change();
      

      【讨论】:

        【解决方案5】:

        对我有用

        $("#id_100").val("val2");
        

        【讨论】:

          【解决方案6】:

          当值是 ID 而文本是代码时,我遇到了一个问题。您无法使用代码设置值,但您无法直接访问 ID。

          var value;
          
          $("#selectorId > option").each(function () {
            if ("SOMECODE" === $(this).text()) {
              value = $(this).val();
            }
          });
          
          //Do work here
          

          【讨论】:

            【解决方案7】:

            当控件是动态创建而不是在静态 HTML 页面中时,选择下拉控件没有动态更改似乎存在问题。

            在 jQuery 中,这个解决方案对我有用。

            $('#editAddMake').val(result.data.make_id);
            $('#editAddMake').selectmenu('refresh');
            

            就像附录一样,第一行代码没有第二行,实际上确实透明地工作,在设置索引后检索所选索引是正确的,如果您实际单击控件,它将显示正确的项目,但这并没有'不反映在控件的顶部标签中。

            希望这会有所帮助。

            【讨论】:

              【解决方案8】:

              最好的方法是这样的:

              $(`#YourSelect option[value='${YourValue}']`).prop('selected', true);
              

              【讨论】:

              • 在 chrome 上,设置 $('&lt;select&gt;').val('asdf') 不会更新选择以显示当前选择的选项。这个答案解决了这个问题。
              • 虽然这也可以,但 $('
              【解决方案9】:

              没有理由过度考虑这一点,您所做的只是访问和设置属性。就是这样。

              好的,一些基本的 dom: 如果你是直接用 JavaScript 做的,你会这样:

              window.document.getElementById('my_stuff').selectedIndex = 4;
              

              但是你不是用直接的 JavaScript 来做的,你是用 jQuery 做的。而在 jQuery 中,你想使用 .prop() 函数来设置一个属性,所以你可以这样做:

              $("#my_stuff").prop('selectedIndex', 4);
              

              无论如何,只要确保您的 id 是唯一的。否则,您将一头撞在墙上,想知道为什么这不起作用。

              【讨论】:

                【解决方案10】:

                $('#graphtype option[value=""]').prop("selected", true);

                这在 #graphtype 是选择标签的 id 时效果很好。

                示例选择标签:

                 <select name="site" id="site" class="form-control" onchange="getgraph1(this.options[this.selectedIndex].value);">
                    <option value="" selected>Site</option> 
                    <option value="sitea">SiteA</option>
                    <option value="siteb">SiteB</option>
                  </select>
                

                【讨论】:

                  【解决方案11】:

                  是旧帖子,但这里有一个类似于 jQuery 插件的简单功能。

                      $.fn.selectOption = function(val){
                          this.val(val)
                          .find('option')
                          .removeAttr('selected')
                          .parent()
                          .find('option[value="'+ val +'"]')
                          .attr('selected', 'selected')
                          .parent()
                          .trigger('change');
                  
                          return this;
                      };
                  

                  你只需简单地做这样的事情:

                  $('.id_100').selectOption('val2');
                  

                  之所以使用它,是因为您将选定的语义更改为跨浏览器支持的 DOM,并且还会触发更改以使您可以捕获它。

                  基本上是人类动作模拟。

                  【讨论】:

                    【解决方案12】:

                    一个简单的答案是, 在html

                    <select name="ukuran" id="idUkuran">
                        <option value="1000">pilih ukuran</option>
                        <option value="11">M</option>
                        <option value="12">L</option>
                        <option value="13">XL</option>
                    </select>
                    

                    在 jquery 上,通过按钮或其他方式调用下面的函数

                    $('#idUkuran').val(11).change();
                    

                    它简单且 100% 有效,因为它取自我的工作...... :) 希望它的帮助..

                    【讨论】:

                    • 你的默认值是1000?为什么不“”
                    • 这是一个可选的,你可以根据需要修改.. :)
                    【解决方案13】:

                    试试这个。 简单而有效的 javaScript + jQuery 致命组合。

                    选择组件:

                    <select id="YourSelectComponentID">
                                <option value="0">Apple</option>
                                <option value="2">Banana</option>
                                <option value="3">Cat</option>
                                <option value="4">Dolphin</option>
                    </select>
                    

                    选择:

                    document.getElementById("YourSelectComponentID").value = 4;
                    

                    现在您的选项 4 将被选中。您可以这样做,默认选择启动时的值。

                    $(function(){
                       document.getElementById("YourSelectComponentID").value = 4;
                    });
                    

                    或创建一个简单的函数,将行放入其中并在 anyEvent 上调用该函数以选择选项

                    jQuery + javaScript 的混合创造了魔力......

                    【讨论】:

                      【解决方案14】:

                      我认为最简单的方法是选择设置 val(),但您可以检查以下内容。有关选项的更多详细信息,请参阅 How to handle select and option tag in jQuery?

                      $('div.id_100  option[value="val2"]').prop("selected", true);
                      
                      $('id_100').val('val2');
                      

                      未优化,但以下逻辑在某些情况下也有用。

                      $('.id_100 option').each(function() {
                          if($(this).val() == 'val2') {
                              $(this).prop("selected", true);
                          }
                      });
                      

                      【讨论】:

                      • 我更喜欢这种方法而不是直接设置 val()。我也喜欢设置属性 - 有助于调试。 $(this).attr("selected","selected")
                      【解决方案15】:

                      设置选择值后最好使用change()

                      $("div.id_100 select").val("val2").change();
                      

                      通过这样做,代码将接近更改用户选择,解释包含在JS Fiddle中:

                      JS Fiddle

                      【讨论】:

                      • 这是为什么?你能解释一下吗?
                      • JS Fiddle。使用 change() 方法,代码将接近于用户更改选择,同时需要处理更改监听器。
                      【解决方案16】:

                      .attr() 有时在旧 jQuery 版本中不起作用,但您可以使用 .prop()

                      $('select#ddlCountry option').each(function () {
                          if ($(this).text().toLowerCase() == co.toLowerCase()) {
                              $(this).prop('selected','selected');
                              return;
                          }
                      });
                      

                      【讨论】:

                        【解决方案17】:

                        选择值后使用change() 事件。来自文档:

                        如果字段在内容未更改的情况下失去焦点,则不会触发事件。要手动触发事件,请使用不带参数的 .change()

                        $("#select_id").val("val2").change();
                        

                        更多信息请访问 .change()

                        【讨论】:

                        • 这值得更多的支持并且属于顶部。这是正确的方法,不要摆弄propattr等,并正确传播所有事件。
                        • 是的,这会正确传播所有事件。在我的测试中,“attr”第一次工作,然后一切都保持“选中”。我使用了“prop”,它正确地改变了一切,但没有传播诸如(显示/隐藏)其他字段之类的事件。这个答案在所有情况下都有效,应该被认为是正确的。
                        • 如果你已经有一个监听器必须改变这将导致一个无限循环。
                        • 挣扎了一段时间,试图让我愚蠢的下拉列表值改变,这个解决方案是唯一有效的!谢谢哥们!
                        • 谢谢。在找到此建议之前,我进行了很多搜索,这是唯一有效的方法。不知道为什么它不在顶部。
                        【解决方案18】:

                        对我来说,以下工作完成了

                        $("div.id_100").val("val2").change();
                        

                        【讨论】:

                          【解决方案19】:

                          选择值为“val2”的选项:

                          $('.id_100 option[value=val2]').attr('selected','selected');
                          

                          【讨论】:

                          • 如果所需的值可能是也可能不是一个选项,这是最好的解决方案,如果它不是一个选项,您不想进行更改。如果您在选择上使用.val() 并尝试选择一个不存在的值,它将取消选择所有内容。
                          • 另外,我使用了 $("select[name=foo] option[value=bar]).attr('selected','selected');,它也适用于我测试的所有浏览器。
                          • 我比接受的答案更喜欢这个答案,因为:element.outerHTML 会用这个更新,而接受的答案不会。
                          • 值得注意的是,如果选择下拉菜单被隐藏,这将不起作用,所以在我的情况下,我使用的是 select boxit 插件,但试图触发选择框更改,所以原始代码与 onchange 处理程序for 下拉菜单仍将运行。只需更新新元素的代码,即 selectboxit 元素
                          • 如果上述方法不适合您,请使用change(),如$("div.id_100 select").val("val2")-&gt;change();
                          【解决方案20】:

                          用途:

                          $("div.id_100 > select > option[value=" + value + "]").attr("selected",true);
                          

                          这对我有用。我正在使用此代码来解析fancybox 更新表单中的值,而我来自 app.js 的完整来源是:

                          jQuery(".fancybox-btn-upd").click(function(){
                              var ebid = jQuery(this).val();
                          
                              jQuery.ajax({
                                  type: "POST",
                                  url: js_base_url+"manajemen_cms/get_ebook_data",
                                  data: {ebookid:ebid},
                                  success: function(transport){
                                      var re = jQuery.parseJSON(transport);
                                      jQuery("#upd-kategori option[value="+re['kategori']+"]").attr('selected',true);
                                      document.getElementById("upd-nama").setAttribute('value',re['judul']);
                                      document.getElementById("upd-penerbit").setAttribute('value',re['penerbit']);
                                      document.getElementById("upd-tahun").setAttribute('value',re['terbit']);
                                      document.getElementById("upd-halaman").setAttribute('value',re['halaman']);
                                      document.getElementById("upd-bahasa").setAttribute('value',re['bahasa']);
                          
                                      var content = jQuery("#fancybox-form-upd").html();
                                      jQuery.fancybox({
                                          type: 'ajax',
                                          prevEffect: 'none',
                                          nextEffect: 'none',
                                          closeBtn: true,
                                          content: content,
                                          helpers: {
                                              title: {
                                                  type: 'inside'
                                              }
                                          }
                                      });
                                  }
                              });
                          });
                          

                          而我的 PHP 代码是:

                          function get_ebook_data()
                          {
                              $ebkid = $this->input->post('ebookid');
                              $rs = $this->mod_manajemen->get_ebook_detail($ebkid);
                              $hasil['id'] = $ebkid;
                              foreach ($rs as $row) {
                                  $hasil['judul'] = $row->ebook_judul;
                                  $hasil['kategori'] = $row->ebook_cat_id;
                                  $hasil['penerbit'] = $row->ebook_penerbit;
                                  $hasil['terbit'] = $row->ebook_terbit;
                                  $hasil['halaman'] = $row->ebook_halaman;
                                  $hasil['bahasa'] = $row->ebook_bahasa;
                                  $hasil['format'] = $row->ebook_format;
                              }
                              $this->output->set_output(json_encode($hasil));
                          }
                          

                          【讨论】:

                            【解决方案21】:

                            这肯定适用于选择控件

                            $('select#ddlCountry option').each(function () {
                            if ($(this).text().toLowerCase() == co.toLowerCase()) {
                                this.selected = true;
                                return;
                            } });
                            

                            【讨论】:

                              【解决方案22】:

                              最简单的方法是:

                              HTML

                              <select name="dept">
                                 <option value="">Which department does this doctor belong to?</option>
                                 <option value="1">Orthopaedics</option>
                                 <option value="2">Pathology</option>
                                 <option value="3">ENT</option>
                              </select>
                              

                              jQuery

                              $('select[name="dept"]').val('3');
                              

                              输出:这将激活 ENT

                              【讨论】:

                                【解决方案23】:

                                您可以使用属性选择器[attributename=optionalvalue] 选择任何属性及其值,因此在您的情况下,您可以选择选项并设置所选属性。

                                $("div.id_100 > select > option[value=" + value + "]").prop("selected",true);
                                

                                value 是您希望选择的值。

                                如果您需要删除任何先前选择的值,就像多次使用的情况一样,您需要稍微更改它以便首先删除选定的属性

                                $("div.id_100 option:selected").prop("selected",false);
                                $("div.id_100 option[value=" + value + "]")
                                        .prop("selected",true);
                                

                                【讨论】:

                                  【解决方案24】:

                                  首先取消全选并过滤可选选项:

                                  $('.id_100 option')
                                       .removeAttr('selected')
                                       .filter('[value=val1]')
                                           .attr('selected', true)
                                  

                                  【讨论】:

                                  • 所选属性的值可以是空字符串或selected。你的意思是.prop()
                                  • 好答案。被接受的答案以空选择结束,当值不存在时选择。 span>
                                  • TO THE TOP,这里是最好的。为了将来的使用,我认为我们应该使用 prop 而不是 attr。
                                  • 我非常喜欢这个解决方案。我想知道如果选择器更改为“.id_100 > option”,在性能方面是否会更好
                                  • 就我而言,我不得不使用 .prop('selected', true);而不是 .attr('selected', true);而且我不得不触发 select.change() 事件,因为它不是自动触发的。
                                  【解决方案25】:
                                  var opt = new Option(name, id);
                                  $("#selectboxName").append(opt);
                                  opt.setAttribute("selected","selected");
                                  

                                  【讨论】:

                                    【解决方案26】:
                                    <select name="contribution_status_id" id="contribution_status_id" class="form-select">
                                        <option value="1">Completed</option>
                                        <option value="2">Pending</option>
                                        <option value="3">Cancelled</option>
                                        <option value="4">Failed</option>
                                        <option value="5">In Progress</option>
                                        <option value="6">Overdue</option>
                                        <option value="7">Refunded</option>
                                    

                                    按值设置为待处理状态

                                       $('#contribution_status_id').val("2");
                                    

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 2021-03-08
                                      • 2011-04-03
                                      • 1970-01-01
                                      • 2015-08-27
                                      • 2011-10-27
                                      • 2015-05-30
                                      • 1970-01-01
                                      • 2013-07-11
                                      相关资源
                                      最近更新 更多