【问题标题】:Simulate <enter> keypress in javascript to trigger a form-submit在 javascript 中模拟 <enter> 按键以触发表单提交
【发布时间】:2015-03-25 23:43:00
【问题描述】:

我找到了十多篇关于如何执行此操作的不同 SO 文章,但没有一篇有效。

我正在尝试编写一些测试,并且我想测试当我在 input 中按 enter 时,表单确实会回发。但是,我无法让它模拟这个。

无论我选择哪种方法,keypress 事件都会被触发——事件侦听器会看到它——但不会提交表单。

jsFiddle link:

HTML

<!-- returns an error on submit, but that's fine... 
     we're only seeing if we can get a submit to happen -->
<form action="POST">
    <input id="myinput" type='text' value="foo" />
</form>

<div id="output"></div>

Javascript

$(function () {
    var $input = $("#myinput");
    $input.on("keypress", function (evt) {
        $("#output").append("Typed: " + evt.keyCode + ", but the form didn't submit.<br>");
    });

    $("form").on("submit", function () { alert("The form submitted!"); } );

    // try jQuery event
    var e = $.Event("keypress", {
        keyCode: 13
    });
    $input.trigger(e);

    // try vanilla javascript
    var input = $input[0];
    e = new Event("keypress");
    e.keyCode = 13;
    e.target = input;
    input.dispatchEvent(e);

    e = document.createEvent("HTMLEvents");
    e.initEvent("keypress", true, true);
    e.keyCode = 13;
    e.target = input;
    input.dispatchEvent(e);
});

是否可以像这样模拟实际的按键操作?

如果您专注于文本框(在 jsFiddle 中)并实际按下 enter,页面将返回并返回如下内容:

这就是我想要实现的,仅在代码中。

原因如下:

$("input").on("keypress", function (e) {
    if (e.keyCode == 13) {
        e.preventDefault();
    }
});

我在我的代码库中遇到了这个问题,我想测试一下这种事情不会再次发生。

【问题讨论】:

  • 当我在 osx 上使用 chrome、ff 和 safari 调用您的链接时,我得到了 3 次“Typed: 13”...所以看起来它可以工作了吗?
  • 关注文本框并实际按下 ... 这就是我正在寻找的行为
  • 按键正在工作,但我“认为”他是说当您手动“按下”输入按钮时发生的表单提交没有被发送..我认为这是一个安全问题。也许阻止您自动发布表格?我去看看。
  • @KevinCJones 如果这是他想要做的事情,那么使用form.submit() 是一种方式。
  • 我不认为你可以做到,但如果这是为了用户模拟,例如测试,正如你所说,我认为你可以做任何你的例子,但只需捕获键码 13 被点击并调用提交函数......如果这纯粹是学术练习,我什至研究了这个@ 987654322@但没有找到任何快乐..

标签: javascript


【解决方案1】:

要在输入上模拟keypress event,我们必须使用KeyboardEvent constructor 并将事件传递给输入的dispatchEvent 方法。

const event = new KeyboardEvent("keypress", {
  view: window,
  keyCode: 13,
  bubbles: true,
  cancelable: true
});

document.querySelector("input").dispatchEvent(event);
<!-- returns an error on submit, but that's fine... 
     we're only seeing if we can get a submit to happen -->
<form action="POST">
    <input id="myinput" type='text' value="foo" />
</form>

<div id="output"></div>

您可以在mdn documentation on triggering and creating events查看更多信息

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-28
  • 1970-01-01
  • 2013-01-12
  • 2013-12-27
相关资源
最近更新 更多