【问题标题】:Multi select within an optgroup - the event's target is the optgroup选择组内的多选 - 事件的目标是选择组
【发布时间】:2016-03-13 08:36:53
【问题描述】:

我有一个select 和一些optgroups。

<select multiple style="height: 500px; width: 300px">
  <optgroup label="Colours">
    <option value="G">Green</option>
    <option value="B">Blue</option>
    <option value="Y">Yellow</option>
    <option value="W">White</option>
    <option value="P">Pink</option>
  </optgroup>
  <optgroup label="Numbers">
    <option value="1">One</option>
    <option value="2">Two</option>
    <option value="3">Three</option>
    <option value="4">Four</option>
    <option value="5">Five</option>
  </optgroup>
</select>

我希望能够单击optgroup 并选择所有子options。我发现当点击一个单独的option 时,事件仍然被触发,所以通过测试e.target 我可以确定目标是optgroup,然后只选择孩子。

$(document).on("click", "optgroup", function(e) {
  var target = $(e.target);

  console.log(target);

  if (target.is("optgroup")) { 
    target.find("option").prop("selected", true);
  }
});

在这里提琴:https://jsfiddle.net/0z61fzs4/

到目前为止,一切都很好。

但是,请尝试通过单击并拖动来进行多选 - 在下面的 Fiddle 上,只需从“一”向下拖动到“三”。在这种情况下,事件目标最终是 optgroup 本身而不是 option,因此通过以这种方式选择几个选项,您最终会选择 optgroup 中的所有内容。

此行为仅在单击和拖动类型选择时发生。 Ctrl 并单击多选时不会发生这种情况。

此外,如果您“越界”,它就不会发生。例如,在附加的小提琴中,如果您从“White”开始并单击并向下拖动到“Three”,那么您将从两个不同的组中进行多选。在这种情况下,目标最终成为option,并且行为按预期工作。

如何允许我想要的单击拖动类型行为,在单个 optgroup 中选择多个 options 而不触发 JS 并将它们全部选中?

【问题讨论】:

    标签: jquery html optgroup


    【解决方案1】:

    也许你可以看看 mousedown/mousemove 组合?有关更多信息,请参阅此线程:How to distinguish mouse "click" and "drag"

    【讨论】:

      【解决方案2】:

      尝试将单击事件更改为 mouseup 事件,看看是否按预期工作。

      $(document).on("mouseup", "optgroup", function(e) {
        var target = $(e.target);
      
        if (target.is("optgroup")) { 
          target.find("option").prop("selected", true);
        };
      });
      

      工作示例:https://jsfiddle.net/0z61fzs4/2/

      【讨论】:

      • @Abhitalks 如果没有stopPropagation(),这个答案对我来说非常有用。为什么我需要使用它?
      • @bgs264:没关系。我的主要观点是确保 Op 写一个完整的答案,而不是一个有被删除风险的衬里。
      • @Abhitalks 是的,干杯,伙计,我不经常在 StackOverflow 上回复。
      • @Abhitalks 我不明白。我已多次阅读“答案指南”(此处:stackoverflow.com/help/how-to-answer)。没有人说一行有被删除的风险,也没有人说要提供代码示例。您的 cmets 基于什么理由?我认为答案很好 - “将点击替换为 mouseup” - 它简洁有效。我知道该怎么做,我不需要显示一个事件替换为另一个事件的完整示例?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 2016-07-01
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多