[英]How do I make “Enter” keypress in an <input> Element shift focus to the next <input> element on the page. (JavaScript)
如何使<input>
元素中的Enter键转移焦点到页面上的下一个<input>
元素?
我有一个for循环,该循环创建带有<input>
元素的<li>
元素。 我需要做的是,当用户在键盘上按下Enter键时,网站将专注于下一个输入字段,以便用户可以输入下一个玩家名称,而不必在使用鼠标和键盘之间进行切换。
我以为使用nextSibling
属性是解决方案,但它不会起作用,因为<input>
元素在技术上没有任何兄弟姐妹,因为每个兄弟姐妹都在不同的<li>
元素的子元素内/是它们的子元素。
这是我的JavaScript:
for ( var i = 1 ; i <= numberOfPlayers ; i++ ){
var inputElement = document.createElement('input');
var liElement = document.createElement('li');
inputElement.setAttribute( 'type' , 'text' );
inputElement.setAttribute ( 'id' , 'name-input-' + i );
inputElement.setAttribute ( 'class' , 'name-input');
inputElement.setAttribute ( 'placeholder' , 'Enter a name for player ' + i );
liElement.appendChild(inputElement);
nameInputArray[i] = inputElement;
document.getElementById('name-list').appendChild(liElement);
inputElement.addEventListener( 'keypress' , function(event){
if ( event.which === 13 ) {
alert(this);
document.getElementById( 'name-input-' + (i+1)).focus();
}
} );
}
我尝试在for循环和字符串连接中使用“ i”来选择下一个元素的ID,但是“ i”变量也不起作用,因为在代码运行时“ i”等于最高编号在整个for循环运行之后。
$('input').on('keyup', function(event){
if(event.keyCode == 13){ // 13 is the keycode for enter button
$(this).next('input').focus();
}
});
https://jsfiddle.net/jat1merL/
你在找这个吗?
顺便说一句,使用keyup而不是keypress。 如果按住某个键,它将以无法处理的速度触发大量按键事件;)
问题:
实际代码的问题在于,在事件处理程序callback
函数中, i
始终等于numberOfPlayers+1
,因此,您尝试着重于null
元素,可以阅读有关JavaScript闭包的更多信息,以了解为什么i
始终等于numberOfPlayers+1
。
解:
首先,您需要在输入上使用onkeypress
事件,然后测试按下的键是否为Enter键 ,如果按下该键 ,则获取当前input
的id
,从中提取i
值,并使用下一个id
专注于下一个input
元素。
这应该是您的代码:
inputElement.addEventListener('keypress', function(event) {
if (event.which === 13) {
var i = parseInt(this.id.charAt(this.id.length-1));
console.log(i);
if(i<=numberOfPlayers){
document.getElementById('name-input-' + (i + 1)).focus();
}
}
});
这是一个工作片段:
var numberOfPlayers = 5; var nameInputArray = []; for (var i = 1; i <= numberOfPlayers; i++) { var inputElement = document.createElement('input'); var liElement = document.createElement('li'); inputElement.setAttribute('type', 'text'); inputElement.setAttribute('id', 'name-input-' + i); inputElement.setAttribute('class', 'name-input'); inputElement.setAttribute('placeholder', 'Enter a name for player ' + i); liElement.appendChild(inputElement); nameInputArray[i] = inputElement; document.getElementById('name-list').appendChild(liElement); inputElement.addEventListener('keypress', function(event) { if (event.which === 13) { var i = parseInt(this.id.charAt(this.id.length - 1)); console.log(i); if(i<numberOfPlayers){ document.getElementById('name-input-' + (i + 1)).focus(); } } }); }
<ul id="name-list"></ul>
如果您想坚持使用香草JS,请使用以下命令:
for (var i = 1; i <= numberOfPlayers; i++) {
var inputElement = document.createElement("input");
var liElement = document.createElement("li");
inputElement.type = "text";
inputElement.id = "name-input-" + i;
inputElement.className = "name-input";
inputElement.placeholder = "Enter a name for player " + i;
liElement.appendChild(inputElement);
nameInputArray[i] = inputElement;
document.getElementById("name-list").appendChild(liElement);
(function(i) {
inputElement.addEventListener("keypress", function(event) {
if (event.which === 13) {
alert(this);
document.getElementById("name-input-" + (i + 1)).focus();
}
});
})(i);
}
这是我的解决方案。
不要忘记,需要将创建的<li>
元素追加到<body>
类的后面。 实际上,我已经添加了一个<ul>
元素并将其附加到<body>
,然后将<li>
元素附加到了<ul>
元素。
如果使用nextSibling
,则无需将元素保留在nameInputArray
。 我没有删除它来显示在循环中使用它之前应该如何初始化它。 另外, nextSibling
在我的解决方案中也可以使用,因为我将所有<li>
放在一个<ul>
,我认为这是正确的做法 。
除此之外,我只是在这里和那里纠正了一些问题。 如果您对此代码还有其他疑问,请告诉我。
function eventFunc(event) { if (event.which === 13) { var nextInput = event.target.parentElement.nextSibling.childNodes[0]; if (nextInput !== null) nextInput.focus(); } } var numberOfPlayers = 4; var nameInputArray = []; var ulElement = document.createElement('ul'); document.body.append(ulElement); for (var i = 0; i < numberOfPlayers; i++) { var liElement = document.createElement('li'); ulElement.append(liElement); var inputElement = document.createElement('input'); inputElement.setAttribute('type', 'text'); inputElement.setAttribute('id', 'name-input-' + i); inputElement.setAttribute('class', 'name-input'); inputElement.setAttribute('placeholder', 'Enter a name for player ' + i); inputElement.setAttribute('onkeypress', "eventFunc(event)"); liElement.appendChild(inputElement); nameInputArray[i] = inputElement; }
更新 :从父<li>
元素获取每个输入框:
经过OP的评论,我看到他们想要这样的结构:
<ul>
<li>input box1</li>
<li>input box2</li>
<li>input box3</li>
</ul>
在此结构中,每个输入框都是其父<li>
元素的第一个子节点。 因此,我们仍然可以通过这种方式使用nextSibling
(作为打算使用的OP):
nextInput = event.target.parentElement.nextSibling.childNodes[0];
该行首先找到父<li>
元素,应用nextSibling
获取下一个li
元素,然后获取该元素内部的输入框。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.