javascript - 反应:防止表单提交在 Firefox 上不起作用
问题描述
我已经编写了一些代码,这些代码将在下面的代码段中提到。它将form
数据发布到服务器以下载CSV
文件。Chrome 正在按预期工作。但是,在 Firefox 中,页面总是在调用downloadCSV
函数时重新加载。
以下a
元素包含在我的一个组件中。单击它,触发该downloadCSV
功能。
<a ref='downloadAnchor' onClick={this.downloadCsv.bind(this)}>
<i className='fa fa-download' />
Download as CSV
</a>
和功能
function downloadCsv() {
const query = {
name: 'someName',
age: 'someAge',
bla: 'blabla',
someOtherField: 'bla'
};
const form = document.createElement('form');
form.setAttribute('action', 'some_url');
form.setAttribute('method', 'post');
form.addEventListener('submit', e => {
e.preventDefault();
e.stopPropagation();
return false;
});
// _ is lodash
_.forEach(query, (v, k) => {
const input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('name', k);
input.setAttribute('value', v);
form.appendChild(input);
});
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
}
解决方案
解决方案是结合@UllasHunka 和@Tholle 的评论。工作代码如下所示:
function downloadCsv(event) {
// ----->
event.preventDefault();
const query = {
name: 'someName',
age: 'someAge',
bla: 'blabla',
someOtherField: 'bla'
};
const form = document.createElement('form');
form.setAttribute('action', 'some_url');
form.setAttribute('method', 'post');
// ----->
form.setAttribute('target', '_blank');
form.addEventListener('submit', e => {
e.preventDefault();
e.stopPropagation();
return false;
});
// remove limit to get all logs
query.limit = 0;
_.forEach(query, (v, k) => {
const input = document.createElement('input');
input.setAttribute('type', 'hidden');
input.setAttribute('name', k);
input.setAttribute('value', v);
form.appendChild(input);
});
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
}
推荐阅读
- javascript - Googlespreedsheet 查询在节点 js 中不起作用
- javascript - Expo Publish:请求失败,状态码为 413
- android - 三星 S7 没有;发现任何蓝牙设备
- python - 在 discord.py 中使用随机模块
- angular - HttpClient 不在服务上下文中发送令牌
- java - 使用 Cloud Run 进行服务器流式传输
- javascript - 选择包含嵌套子元素的元素
- python - 在模型上拟合数据时出错。目标输出需要匹配
- sql-server - 始终使用 sa 用户执行触发器
- angular - 如何对从服务订阅 EventEmitter 的 Angular 组件进行单元测试?