繁体   English   中英

表单提交时触发回调

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM