搜索/过滤列表在chrome / firefox上有效,但在Safari中无效(HTML和JavaScript) - 在Safari上启用JavaScript

Search / Filter a list works on chrome / firefox but not in safari (HTML & JavaScript) - JavaScript enabled on Safari

提问人:Takeo 0902 提问时间:10/7/2023 最后编辑:chrwahlTakeo 0902 更新时间:10/8/2023 访问量:48

问:

我有以下代码,除了 safari 之外,它可以在任何浏览器中完美运行,显示足球俱乐部列表。之后,我实现了一个搜索栏,用 javascript 过滤列表。

过滤功能在 chrome 中有效。Safari 浏览器仅显示俱乐部列表,在过滤框中键入内容时不执行任何操作。在Safari的设置方面已经尝试了所有内容,并且已经使用了多台计算机。

也许有人知道出了什么问题......

<input type="text" id="filter" oninput="filterDropdown()" placeholder="Type to filter" >
                                
<select id="dropdown" name="club_name" class="form-select bg-custom" size="17" aria-label="Size 10 select example" style="background-color: #B9B4C7;" >
                                <!-- <option selected></option> -->
                                {% for name in df["name"] %}
                                <option class="list bg-custom" data-league="{{ df[df['name']==name]['league'].values[0] }}" value="{{ name }}" {% if loop.first %}selected{% endif %}>{{ name }}</option>
                                {% endfor %}
</select>

JavaScript的

function filterDropdown() {
            // Get input value
            var input, filter, dropdown, options, i, txtValue;
            input = document.getElementById("filter");
            filter = input.value.toUpperCase();
            dropdown = document.getElementById("dropdown");
            options = dropdown.getElementsByTagName("option");

            // Loop through all options, hide those that don't match the filter
            for (i = 0; i < options.length; i++) {
                txtValue = options[i].text;
                if (txtValue.toUpperCase().indexOf(filter) > -1) {
                    options[i].style.display = "";
                } else {
                    options[i].style.display = "none";
                }
            }
        }
JavaScript html 谷歌浏览器 Safari

评论

0赞 somethinghere 10/7/2023
你是说javscript吗?你是说javascript。绝对不是一回事。另外,我认为您不能在字段中设置选项对象的样式 - Chrome 允许它,但这是非标准的。您应该删除它们并重新添加它们,或者禁用它们。<select>

答:

0赞 chrwahl 10/8/2023 #1

并非所有浏览器都以相同的方式处理表单字段的样式:HTML Select 元素

首先,我重构了您的示例。它并不能解决问题。

document.forms.form01.filter.addEventListener('input', e => {
  let form = e.target.form;
  let filter = e.target.value.toUpperCase();
  [...form.club_name.options].forEach(option => {
    option.classList.add('hidden');
    if (option.text.toUpperCase().startsWith(filter)) {
      option.classList.remove('hidden');
    }
  });
});
option.hidden {
  display: none;
}
<form name="form01">
  <input type="text" name="filter" placeholder="Type to filter">
  <select id="dropdown" name="club_name" class="form-select bg-custom" size="5" aria-label="Size 10 select example" style="background-color: #B9B4C7;">
    <option class="list bg-custom" value="1">Abc</option>
    <option class="list bg-custom" value="2">Abcde</option>
    <option class="list bg-custom" value="3">Abcdefg</option>
  </select>
</form>

然后是一个可能有帮助的示例,其中所有选项都被删除并添加到 DOM 中。所有选项都存储在一个数组中,该函数可用于先删除选项,然后插入选项。refresh_options()

const options = [{text:'Abc',value:1},{text:'Abcde',value:2},{text:'Abcdefg',value:2}];

refresh_options(document.forms.form01.club_name, options);

document.forms.form01.filter.addEventListener('input', e => {
  let form = e.target.form;
  let text = e.target.value.toUpperCase();
  let filteredoptions = options.filter(opt => opt.text.toUpperCase().startsWith(text));
  refresh_options(form.club_name, filteredoptions);
});

function refresh_options(select, filteredoptions){
  select.textContent = '';
  filteredoptions.forEach(opt => {
     let optelm = document.createElement("option");
     optelm.value = opt.value;
     optelm.text = opt.text;
     select.add(optelm);
  });
}
<form name="form01">
  <input type="text" name="filter" placeholder="Type to filter">
  <select id="dropdown" name="club_name" class="form-select bg-custom" size="5" aria-label="Size 10 select example" style="background-color: #B9B4C7;">
  </select>
</form>

评论

0赞 Takeo 0902 10/18/2023
谢谢,这看起来很棒,很抱歉回复晚了。我度过了艰难的几天。似乎该表是由 javascript 中的 const 选项填充的。我将如何设法将表从我的 flask 应用程序传递到 javascript 变量......可能是一个新手问题,但我正在努力学习
0赞 chrwahl 10/18/2023
比如:在某个地方的脱衣舞中。就像您在 HTML 中创建选项元素一样。const options = {% for name in df["name"] %} {"name": "{{ name }}", "value": "something"}, {% endfor %}];
0赞 Takeo 0902 10/20/2023
你今天是我个人的耶稣。谢谢