【问题标题】:Simulate Enter In JavaScript在 JavaScript 中模拟输入
【发布时间】:2015-07-12 06:47:35
【问题描述】:

我尝试在特定的TextArea 中模拟JavaScript 中的Enter。 这是我的代码:

 function enter1() {
       var keyboardEvent = document.createEvent('KeyboardEvent'); 
       var initMethod = typeof keyboardEvent.initKeyboardEvent !== 'undefined' ? 'initKeyboardEvent' : 'initKeyEvent'; 
       keyboardEvent[initMethod]('keydown', // event type : keydown, keyup, keypress
            true, // bubbles
            true, // cancelable
            window, // viewArg: should be window
            false, // ctrlKeyArg
            false, // altKeyArg
            false, // shiftKeyArg
            false, // metaKeyArg
            13, // keyCodeArg : unsigned long the virtual key code, else 0
            13 // charCodeArgs : unsigned long the Unicode character associated with the depressed key, else 0
       );
       document.getElementById('text').dispatchEvent(keyboardEvent);
 }

TextArea:

<textarea id="text"> </textarea>

当我调用 enter1() 时,它不会在 TextArea 中执行任何操作。这是为什么呢?

【问题讨论】:

  • @avrilalejandro 感谢 avril alejandro 的支持,但每个函数都因“输入”而失败。我不明白。
  • OP 可能永远不会回来了,但是对于带着同样问题来到这里的未来读者来说,您将面临一个 XY 问题。 不,您不想触发 Enter 事件。您想要的是产生与事件通常产生的相同的动作。在这里很难确定它是什么,但也许他们想插入一个新行?然后插入一个新行。也许他们有一个会触发第三个动作的事件监听器?然后直接调用第三个动作。

标签: javascript html dom-events keyboard-events enter


【解决方案1】:

对于在调度事件时遇到问题的任何人,请尝试添加键值对 bubbles: true:

const keyboardEvent = new KeyboardEvent('keydown', {
    code: 'Enter',
    key: 'Enter',
    charCode: 13,
    keyCode: 13,
    view: window,
    bubbles: true
});

【讨论】:

  • 为我工作,谢谢!
【解决方案2】:

我认为这是一个浏览器错误,因为keyboardEvent.which 是不可写的。为了修复它,您必须在分配键码之前删除keyboardEvent.which 属性。

 function enter1() {
   var keyboardEvent = document.createEvent('KeyboardEvent');
   delete keyboardEvent.which;
   var initMethod = typeof keyboardEvent.initKeyboardEvent !== 'undefined' ? 'initKeyboardEvent' : 'initKeyEvent';
   keyboardEvent[initMethod](
     'keydown', // event type : keydown, keyup, keypress
     true, // bubbles
     true, // cancelable
     window, // viewArg: should be window
     false, // ctrlKeyArg
     false, // altKeyArg
     false, // shiftKeyArg
     false, // metaKeyArg
     13, // keyCodeArg : unsigned long the virtual key code, else 0
     13 // charCodeArgs : unsigned long the Unicode character associated with the depressed key, else 0
   );
   document.getElementById('text').dispatchEvent(keyboardEvent);
 }

另一种解决方案是KeyboardEvent Constructor。请注意兼容性问题。

 function enter1() {
   var keyboardEvent = new KeyboardEvent('keydown');
   delete keyboardEvent.which;
   keyboardEvent.which = 13;
   document.getElementById('text').dispatchEvent(keyboardEvent);
 }

【讨论】:

  • 我编辑了代码,但没有任何改变。谢谢你的回答。
  • @LucaLaiton 您可以尝试手动分配keyboardEvent.which = 13;,而不是将密钥代码传递给initMethod。
  •   function premi_enter() { var keyboardEvent = document.createEvent('KeyboardEvent');删除keyboardEvent.which;键盘事件.which = 13; document.getElementById('text').dispatchEvent(keyboardEvent); } 
  • @LucaLaiton 是的。顺便说一句,我已经用更优雅的解决方案更新了我的答案。我想你可能对此感兴趣。
  • 感谢支持,但最后一个功能可能不适用于兼容性。我只需要模拟回车键的按下,对我来说很难:)
【解决方案3】:

var textArea = document.getElementById('text');
function enter() {
    var keyboardEvent = new KeyboardEvent('keydown', {
        code: 'Enter',
        key: 'Enter',
        charKode: 13,
        keyCode: 13,
        view: window
    });

    textArea.dispatchEvent(keyboardEvent);
}

textArea.addEventListener('keydown', function (e) {
    console.log(e);
});
enter()
<!doctype html>
<html class="no-js" lang="">

<head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <title>test</title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>

<body>
    <textarea id="text"></textarea>
</body>

</html>

此时initKeyboardEvent 方法被标记为已弃用。建议直接实例化KeyboardEvent,并将必要的数据传递给构造函数-link。请参阅浏览器兼容性部分。至少它适用于 chrome 和 firefox。

【讨论】:

猜你喜欢
  • 2012-10-03
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2023-04-04
相关资源
最近更新 更多