我有一个表单,我想使用对话框来确认提交。对我来说,将对话框嵌套在表单中会很方便,这样当用javascript查询它们时,就可以更容易地确定哪个对话框属于哪个表单。下面是两个最小的例子。在第一种情况下,对话框位于窗体外部,并按预期工作。在第二种情况下,对话框嵌套在表单中,由于某种原因,只有“是”按钮起作用,“否”按钮不起作用。
const form = document.getElementById("myForm");
const dialog = document.getElementById("confirmDialog");
const confirmBtn = document.getElementById("confirmBtn");
const cancelBtn = document.getElementById("cancelBtn");
form.addEventListener("submit", function(event) {
event.preventDefault();
dialog.showModal();
});
confirmBtn.addEventListener("click", function() {
dialog.close();
form.submit(); // Continue form submission
});
cancelBtn.addEventListener("click", function() {
dialog.close(); // Cancel form submission
});
<form id="myForm">
<input type="submit" value="Submit" />
</form>
<dialog id="confirmDialog">
<p>Are you sure you want to submit this form?</p>
<menu>
<button id="confirmBtn">Yes</button>
<button id="cancelBtn">No</button>
</menu>
</dialog>
const form = document.getElementById("myForm");
const dialog = document.getElementById("confirmDialog");
const confirmBtn = document.getElementById("confirmBtn");
const cancelBtn = document.getElementById("cancelBtn");
form.addEventListener("submit", function(event) {
event.preventDefault();
dialog.showModal();
});
confirmBtn.addEventListener("click", function() {
dialog.close();
form.submit(); // Continue form submission
});
cancelBtn.addEventListener("click", function() {
dialog.close(); // Cancel form submission
});
<form id="myForm">
<input type="submit" value="Submit" />
<dialog id="confirmDialog">
<p>Are you sure you want to submit this form?</p>
<menu>
<button id="confirmBtn">Yes</button>
<button id="cancelBtn">No</button>
</menu>
</dialog>
</form>
2条答案
按热度按时间chhkpiq41#
默认情况下,
<form>
中的任何按钮都是提交按钮。submit
:该按钮将表单数据提交到服务器。如果未为与<form>
关联的按钮指定属性,或者属性为空或无效值,则此属性为默认值。因此,您可以通过在侦听器中使用the
preventDefault()
method来避免提交表单的默认操作。我会建议改变这些按钮的
type
,以解决问题更接近根本原因,并避免不可预见的后果。例如,辅助技术可能会假设它们是提交按钮。button
:按钮没有默认行为,默认情况下按下时不执行任何操作。它可以让客户端脚本侦听元素的事件,这些事件在事件发生时触发。wsewodh22#
看起来当对话框嵌套在表单中时,“否”按钮上的单击事件会触发表单提交默认,从而阻止您自行处理取消操作。
您可以通过调用
preventDefault()
method修改代码,以防止单击“否”按钮时默认表单提交: