[英]Why the onsubmit doesnt work and if I call the function in the console it runs?
我有这个HTML:
<!doctype html>
<html class="no-js" lang="">
<head>
<meta charset="utf-8">
<script src="js/filename.js"></script>
</head>
<body>
<form id = "dp5" action="" method="POST" onsubmit="Write_Text()">
<h3>5- Do you know any browsers?</h3>
<input id = "No" type="radio" name="dp5N" value="false">
<label for = "No">No </label>
<input id = "yes" type="radio" name="dp5S" value="true">
<label for = "yes">Yes</label>
<label for = "text">6 - Which?</label>
<input id = "text" type="text" name="dp5text" value="">
</form>
<div id="next">
<input id="sub" type="submit" name="submit" value="Next">
</div>
</body>
</html>
和这个JavaScript的“文件名”:
function Write_Text() {
let x = document.forms["dp5"]["No"].value;
if (x === "false") {
document.getElementById("text").disabled=true;
document.getElementById("text").value="";
} else {
document.getElementById("text").disabled =false;
}
}
该文本框应开始禁用,并且仅在用户选择“是”选项时才可以。 该功能根本不起作用。
您的“提交”按钮不在表格中。 将其放在表单中,它将起作用。
<form id = "dp5" action="" method="POST" onsubmit="Write_Text(); return false">
<h3>5- Do you know any browsers?</h3>
<input id = "No" type="radio" name="dp5N" value="false">
<label for = "No">No </label>
<input id = "yes" type="radio" name="dp5S" value="true">
<label for = "yes">Yes</label>
<label for = "text">6 - Which?</label>
<input id = "text" type="text" name="dp5text" value="">
<div id="next">
<input id="sub" type="submit" name="submit" value="Next">
</div>
</form>
解决Sreekanth MK指出的问题后 ,您将遇到一个新问题:
没有什么可以阻止表单提交的默认操作,即将表单数据发送到action
URL(在您的情况下,它将是页面自己的URL)并将当前页面替换为该URL返回的内容。
您需要阻止默认操作。 最小的方法是:
<form id = "dp5" action="" method="POST" onsubmit="Write_Text(); return false">
要么
<form id = "dp5" action="" method="POST" onsubmit="event.preventDefault(); Write_Text();">
...但是我建议使用现代事件处理,而不是删除onsubmit
属性并像这样更改JavaScript:
function Write_Text(event) {
event.preventDefault();
let x = document.forms["dp5"]["No"].value;
if (x === "false") {
document.getElementById("text").disabled=true;
document.getElementById("text").value="";
} else {
document.getElementById("text").disabled =false;
}
}
document.getElementById("dp5").addEventListener("submit", Write_Text);
请注意,您需要移动script
标记。 将script
head
是一种反模式。 脚本位于页面末尾,紧接</body>
标记之前。
旁注:您可以在自己的代码中随意执行任何操作,但是FWIW,JavaScript中压倒性的约定是,函数名称以小写字母开头并使用camelCase
,而不是使用最初使用上限的CamelCase
构造函数。 因此,使用writeText
而不是Write_Text
。
首先,可以通过在表单中移动按钮并防止默认行为来轻松解决提交问题。
在提交问题中,我认为还可以通过解决以下问题来显着改善代码:您可以选择两个无线电输入:将它们包装到一个字段集中并为其使用相同的名称; 为什么? 更容易获得所选答案,并且可以扩展到多个输入。
下面有一个我所说的工作示例。
干杯!
function Write_Text(event) { event.preventDefault(); let x = document.querySelector('input[name="ans"]:checked').value console.log(x); if (x === "false") { document.getElementById("text").disabled=true; document.getElementById("text").value=""; } else { document.getElementById("text").disabled =false; } }
<!doctype html> <html class="no-js" lang=""> <head> <meta charset="utf-8"> </head> <body> <h3>5- Do you know any browsers?</h3> <form id="dp5" action="" method="POST" onsubmit="return Write_Text(event)"> <fieldset> <input id="No" type="radio" name="ans" value="false"> <label for="No">No </label> <input id="yes" type="radio" name="ans" value="true"> <label for="yes">Yes</label> </fieldset> <label for="text">6 - Which?</label> <input id="text" type="text" name="dp5text" disabled value=""> <div id="next"> <input id="sub" type="submit" name="submit" value="Next"> </div> </form> </body> </html>
您需要在此处使用事件对象来防止发生默认情况,因为页面会在onSubmit刷新,然后在函数Write_Text()中提交表单
function Write_Text(event) {
//This will prevent Default Behaviour
event.preventDefault();
let x = document.forms["dp5"]["No"].value;
if (x === "false") {
document.getElementById("text").disabled=true;
document.getElementById("text").value="";
} else {
document.getElementById("text").disabled =false;
}
// then submit using JS
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.