在JavaScript中输入按键事件

问题描述 投票:269回答:17

我有一个form有两个文本框,一个选择下拉和一个单选按钮。当按下回车键时,我想调用一个javascript函数(用户定义),但是当我按下它时,表单就会被提交。

当按下回车键时,如何防止提交form

forms javascript-events keypress enter
17个回答
392
投票
if(characterCode == 13)
{
    return false; // returning false will prevent the event from bubbling up.
}
else
{
    return true;
}

好的,假设您在表单中有以下文本框:

<input id="scriptBox" type="text" onkeypress="return runScript(event)" />

为了在按下回车键时从该文本框运行一些“用户定义”脚本,而不是让它提交表单,这里有一些示例代码。请注意,此功能不会执行任何错误检查,并且很可能仅适用于IE。要做到这一点,你需要一个更强大的解决方案,但你会得到一般的想法。

function runScript(e) {
    //See notes about 'which' and 'key'
    if (e.keyCode == 13) {
        var tb = document.getElementById("scriptBox");
        eval(tb.value);
        return false;
    }
}

返回函数的值将提醒事件处理程序不要再进一步冒泡事件,并将阻止进一步处理keypress事件。

注意:

有人指出,keyCodenow deprecated。下一个最好的替代whichalso been deprecated

不幸的是,现代浏览器广泛支持的受欢迎的标准key有一些dodgy behavior in IE and Edge。任何比IE11更旧的东西仍然需要一个polyfill

此外,尽管对于keyCodewhich这个被弃用的警告是非常不祥的,但删除这些警告将代表对无数遗留网站的巨大改变。出于这个原因,他们不太可能很快就会去任何地方。


3
投票

一个jQuery解决方案。

我来到这里寻找一种方法来延迟表单提交,直到文本输入上的模糊事件被触发为止。

$(selector).keyup(function(e){
  /*
   * Delay the enter key form submit till after the hidden
   * input is updated.
   */

  // No need to do anything if it's not the enter key
  // Also only e.which is needed as this is the jQuery event object.
  if (e.which !== 13) {
       return;
  }

  // Prevent form submit
  e.preventDefault();

  // Trigger the blur event.
  this.blur();

  // Submit the form.
  $(e.target).closest('form').submit();
});

获得一个更通用的版本来解雇所有延迟事件而不仅仅是表单提交会很高兴。


2
投票

从我的角度来看,一个更简单有效的方法应该是:

function onPress_ENTER()
{
        var keyPressed = event.keyCode || event.which;

        //if ENTER is pressed
        if(keyPressed==13)
        {
            alert('enter pressed');
            keyPressed=null;
        }
        else
        {
            return false;
        }
}

2
投票

使用TypeScript,并避免对函数进行多次调用

let el1= <HTMLInputElement>document.getElementById('searchUser');
el1.onkeypress = SearchListEnter;

function SearchListEnter(event: KeyboardEvent) {
    if (event.which !== 13) {
        return;
    }
    // more stuff
}

2
投票

因此,也许最好的解决方案可以涵盖尽可能多的浏览器,并且可以作为未来的证明

if (event.which === 13 || event.keyCode === 13 || event.key === "Enter")

1
投票

native js (fetch api)

document.onload = (() => {
    alert('ok');
    let keyListener = document.querySelector('#searchUser');
    // 
    keyListener.addEventListener('keypress', (e) => {
        if(e.keyCode === 13){
            let username = e.target.value;
            console.log(`username = ${username}`);
            fetch(`https://api.github.com/users/${username}`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((user)=>{
                console.log(`user = ${user}`);
            });
            fetch(`https://api.github.com/users/${username}/repos`,{
                data: {
                    client_id: 'xxx',
                    client_secret: 'xxx'
                }
            })
            .then((repos)=>{
                console.log(`repos = ${repos}`);
                for (let i = 0; i < repos.length; i++) {
                     console.log(`repos ${i}  = ${repos[i]}`);
                }
            });
        }else{
            console.log(`e.keyCode = ${e.keyCode}`);
        }
    });
})();
<input _ngcontent-inf-0="" class="form-control" id="searchUser" placeholder="Github username..." type="text">

0
投票
<div class="nav-search" id="nav-search">
        <form class="form-search">
            <span class="input-icon">
                <input type="text" placeholder="Search ..." class="nav-search-input" id="search_value" autocomplete="off" />
                <i class="ace-icon fa fa-search nav-search-icon"></i>
            </span>
            <input type="button" id="search" value="Search" class="btn btn-xs" style="border-radius: 5px;">
        </form>

</div>

<script type="text/javascript">
    $("#search_value").on('keydown', function(e) {
        if (e.which == 13) {
             $("#search").trigger('click');
            return false;
        }
    });
    $("#search").on('click',function(){
        alert('You press enter');
    });
</script>

0
投票

有点简单

不要在按键“Enter”上发送表格:

<form id="form_cdb" onsubmit="return false">

在按键“Enter”上执行该功能:

<input type="text" autocomplete="off" onkeypress="if(event.key === 'Enter') my_event()">

0
投票

无论弃用的浏览器功能如何,此函数preventKey()都能正常工作。

只有三个属性中的一个which(已弃用),keyCode(已弃用)或key(IE中的问题)必须存在。

https://jsfiddle.net/tobiobeck/z13dh5r2/

JS

function preventKey(event, expectedKey, expectedCode) {
  const code = event.which || event.keyCode;

  if (expectedKey === event.key || code === expectedCode) {
    return true;
  }
  return false;
}

document.getElementById('myInput').addEventListener('keydown', function(event) {

  if (preventKey(event, 'Enter', 13)) {
    event.preventDefault();
  }
});

HTML

<form>
  <input id="myInput">
</form>

浏览器测试

如果您想手动测试不同的浏览器,请注释或取消注释以下三个event.something行之一:

var event = {};
event.which = 13;
//event.keyCode = 13;
//event.key = 'Enter'

if (preventKey(event, 'Enter', 13)) {
  console.log('enter was pressed');
}

122
投票

同时使用event.whichevent.keyCode

function (event) {
    if (event.which == 13 || event.keyCode == 13) {
        //code to execute here
        return false;
    }
    return true;
};

71
投票

如果你正在使用jQuery:

$('input[type=text]').on('keydown', function(e) {
    if (e.which == 13) {
        e.preventDefault();
    }
});

45
投票

event.key === "Enter"

更新,更清洁:使用event.key。没有更多的任意数字代码!

const node = document.getElementsByClassName(".mySelect")[0];
node.addEventListener("keydown", function(event) {
    if (event.key === "Enter") {
        event.preventDefault();
        // Do more work
    }
});

Mozilla Docs

Supported Browsers


19
投票

检测按下整个文档的Enter键:

$(document).keypress(function (e) {
    if (e.which == 13) {
        alert('enter key is pressed');
    }
});

http://jsfiddle.net/umerqureshi/dcjsa08n/3/


17
投票

覆盖表单的onsubmit操作以调用您的函数并在其后添加return false,即:

<form onsubmit="javascript:myfunc();return false;" >

14
投票

一个反应js解决方案

 handleChange: function(e) {
    if (e.key == 'Enter') {
      console.log('test');
    }


 <div>
    <Input type="text"
       ref = "input"
       placeholder="hiya"
       onKeyPress={this.handleChange}
    />
 </div>

5
投票

下面的代码将在整个页面上添加ENTER键的监听器。

这在具有单个操作按钮的屏幕中非常有用,例如登录,注册,提交等。

<head>
        <!--Import jQuery IMPORTANT -->
        <script src="https://code.jquery.com/jquery-2.1.1.min.js"></script>

         <!--Listen to Enter key event-->
        <script type="text/javascript">

            $(document).keypress(function (e) {
                if (e.which == 13 || event.keyCode == 13) {
                    alert('enter key is pressed');
                }
            });
        </script>
    </head>

在所有浏览器上测试过。


5
投票

如果你想用纯粹的java脚本来做这里是一个完美的例子

假设这是你的html文件

<!DOCTYPE html>
<html>
  <body style="width: 500px">
    <input type="text" id="textSearch"/> 
      <script type="text/javascript" src="public/js/popup.js"></script>
  </body>
</html>

在你的popup.js文件中只使用这个功能

var input = document.getElementById("textSearch");
input.addEventListener("keyup", function(event) {
    event.preventDefault();
    if (event.keyCode === 13) {
        alert("yes it works,I'm happy ");
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.