【问题标题】:Show Hide select options based on previous selection dropdown根据先前的选择下拉显示隐藏选择选项
【发布时间】:2012-02-09 12:07:39
【问题描述】:

感谢您阅读我的问题... ;-)

我正在构建一个 Wordpress 网站,该网站使用自定义帖子和自定义字段来显示车辆库存。我希望访问者能够按分类法过滤帖子...

我用于钻取可用分类法(查询多个分类法)的插件会将它可以为该特定分类法找到的所有选项输出到下拉列表中。

为防止下拉列表(即模型)变得太长,我想仅显示基于先前选择的那些选项。

因此,当访问者选择 Vehicle = Cars 时,制造商的下拉菜单应仅显示汽车制造商。 当访问者选择制造商时,即福特,选择模型的下一个下拉菜单应该只显示之前选择的制造商可用的模型,在这种情况下是福特...

标签和级别 0 值不会改变,但是当我添加或更改制造商或型号时,级别 1 和/或级别 2 会发生变化。

没那么重要,但如果可能,最好去掉所有不需要显示在“已过滤”下拉菜单中的内容。如果是制造商下拉菜单,则不需要级别 0 和所有空格。 如果是 Model 下拉菜单,选择后不需要 level-0、level1 和所有空格。

这是由插件生成的 HTML 代码的示例:

<label for="qmt-vehicle">Vehicle:</label>
<select id="qmt-vehicle" name="vehicle">
    <option></option>
    <option class="level-0" value="cars" >Cars</option>
    <option class="level-0" value="motorcycles" >Motorcycles</option>
</select>

<label for="qmt-manufacturer">Manufacturer:</label>
<select id="qmt-manufacturer" name="manufacturer">
    <option></option>
    <option class="level-0" value="cars" >Cars</option>
    <option class="level-1" value="ford" >&nbsp;&nbsp;&nbsp;Ford</option>
    <option class="level-1" value="chevrolet" >&nbsp;&nbsp;&nbsp;Chevrolet</option>

    <option class="level-0" value="motorcycles" >Motorcycles</option>
    <option class="level-1" value="honda" >&nbsp;&nbsp;&nbsp;Honda</option>
    <option class="level-1" value="yamaha" >&nbsp;&nbsp;&nbsp;Yamaha</option>    
</select>

<label for="qmt-model">Model:</label>
<select id="qmt-model" name="model">
    <option></option>
    <option class="level-0" value="cars" >Cars</option>
    <option class="level-1" value="ford" >&nbsp;&nbsp;&nbsp;Ford</option>
    <option class="level-2" value="model-1-ford" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 1</option>
    <option class="level-2" value="model-2-ford" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 2</option>
    <option class="level-2" value="model-3-ford" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 3</option>
    <option class="level-1" value="chevrolet" >&nbsp;&nbsp;&nbsp;Chevrolet</option>
    <option class="level-2" value="model-1-chevrolet" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 1</option>
    <option class="level-2" value="model-2-chevrolet" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 2</option>
    <option class="level-2" value="model-3-chevrolet" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 3</option>    

    <option class="level-0" value="motoren" >Motorcycles</option>
    <option class="level-1" value="honda" >&nbsp;&nbsp;&nbsp;Honda</option>
    <option class="level-2" value="model-1-honda" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 1</option>
    <option class="level-2" value="model-2-honda" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 2</option>
    <option class="level-2" value="model-3-honda" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 3</option>
    <option class="level-1" value="yamaha" >&nbsp;&nbsp;&nbsp;Yamaha</option>
    <option class="level-2" value="model-1-yamaha" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 1</option>
    <option class="level-2" value="model-2-yamaha" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 2</option>
    <option class="level-2" value="model-3-yamaha" >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Model 3</option>
</select>

我可以用 Javascript 做一些简单的事情,但这对我来说并不简单,抱歉... ;-)

有人可以帮我弄清楚如何在 Javascript/JQuery 中执行此操作吗? 跨浏览器会很棒!

* 编辑 * HTML 代码显示发送到浏览器的代码。因为我不能对插件进行太多修改,所以我想“操纵”这段代码以使其按我想要的方式工作...... ;-) 唯一固定的是:下拉列表的标签和所有 Class="level-0" 元素的值。

所以“汽车”和“摩托车”将永远存在,永远不会改变。但从那里一切都可以灵活改变。 IE。当雪佛兰没有要显示的帖子时,雪佛兰将不会出现在生成的 HTML 中。因此,该插件仅显示真实存在且可以找到的项目的下拉选项。 因此,当根本没有可用的福特时,福特将不会出现在下拉列表中...

我宁愿不制作制造商及其型号的预定义列表。

【问题讨论】:

    标签: javascript jquery select show-hide


    【解决方案1】:

    订阅您的select 元素的onchange 事件:http://www.w3schools.com/jsref/event_onchange.asp。在事件处理程序中,读取当前选定的值并相应地重新填充其他元素。

    【讨论】:

      【解决方案2】:

      我建议您将数据保存在 javascript 中,这样您只需要显示每个模型的必要选项,而不必隐藏一些..

      我把它放在 jsfiddle 上,但网站一直在崩溃。 下面的代码已经过测试并且可以工作。

      现在可以工作了:

      <script type="text/javascript">
      var vehicles = {"Cars": {
                  "Ford" : [ "Fiesta", "Focus", "Fusion"], 
                  "Chevy": [ "Malibu", "Corvette", "Tahoe"],
                  },
       "Motorcycles": {
            "Honda": ["model 1", "model 2", "model 3"],
            "Yamaha": ["model 1", "model 2", "model 3", "model 4"]
          }
      };
      
      
      $(document).ready(function() {
        var $vehiclesList = $("#qmt-vehicle");
        var $manufList = $("#qmt-manufacturer");
        var $modelList = $("#qmt-model");
        var selectedType = null
        var selectedManuf = null;
        $.each(vehicles, function(key, vehicle) {
          $vehiclesList.append($("<option/>", {value:key,text:key}));
        });
      
        $vehiclesList.bind("change", function() {
          selectedType = $(this).val();
          if (selectedType && vehicles[selectedType]) {
            var manufacturers = vehicles[selectedType];
             $("#qmt-manufacturer option").not(":first").remove();
            $("#qmt-model option").not(":first").remove();
            $.each(manufacturers, function(key, manufacturer) {
               $manufList.append($("<option/>", { value: key, text: key}));
            });
          }
        });
      
       $manufList.bind("change", function() {
          var selectedManuf = $(this).val();
           $("#qmt-model option").not(":first").remove();
          if (selectedManuf  && vehicles[selectedType] && vehicles[selectedType][selectedManuf]) {
            var models = vehicles[selectedType][selectedManuf];      
            $.each(models, function(key, model) {
               $modelList.append($("<option/>", { value: model, text: model}));
            });
          }
        });
      
       });
      </script>
      

      然后在您的页面中,您将拥有

      <label for="qmt-vehicle">Vehicle:</label>
      <select id="qmt-vehicle" name="vehicle">
          <option></option>
      
      </select>
      
      <label for="qmt-manufacturer">Manufacturer:</label>
      <select id="qmt-manufacturer" name="manufacturer">
        <option></option>
      </select>
      
      <label for="qmt-model">Model:</label>
      <select id="qmt-model" name="model">
        <option></option>
      </select>
      

      【讨论】:

      • 嗨,马特,感谢您抽出宝贵的时间来帮助我!我喜欢您的解决方案,但我宁愿有一个没有预定义制造商和型号的解决方案,希望您不要介意... ;-) 当我添加车辆帖子或模型时,它会显示在下拉列表中。因此,下拉列表仅显示可用的内容,这种方式搜索(过滤)快速且简短。我编辑了我的文本,就像我说的那样,唯一固定的东西是第一个下拉列表中的汽车和车辆。其他一切都与在 WP 后端作为帖子输入的车辆/模型有关。未发布时不应显示制造商/模型。
      • 好的,抱歉,我想我跳过了这个问题,并没有看到您在谈论使用为您生成此代码的 WP 插件(我以为您可以控制数据)。您可能可以制作自己的各种模板,将数据转换为 JSON,然后像我一样使用它,但我不熟悉 wordpress,所以我不知道从哪里开始。话虽如此,您可以使用我的一些想法从列表中删除选项。
      • 嗨,马特!感谢您再次回复...;)是的,该插件会为访问者生成此类下拉列表以过滤帖子。当然我删除了页面的其余部分,这只是下拉部分。就像我说的,它只显示了在 WP 中活跃的车辆、制造商和模型。唯一确定的部分是汽车和摩托车的第一个下拉列表将始终相同。其余的可能因输入的车辆而异。当没有输入雪佛兰时,它不会显示在下拉列表中...我现在没有进一步了解,仍在尝试... ;-)
      • 嗨,马特,马特,我认为您的解决方案非常接近我想要的预定义数组除外。加载页面时,是否可以读取每个下拉列表的所有选项并将这些值放入几个数组中?然后使用这些数组根据先前的选择填充下拉列表,就像您现在使用预定义的数组一样?当访问者做出不同的选择时,使用数组可以“重新填充”下拉列表......希望你能帮助我,马特...... ;-)
      猜你喜欢
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-04
      相关资源
      最近更新 更多