javascript - 在 Safari 中提交表单之前更改元素可见性有时不起作用
问题描述
这是我用来在整个应用程序中显示加载微调器的 html 元素(处于其原始状态)(主要使用 Bootstrap 类):
<div id="loadSpinner" class="overlay d-flex justify-content-center invisible">
...
</div>
这是视图中的表格(Rails 6):
<%= form_with(url: result_path,
method: "patch", local: true) do |f| %>
...
<%= f.submit "Finish", class: "btn btn-success btn-lg my-3",
onclick: "finish();" %>
<% end %>
这是加载微调器显示的 'finish()' js 函数:
function finish() {
...
document.querySelector('#loadSpinner').classList.remove('invisible');
}
它在 Chrome 和 Firefox 中运行良好,但加载微调器有时不会在 Safari 中显示。
我添加了一些日志(console.log(document.querySelector('#loadSpinner'))
在“不可见”类删除之后)并且可以看到“不可见”类在提交之前实际上已被删除。所以 js 代码工作正常,但微调器只是没有出现。
此外,我尝试在删除“不可见”类后添加一个“可见”类 - 问题仍然存在。
有人知道为什么会在 Safari 中发生吗?
我有一个假设,实际上提交是在实际删除“不可见”类之前以某种方式发生的,但我不知道检查和修复它的方法。
解决方案
如果您使用的是 Rails UJS,您可以使用ajax:beforeSend
和ajax:complete
事件来切换微调器:
<%= form_with(url: result_path, method: "patch", remote: true, class: 'spinner-form') do |f| %>
let form = document.querySelector('#myForm');
let spinner = document.querySelector('#loadSpinner');
document.addEventListener('ajax:beforeSend', (event)=>{
if (!event.target.matches('.spinner-form)) return;
spinner.classList.remove('invisible');
});
document.addEventListener('ajax:complete', (event)=>{
if (!event.target.matches('.spinner-form)) return;
spinner.classList.add('invisible');
});
如果你自己做,你想阻止默认事件处理程序:
<%= f.submit "Finish", class: "btn btn-success btn-lg my-3",
id: "myButton" %>
let btn = document.querySelector('#myButton');
let spinner = document.querySelector('#loadSpinner');
btn.addEventListener('click', (event)=>{
let form = event.target.form;
event.preventDefault();
spinner.classList.add('invisible');
fetch(form.action)
.then((response)=>{
spinner.classList.remove('invisible');
});
});
如果这不是 XHR (ajax) 请求,那么当页面重新加载时脚本执行停止时,这将无法正常工作。
推荐阅读
- java - 如何在不改变 recyclerView 主体的情况下更改 View Drawable 的背景颜色?
- python - 如何更改时间库中的数字字体?
- latex - 新的 texlive 安装无法编译文件,在许多其他错误中找不到 `article.cls`
- r - ggplot不同的条形组之间的距离
- excel - 将一个 Excel 工作表中的命名范围复制到另一个工作表中的命名范围
- nginx - 从下游代理解析用户 IP
- java - 标准库是 Java 加载/读取和编辑/修改和保存不重新格式化的 html 文件的最佳选择吗?
- sql - 如何优化具有笛卡尔积和子查询的查询?
- json - Moshi 错误:@JsonClass 不能应用于 [class]。不得密封
- android - 我是否为应用程序使用了错误的 adb 权限而不会在后台被杀死?