[英]Render a button[type="submit"] in a form trigger the onSubmit callback
[英]Trigger callback on form submit
我面临一个问题,我正在做的是有一个<form>
有一个<textarea>
。 我想要实现的是当用户在textarea
上按下Enter
键时提交表单。
默认表单附加了一个eventListener
submit
并执行一个回调函数。
但问题是我想在Enter
键上执行该回调。
我知道我可以通过使用 JQuery .submit(callback)
方法来实现相同的行为。
但是有没有办法在 Vanilla javascript 中重新触发相同的回调函数。
const submitForm = (event) => { event.preventDefault(); alert('form is submitted!'); }; // Form Event document.getElementById('form').addEventListener('submit', submitForm, false); // Key Event document.getElementById('textarea').addEventListener('keypress', (event) => { if (event.which === 13 || event.keyCode === 13) { event.preventDefault(); // Form submit } }, false);
* { box-sizing: border-box; } textarea { width: 380px; min-height: 210px; padding: 18px; font-size: 26px; margin-bottom: 16px; resize: vertical; }
<form id="form" name="form"> <label> <textarea id="textarea" name="message" placeholder="Type Here"></textarea> </label> </form>
像这样尝试:
document.getElementById('textarea').addEventListener("keyup", function(event) { if (event.keyCode === 13) { event.preventDefault(); // do your thing here document.getElementById('form').submit(); document.getElementById('testId').innerHTML = "it works!!!!"; // test } });
<!DOCTYPE html> <html> <body> <form id="form" name="form" action="/your_page.aspx"> <label><textarea id="textarea" name="message" placeholder="Type Here"></textarea></label> </form> <p id="testId"> </p> </body> </html>
表单标签需要有一个action
,否则form.submit()
不会做任何事情。
<form id="form" name="form" action="/action_page.php" method="get">
<label>
<textarea id="textarea" name="message" placeholder="Type Here"></textarea></label>
<input type="submit">
</form>
当按下回车时,这个 JS 将调用提交
let form = document.getElementById('form')
form.addEventListener('submit', submitForm);
document.getElementById('textarea').addEventListener('keypress', (event) => {
if (event.which == 13 || event.keyCode == 13) {
event.preventDefault()
form.submit()
}
});
但真正的问题是form.submit()
不会引发onSubmit
事件! 因此,当您以编程方式提交表单时,不会调用您的eventHandler
。
来自 MDN
提交事件仅在用户单击表单中的提交按钮(或 )时触发。 直接调用 form.submit() 方法时不会引发该事件。
https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/submit_event
您可以设置一个变量来确定是否允许提交表单。
var allow_submit = false;
并修改表单的提交事件处理程序,以便在allow_submit
变量不为true
调用event.preventDefault()
:
document.getElementsByTagName("form")[0].addEventListener("submit", function(event) {
if (allow_submit !== true) {
event.preventDefault();
}
// the form is allowed to submit, do stuff
});
然后侦听keyup
事件(在 textarea 上),如果按下了 Enter 键(keycode 13
),则将allow_submit
设置为true
并提交表单:
document.getElementsByTagName("textarea")[0].addEventListener("keyup", function(event) {
if (event.keyCode === 13) {
allow_submit = true;
document.getElementsByTagName("form")[0].submit();
}
// enter key wasn't pressed, do other suff
});
注意:您可能需要将allow_submit
变量设为全局变量,您可以通过将var
替换为window.
, 像这样:
window.allow_submit = true;
注意:如果您要大量使用它们,您应该将 form 和 textarea 元素存储在一个变量中。
祝你好运。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.