javascript - 即使我使用的是 preventDefault,页面也会在表单提交时刷新
问题描述
我正在尝试使用以下方法在提交表单时阻止页面刷新:
window.addEventListener("load", function () {
let settings_form = document.getElementById("settings_form");
// handle form submit
settings_form.addEventListener("submit", function (e) {
e.preventDefault(); // before the code
save_settings();
// Should be triggered on form submit
console.log("hi");
return false;
});
});
但它不起作用。如果我评论该save_settings
方法,页面将不会重新加载。显然,我需要那种方法。
function save_settings() {
// let form = document.getElementById("settings_form");
let json_data = toJSONstring(settings_form);
console.log(json_data);
post_data("api/settings/change", json_data).then((send_response) => {
console.log(send_response);
conn_status = 1;
// logs to page
// get_settings() // update interface with newer settings
get_info();
});
}
我不知道哪个功能e.preventDefault();
不起作用。
有关更多上下文:
// parse form data into json
function toJSONstring(form) {
let object = {};
console.log(form);
let formData = new FormData(form);
formData.forEach((value, key) => {
// Reflect.has in favor of: object.hasOwnProperty(key)
if (!Reflect.has(object, key)) {
object[key] = value;
return;
}
if (!Array.isArray(object[key])) {
object[key] = [object[key]];
}
object[key].push(value);
});
console.log(JSON.stringify(object));
return JSON.stringify(object);
}
// send/post json
async function post_data(api_path, json_data) {
let post_url = ROOT_URL + api_path;
const response = await fetch(post_url, {
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
},
body: json_data,
});
//check
if (!response.ok) {
conn_status = 0;
const message = `An error has occured: ${response.status}`;
throw new Error(message);
}
return await response.json();
}
<form id="settings_form" class="settings_form">
<label for="wifi_ssid">Change SSID</label>
<input type="text" name="wifi_ssid" id="wifi_ssid" />
<label for="wifi_pass">Change Password</label>
<input type="text" name="wifi_pass" id="wifi_pass" />
<label for="ap_ip">Change IP Address</label>
<input type="text" name="ap_ip" list="ap_ip" />
<datalist id="ap_ip">
<option>192.168.100.20</option>
</datalist>
<input type="button" value="Save Settings" id="submit_btn">
</form>
我也试过听click
按钮上的事件:
window.addEventListener("load", function () {
let button = document.getElementById("submit_btn");
// handle form submit
button.addEventListener("click", function (e) {
e.preventDefault(); // before the code
save_settings();
// Should be triggered on form submit
console.log("hi");
return false;
});
});
后期编辑:
我正在运行一个本地模型 JSON 服务器来测试我的代码。
我在这里尝试了代码:https ://jsbin.com/xogozovawe/1/edit?html,js,output并且它有效。
这可能是本地服务器的错吗?
解决方案
推荐阅读
- mysql - MySQL顺序插入很慢,而线程插入很快 - 为什么?
- php - Fasthosts 共享平台 PHP 邮件来自网页问题 -F
- java - 如何使用 Maven 处理在两个目录之间拆分的 Java 包
- amazon-ec2 - 来自 EKS 节点的 ERR_CONNECTION_RESET
- python - @tf.function 正在减慢训练步骤
- javascript - Ajax 在另一个 Ajax 调用期间调用以接收服务器的任务计算状态并将其作为进度条显示给客户端
- excel - 插入照片循环:路径为空时如何跳到“下一个”?
- ios - 如何在 Sign In With Apple 中验证 realUserStatus 值
- reactjs - 如何解决 Apollo 订阅“WebSocket 握手期间出错:意外响应代码:400”
- elasticsearch - elasticsearch中的“令牌过滤器”和“摄取节点”有什么区别?