2016-07-09 2 views
0

angularjs에서 하나의 입력 필드 만 사용하여 이미지와 같은 입력 필드를 만들 수 있습니까? 각 상자에는 하나의 번호 만 허용됩니다.HTML 입력을 12 개의 열로 나눕니다.

<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 
<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 
<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 
<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 
<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 
<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 
<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 
<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 
<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 
<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 
<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 
<li><input type="text" maxlength="1" onkeypress="return isNumber(event,$(this))"></li> 

function isNumber(evt,ele) { 
evt = (evt) ? evt : window.event; 
var charCode = (evt.which) ? evt.which : evt.keyCode; 
if (charCode > 31 && (charCode < 48 || charCode > 57)) { 
    return false; 
} 
if(ele.val().length == 0){ 
    ele.parent().next().children('input').focus(); 
} 


    return true; 
} 

enter image description here

나는 열두 입력 상자를 사용했다. 그것을 할 수있는 다른 방법이 있습니까? 또한 jquery를 사용하지 않아야합니다.

+0

12 개의 입력 상자를 유지하고 추가 처리를 위해 모든 숫자를 배열에 저장하는'ng-model = "numberArray [position]"지시문을 각각에 첨부 할 수 있습니다. –

+0

그 일을 더 잘 수행 할 수 있는지 알고 싶을뿐입니다. – user3702775

+0

사용자 ng-repeat을 사용해 보셨습니까? 또한 왜'ngKeyPress'를 사용하지 않으시겠습니까? https://docs.angularjs.org/api/ng/directive/ngKeypress – developer033

답변

2

아니요, 할 수 없습니다.

하지만 사용자의 백 스페이스/입력 편의성을 향상시켜 구현을 향상시킬 수 있습니다. 너무 여기

var wrapper = document.getElementById('myInputWrapper'); 
 

 
var numberOfInputs = 12; 
 
var inputList = []; 
 

 
for(var i=0; i<numberOfInputs; i++){ 
 
\t var input = document.createElement('input'); 
 
    input.type = "text"; 
 
    input.setAttribute('data-number', i+1); 
 
\t inputList.push(input); 
 
\t wrapper.appendChild(input); 
 
    input.addEventListener('keydown', function(e){ 
 
\t \t // If backspace 
 
\t \t if(isBackspace(e)){ 
 
    \t if(this.value.length == 0){ 
 
    \t \t var previus = parseInt(this.getAttribute('data-number')) - 2; 
 
     \t if(previus >= 0){ 
 
    \t \t inputList[previus].focus(); 
 
     \t } 
 
     } 
 
     return true; 
 
    } 
 
    // If isNumber 
 
    \t else if(isNumber(e)){ 
 
    \t if(this.value.length > 0){ 
 
     \t this.value = this.value[this.value.length - 1]; 
 
     var next = parseInt(this.getAttribute('data-number')); 
 
     if(next < numberOfInputs){ 
 
     \t if(inputList[next].length > 0) 
 
      \t inputList[next].value = ""; 
 
      inputList[next].focus(); 
 
     } else { 
 
     \t this.value = ""; 
 
     } 
 
     } 
 
    \t return true; 
 
\t \t } 
 
\t \t e.preventDefault(); 
 
\t \t return false; 
 
    }, false); 
 
    // Put curet on the end 
 
    input.addEventListener('click', function(e){ 
 
    \t this.value = this.value; 
 
    }, false); 
 
    // oh.. someone has paste something 
 
    input.addEventListener('paste', function(e){ 
 

 
\t // Get Text 
 
\t var pastedText = undefined; 
 
\t if (window.clipboardData && window.clipboardData.getData) { // IE 
 
\t pastedText = window.clipboardData.getData('Text'); 
 
\t } else if (e.clipboardData && e.clipboardData.getData) { 
 
\t pastedText = e.clipboardData.getData('text/plain'); 
 
\t } 
 
\t 
 
\t // Error? 
 
\t if(!pastedText) return; 
 
\t 
 
\t var digits = pastedText.match(/\d/g); 
 
\t 
 
\t // No digits 
 
\t if(!digits) return; 
 
\t 
 
\t var data = []; 
 
\t for(var i=0; i<digits.length; i++){ 
 
\t data.push(parseInt(digits[i])); 
 
\t }; 
 
\t 
 
\t updateInputs(data); 
 
\t 
 
\t e.preventDefault(); 
 
    }, false); 
 
} 
 

 
function isNumber(evt) { 
 
    evt = (evt) ? evt : window.event; 
 
    var charCode = (evt.which) ? evt.which : evt.keyCode; 
 
    if (charCode > 31 && (charCode < 48 || charCode > 57) && charCode != 8) { 
 
     return false; 
 
    } 
 
    return true; 
 
} 
 

 
function isBackspace(evt) { 
 
    evt = (evt) ? evt : window.event; 
 
    var charCode = (evt.which) ? evt.which : evt.keyCode; 
 
    if (charCode == 8) { 
 
     return true; 
 
    } 
 
    return false; 
 
} 
 

 
function updateInputs (array){ 
 
\t for(var i=0; i<array.length && i<numberOfInputs; i++) 
 
    \t inputList[i].value = ("" + array[i])[0]; 
 
    for(var i=array.length; i<numberOfInputs; i++) 
 
    \t inputList[i].value = ""; 
 
} 
 

 
function getInputs (array){ 
 
\t var data = []; 
 
\t for(var i=0; i<numberOfInputs; i++) 
 
    \t if(inputList[i].value.length == 1) 
 
    \t \t data.push(inputList[i].value); 
 
    else 
 
    \t data.push(null); 
 
    return data; 
 
} 
 

 

 
document.getElementById('testInsert').addEventListener('click', function(){ 
 
\t updateInputs([1,2,3,4,5,6,7,8,9,10,11,12]); 
 
}, false); 
 
document.getElementById('testExtract').addEventListener('click', function(){ 
 
\t alert(getInputs()); 
 
}, false);
#myInputWrapper input{ 
 
    width: 20px; 
 
    height: 20px; 
 
    line-height: 20px; 
 
    text-align: center; 
 
    border: 1px solid #afafaf; 
 
} 
 
#myInputWrapper input:not(:first-child) { 
 
    border-left: 0px; 
 
}
<div id="myInputWrapper"></div> 
 
<br> 
 
<input type="button" value="Test Data Insert" id="testInsert"> 
 
<input type="button" value="Test Data Extract" id="testExtract">

그리고 : https://jsfiddle.net/cbh0f3xe/1/

편집 붙여 넣기 지원이 추가 여기

은 예입니다.

+0

감사합니다. 이것은 훨씬 더 나은 구현입니다. PC에서 잘 작동합니다. 그러나 모바일 크롬 브라우저에서 포커스를 다음 입력으로 이동하는 기능이 작동하지 않습니다. 검사 할 때 isNumber 함수의 charCode는 항상 229입니다.이 문제를 어떻게 해결할 수 있는지 알고 있습니까? – user3702775

+0

아마도 keydown 이벤트를 keyup 또는 다른 것으로 변경해야 할 수도 있습니다. – GramThanos

관련 문제