【问题标题】:JQuery or Javascript filter select optionsJQuery 或 Javascript 过滤器选择选项
【发布时间】:2017-07-06 22:04:04
【问题描述】:

我正在开发一个应用程序,它的表单包含两个用数组动态填充的选择。

如果第一个选择没有选择,则第二个选择被禁用,我需要过滤第二个选择的选项,尊重第一个选择。

虽然我必须将这些值传递给另一个 PHP 页面,但我不能使用 value 属性进行过滤。

我尝试使用自定义属性但没有结果。

这是我的代码,

<tr>
    <td style="color: white;">Seleziona data: </td>
    <td>
        <select class="form-control" name="data" id="select1">
            <option value="prova" disabled selected> Scegli</option>
            <?php for ($y=0; $y<count($giorni); $y++){ $giorno=$ giorni[$y];?>
            <option value="<?php echo $giorno; ?>" id="<?php echo $y; ?>">
                <?php echo $giorno; ?> </option>
            <?php } ?>
        </select>
    </td>
</tr>
<tr>
    <td style="color: white;">Seleziona ora: </td>
    <td>
        <select class="form-control" name="ora" id="select2" disabled>
            <?php $count=1 ; while ($count <=3 ){ if ($count==1 ){ for ($g=0; $g<count($ora1); $g++){ ?>
            <option id="<?php echo $count-1; ?>" value="<?php echo $ora1[$g]; ?>">
                <?php echo $ora1[$g]; ?>
            </option>
            <?php } $count ++; } ?>
            <?php if ($count==2 ){ for ($g=0; $g<count($ora2); $g++){ ?>
            <option id="<?php echo $count-1; ?>" value="<?php echo $ora2[$g]; ?>">
                <?php echo $ora2[$g]; ?>
            </option>
            <?php } $count ++; } ?>
            <?php if ($count==3 ){ for ($g=0; $g<count($ora2); $g++){ ?>
            <option id="<?php echo $count-1; ?>" value="<?php echo $ora3[$g]; ?>">
                <?php echo $ora3[$g]; ?>
            </option>
            <?php } $count ++; } } ?>
        </select>
      </td>
  </tr>

JAVASCRIPT:

<script>
    document.getElementById('select1').onchange = function() {
        document.getElementById('select2').disabled = false;
    };
</script>
<script>
    $("#select1").change(function() {
        if ($(this).data('options') == undefined) {
            /*Taking an array of all options-2 and kind of embedding it on the select1*/
            $(this).data('options', $('#select2 option').clone());
        }
        var id = $(this).id();
        var options = $(this).data('options').filter('[id=' + id + ']');
        $('#select2').html(options);
    });
</script>

我该如何解决?

谢谢

【问题讨论】:

  • 那不是 JavaScript。你在用 jQuery 吗?
  • 是的,对不起....你知道 Javascript 中有什么解决方案吗? @user7393973
  • 你能试着解释一下这个问题吗?我所理解的是,您有一个&lt;select&gt;,其中包含来自数组的动态选项,这意味着它可以变化。然后,根据选择的情况,显示第二个&lt;select&gt; 和动态&lt;option&gt;s,据此在第一个&lt;select&gt; 中选择了&lt;option&gt;。我说对了吗?
  • 请重新定义问题,在评论中以更好的方式解释它,因为不清楚您想要实现的目标

标签: javascript jquery html select options


【解决方案1】:

您可以使用json_encode 函数在您的 PHP 代码中生成 JSON 对象,并在客户端动态创建 select2 选项。

<tr>
  <td style="color: white;">Seleziona data: </td>
  <td>
    <select class="form-control" name="data" id="select1">
      <option value="prova" disabled selected> Scegli</option>
<?php
  foreach ($giorni as $key => $value) {
?>
      <option value="<?php echo $value; ?>" id="<?php echo $key; ?>" ><?php echo $value; ?></option>
<?php
  }
?>
    </select>
  </td>
</tr>
<tr>
  <td style="color: white;">Seleziona ora: </td>
  <td>
    <select class="form-control" name="ora" id="select2" disabled></select>
  </td>
</tr>

<script>
  // the options object contains the possible option values for select2
  // it can be accessed as an associative array using the selected value from select1
  var options = {
    "0" : <php echo json_encode($ora1, JSON_FORCE_OBJECT) ?>,
    "1" : <php echo json_encode($ora2, JSON_FORCE_OBJECT) ?>,
    "2" : <php echo json_encode($ora3, JSON_FORCE_OBJECT) ?>
  };

  // a helper variable to prevent unnecessary work
  var prevSelectedValue = null;

  // onChange handler for select1
  document.getElementById('select1').onchange = function () {
    var selectedValue = document.getElementById('select1').value;
    if (selectedValue && (prevSelectedValue != selectedValue)) {
      // select1 has changed so there is work to do
      // 1 - get a handle on select2 to make code more legible
      var select2 = document.getElementById('select2');
      // 2 - remove all existing options
      select2.options.length = 0;
      // 3 - add new options
      var obj = options[selectedValue];
      // iterate through the object to get the keys and values
      for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
          var newOption = document.createElement('option');
          newOption.text = obj[key];
          newOption.value = key;
          select2.options.add(newOption);
        }
      }
      // 4 - enable select2
      select2.disabled = false;
      // 5 - record select1 change in prevSelectedValue
      prevSelectedValue = selectedValue;
    }
  };
</script>

【讨论】:

  • 使用您的代码,第二个选择始终被禁用
  • 不,不是。 if 条件末尾的select2.disabled = false; 行启用控制。见jsfiddle.net/opm7hknd
【解决方案2】:

您的 html 存在问题。具有相同 ID 的选项不止一个。在 html 文档上,id 必须是唯一的。

出于同样的原因,您无法根据 id 值过滤您的选项。

您应该做的是使用data- 属性而不是id 属性。这将允许您对其进行过滤。

【讨论】:

  • 谢谢,所以如果我用 data-id 更改我的代码更改 id 它应该可以工作吗?
  • 如果这是唯一的问题,那么它会的。
猜你喜欢
  • 2011-10-27
  • 1970-01-01
  • 2015-08-26
  • 2016-10-31
  • 2020-07-21
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多