javascript - 搜索过滤器上的 jquery - 如果没有 <option> 匹配 [Safari 浏览器],则换行 <optgroup>

标签 javascript jquery html css

这段代码工作正常,但问题是 optgroup 好像没有找到结果 option 得到 $.wrap() 但我是如果未找到结果,则无法包装 optgroup

$('.search').on('keyup keydown', function(){
  searchFilter($(this).val());
});

function searchFilter(value){
  $('option').each(function(){
    if($(this).text().toLowerCase().indexOf(value.toLowerCase()) >= 0){
      $(this).removeClass('hidden');
      $(this).removeAttr('disabled');
      
      if($(this).parent().is('span')){
        $(this).unwrap('<span>');
      }
    }else{
      $(this).addClass('hidden');
      $(this).prop('disabled', true);
      
      if(!$(this).parent().is('span')){
        $(this).wrap('<span>');
      }
    }
  });
}
.hidden{
  display: none !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="text" class="search" />

<div class="row">
  <select multiple style="width: 150px;height:200px" id="search">
    <optgroup label="test01">
      <option>car</option>
      <option>bike</option>
      <option>cycle</option>
    </optgroup>
    <optgroup label="test02">
      <option>orange</option>
      <option>apple</option>
      <option>pineapple</option>
    </optgroup>
  </select>
</div>

最佳答案

隐藏optgroupsoptions可能不是要走的路,即使包装在 span 中也是如此.包装在 <span style="disaply:none">当我在 Safari 移动版中测试它时不起作用。

更好的选择是从下拉列表中删除不需要的元素。在执行此操作时,您需要创建原始下拉列表的克隆,以便记录初始状态。

$(document).ready(function() {
  //Add a hidden clone
  var clone = $("#fancy").clone(true);
  clone.attr("id", "fancy_clone");
  clone.css("display", "none");
  $("body").append(clone);

  $('.search').on('keyup', function() {
    searchFilter($(this).val());
  });

  function searchFilter(value) {
    //Need a working clone - keep our clone as the original record
    var workingClone = $("#fancy_clone").clone(true);
    $("#fancy").empty();

    //Remove unwanted options
    $(workingClone).find("option").each(function() {
      if ($(this).val().toLowerCase().indexOf(value.toLowerCase()) === -1) {
        var thisParent = $(this).parents("optgroup");
        $(this).remove();

        //remove optgroup if it is empty
        if ($(thisParent).children("option").length === 0) {
          $(thisParent).remove();
        }
      }
    });

    //UPdate the actual select
    $("#fancy").append($(workingClone).html());
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<input type="text" class="search" />
<select id="fancy">
  <optgroup label="test01">
    <option value="car">car</option>
    <option value="bike">bike</option>
    <option value="cycle">cycle</option>
  </optgroup>
  <optgroup label="test02">
    <option value="orange">orange</option>
    <option value="apple">apple</option>
    <option value="pinapple">pineapple</option>
  </optgroup>
</select>

关于javascript - 搜索过滤器上的 jquery - 如果没有 <option> 匹配 [Safari 浏览器],则换行 <optgroup>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55102940/

相关文章:

javascript - 如何使用 Umbraco 修复 JavaScript 语法错误?

jquery - 动画div从一个地方移动到另一个地方

javascript - 从不是用 HTML 编写的 URL 位置自动下载内容。使用软件导航,按下按钮并下载内容

javascript - 圈子上的共享地点

javascript - 在 JavaScript 中的 if 语句内声明变量

javascript - 无法使用ajax调用外部函数

javascript - AngularJS - 可拖动 Bootstrap 模式

javascript - .removeClass() jQuery 立即添加删除的类

javascript - 如何使用下拉菜单更改和保存主体颜色

php - jQuery 自定义模板无法正常工作