提问人:Takeo 0902 提问时间:10/7/2023 最后编辑:chrwahlTakeo 0902 更新时间:10/8/2023 访问量:48
搜索/过滤列表在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
问:
我有以下代码,除了 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";
}
}
}
答:
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
你今天是我个人的耶稣。谢谢
评论
<select>