我有一个带有两个文本框的表单,一个选择下拉框和一个单选按钮。当按下enter键时,我想调用JavaScript函数,但当我按下它时,表单就提交了。

当按下回车键时,如何防止表单被提交?


当前回答

原生js(获取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">

其他回答

使用两个事件。which和event.keyCode:

function (event) {
    if (event.which == 13 || event.keyCode == 13) {
        //code to execute here
        return false;
    }
    return true;
};
if(characterCode == 13) {
    // returning false will prevent the event from bubbling up.
    return false; 
} else{
    return true;
}

好的,想象一下你在表单中有以下文本框:

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

为了在按enter键时从这个文本框运行一些“用户定义的”脚本,而不是让它提交表单,下面是一些示例代码。请注意,这个函数不做任何错误检查,很可能只在IE中工作。要做到这一点,您需要一个更健壮的解决方案,但您将得到大致的想法。

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

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

注意:

已经指出keyCode现在已弃用。退而求其次的选择也被弃用了。

不幸的是,被现代浏览器广泛支持的标准键在IE和Edge中存在一些不可靠的行为。任何比IE11更老的东西仍然需要填充。

此外,虽然弃用的警告是相当不祥的keyCode和,删除这些将代表一个巨大的突破性的变化,无数的遗留网站。出于这个原因,他们不太可能很快离开任何地方。

整个文档按下回车键:

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

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

我使用了document on,它涵盖了页面加载后动态添加的html:

  $(document).on('keydown', '.selector', function (event) {
    if (event.which == 13 || event.keyCode == 13) {
      //do your thang
    }
  });

增加来自@Bradley4的更新

跨浏览器解决方案

一些旧的浏览器以非标准的方式实现keydown事件。

KeyBoardEvent。Key是在现代浏览器中应该实现的方式。

哪一个 和keyCode现在已经被弃用了,但检查这些事件并没有什么害处,这样代码就可以为仍然使用IE等旧浏览器的用户工作。

isKeyPressed函数检查按下的键是否为enter, event.preventDefault()会阻止表单提交。

  if (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }

最小工作示例

JS

function isKeyPressed(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 (isKeyPressed(event, 'Enter', 13)) {
    event.preventDefault();
    console.log('enter was pressed and is prevented');
  }
});

HTML

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

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