【问题标题】:JavaScript/jQuery 2 dropdown menus with the same select option on page loadJavaScript/jQuery 2 下拉菜单在页面加载时具有相同的选择选项
【发布时间】:2023-03-16 06:00:01
【问题描述】:

我有 2 个下拉菜单,它们在页面加载时应该具有相同的值。它们用于根据选择的车辆过滤 WooCommerce 网站上的产品。 首先,用户选择车辆品牌、型号和系列。然后,当搜索显示结果时,我需要将选择的系列选项复制到第二个下拉列表,该下拉列表由搜索和过滤插件(在文档加载时)创建,以便过滤器显示的结果与系列相关。

$(document).on('ready', 'select[name="year_id"]', function() {
    $('select[name="_sft_product_make[]"]').text($(this).text());
})
<select name="year_id">
    <option value="">Series</option>
    <option value="379">WH/WK (2005 - 2010)</option>
    <option value="378">WJ (1999 - 2004)</option>
    <option value="380">WK2 (2011 - 2013)</option>
    <option value="1463">WK2 (2014 - 2016)</option>
    <option value="381">ZJ (1993 - 1998)</option>
</select>
          
<select name="_sft_product_make[]" class="sf-input-select" title="">
    <option class="sf-level-0 sf-item-379" data-sf-count="2" data-sf-depth="0" value="whwk-2005-2010">WH/WK (2005 – 2010)</option>
    <option class="sf-level-0 sf-item-378" data-sf-count="5" data-sf-depth="0" value="wgwj-1999-2005">WJ (1999 – 2004)</option>
    <option class="sf-level-0 sf-item-380" data-sf-count="5" data-sf-depth="0" value="wk2-2010-2015">WK2 (2011 – 2013)</option>
    <option class="sf-level-0 sf-item-1463" data-sf-count="6" data-sf-depth="0" value="wk2-2014-2016">WK2 (2014 – 2016)</option>
    <option class="sf-level-0 sf-item-381" data-sf-count="3" data-sf-depth="0" value="zj-1993-1998">ZJ (1993 – 1998)</option>
</select>

_sft_product_make[] 列出了所有车辆制造商/型号/系列,所以我只需要从year_id 中选择选项,以便在文件加载时自动选择_sft_product_make[] 中的正确选项。

我的问题是两个下拉菜单中的“值”格式不同。我以前从未写过 JS,所以请多多包涵... :)
谢谢

【问题讨论】:

    标签: javascript jquery dropdown


    【解决方案1】:

    您的代码可能应该在最初以及当您更改所选选项时触发,并监控该选项更改事件。 _sft_product_make[] 是一个非常可怕的名字,所以我不会使用它。

    特别说明:文本似乎以某种方式“关闭”,我将选定元素设置为“WK2 (2011 – 2013)”,然后必须实际将文本从一个复制到另一个以使其匹配。不知道那里有什么。

    $(function() {
    
      $('select[name="year_id"]').on('change', function() {
        // assume single select here vs multiple
        var yrTxt = $('select[name="year_id"]')
          .find('option')
          .filter(':selected').first().text();
        var sf = $('select.sf-input-select').find('option');
        sf.prop('selected', false);// unset, only set matches
        sf.each(function(index, element) {
          var elt = $(element).text();
          if (yrTxt == elt) {
            $(this).prop('selected', true);
          }
        });
    
      }).trigger('change');
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <select name="year_id">
      <option value="">Series</option>
      <option value="379">WH/WK (2005 – 2010)</option>
      <option value="378">WJ (1999 – 2004)</option>
      <option value="380" selected>WK2 (2011 – 2013)</option>
      <option value="1463">WK2 (2014 – 2016)</option>
      <option value="381">ZJ (1993 – 1998)</option>
    </select>
    
    <select name="_sft_product_make[]" class="sf-input-select" title="">
      <option class="sf-level-0 sf-item-379" data-sf-count="2" data-sf-depth="0" value="whwk-2005-2010">WH/WK (2005 – 2010)</option>
      <option class="sf-level-0 sf-item-378" data-sf-count="5" data-sf-depth="0" value="wgwj-1999-2005">WJ (1999 – 2004)</option>
      <option class="sf-level-0 sf-item-380" data-sf-count="5" data-sf-depth="0" value="wk2-2010-2015">WK2 (2011 – 2013)</option>
      <option class="sf-level-0 sf-item-1463" data-sf-count="6" data-sf-depth="0" value="wk2-2014-2016">WK2 (2014 – 2016)</option>
      <option class="sf-level-0 sf-item-381" data-sf-count="3" data-sf-depth="0" value="zj-1993-1998">ZJ (1993 – 1998)</option>
    </select>

    【讨论】:

      【解决方案2】:

      您可以使用 jQuery 来使用类似的东西。首先,我们在第二次选择中找到具有相同文本的选项的值,并使用该值来选择相应的选项。代码未经测试,但应该可以工作 -

      $(document).on("ready", function(){
        $('select[name="year_id"]').on('change', function() {
          var series = $( "select[name='year_id'] option:selected").text();
          var targetVal = $('select.sf-input-select option').filter(function () { return $(this).html() === series; }).val();
         $('select.sf-input-select').val(targetVal);
        });
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <select name="year_id">
          <option value="">Series</option>
          <option value="379">WH/WK (2005 - 2010)</option>
          <option value="378">WJ (1999 - 2004)</option>
          <option value="380">WK2 (2011 - 2013)</option>
          <option value="1463">WK2 (2014 - 2016)</option>
          <option value="381">ZJ (1993 - 1998)</option>
      </select>
                
      <select name="_sft_product_make[]" class="sf-input-select" title="">
          <option class="sf-level-0 sf-item-379" data-sf-count="2" data-sf-depth="0" value="whwk-2005-2010">WH/WK (2005 - 2010)</option>
          <option class="sf-level-0 sf-item-378" data-sf-count="5" data-sf-depth="0" value="wgwj-1999-2005">WJ (1999 - 2004)</option>
          <option class="sf-level-0 sf-item-380" data-sf-count="5" data-sf-depth="0" value="wk2-2010-2015">WK2 (2011 - 2013)</option>
          <option class="sf-level-0 sf-item-1463" data-sf-count="6" data-sf-depth="0" value="wk2-2014-2016">WK2 (2014 - 2016)</option>
          <option class="sf-level-0 sf-item-381" data-sf-count="3" data-sf-depth="0" value="zj-1993-1998">ZJ (1993 - 1998)</option>
      </select>

      不过,如果您按照您提供的那样维护结构,可能会有更好的方法。这里第二个选择中的选项具有基于主选择值的类名,例如 sf-item-{primary option value}科幻项目 379。如果是这种情况,您可以直接访问此选项并通过 JS/jQuery 将其选中。

      $(document).on("ready", function(){
        $('select[name="year_id"]').on('change', function() {
          var series = $( this ).val();
          if(series) {
           var optionClass = ".sf-item-" + series;
           $('select.sf-input-select').find( optionClass ).prop('selected', true);
          }
        });
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
          <select name="year_id">
              <option value="">Series</option>
              <option value="379">WH/WK (2005 - 2010)</option>
              <option value="378">WJ (1999 - 2004)</option>
              <option value="380">WK2 (2011 - 2013)</option>
              <option value="1463">WK2 (2014 - 2016)</option>
              <option value="381">ZJ (1993 - 1998)</option>
          </select>
                    
          <select name="_sft_product_make[]" class="sf-input-select" title="">
              <option class="sf-level-0 sf-item-379" data-sf-count="2" data-sf-depth="0" value="whwk-2005-2010">WH/WK (2005 - 2010)</option>
              <option class="sf-level-0 sf-item-378" data-sf-count="5" data-sf-depth="0" value="wgwj-1999-2005">WJ (1999 - 2004)</option>
              <option class="sf-level-0 sf-item-380" data-sf-count="5" data-sf-depth="0" value="wk2-2010-2015">WK2 (2011 - 2013)</option>
              <option class="sf-level-0 sf-item-1463" data-sf-count="6" data-sf-depth="0" value="wk2-2014-2016">WK2 (2014 - 2016)</option>
              <option class="sf-level-0 sf-item-381" data-sf-count="3" data-sf-depth="0" value="zj-1993-1998">ZJ (1993 - 1998)</option>
          </select>

      【讨论】:

      • 当有人像 OP 承认的那样完全不熟悉编写 JavaScript 时,最好在您的解释中提供一个功能齐全的示例。
      • 感谢您的回复。我刚刚在 JS Fiddle 中对其进行了测试,但它似乎没有选择第二个下拉菜单。谢谢
      • 立即试用功能齐全的代码。如果您保证提供相同的格式,我更喜欢使用第二个。
      • 请将您的第二个代码.attr('selected', 'selected'); 更改为.prop('selected', true);,因为attr 仅第一次选择该选项。
      • 感谢@KuebelElch15 指出这一点。进行了必要的更改。
      【解决方案3】:

      这是有效的。

      $(document).on("ready", function(){
        $('select[name="year_id"]').on('change', function() {  //this triggers every time the select changes
          id = $( "select[name='year_id'] option:selected").val(); //this gets the value of the selected option
          $("select[name='_sft_product_make[]']").find('.sf-item-' + id).prop('selected',true); //this sets the option with the class that ends with the id as seleted.
        });
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <select name="year_id">
          <option value="">Series</option>
          <option value="379">WH/WK (2005 - 2010)</option>
          <option value="378">WJ (1999 - 2004)</option>
          <option value="380">WK2 (2011 - 2013)</option>
          <option value="1463">WK2 (2014 - 2016)</option>
          <option value="381">ZJ (1993 - 1998)</option>
      </select>
                
      <select name="_sft_product_make[]" class="sf-input-select" title="">
          <option class="sf-level-0 sf-item-379" data-sf-count="2" data-sf-depth="0" value="whwk-2005-2010">WH/WK (2005 – 2010)</option>
          <option class="sf-level-0 sf-item-378" data-sf-count="5" data-sf-depth="0" value="wgwj-1999-2005">WJ (1999 – 2004)</option>
          <option class="sf-level-0 sf-item-380" data-sf-count="5" data-sf-depth="0" value="wk2-2010-2015">WK2 (2011 – 2013)</option>
          <option class="sf-level-0 sf-item-1463" data-sf-count="6" data-sf-depth="0" value="wk2-2014-2016">WK2 (2014 – 2016)</option>
          <option class="sf-level-0 sf-item-381" data-sf-count="3" data-sf-depth="0" value="zj-1993-1998">ZJ (1993 – 1998)</option>
      </select>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-11
        • 2021-01-16
        • 1970-01-01
        • 1970-01-01
        • 2018-02-28
        • 2017-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多