사용자가 입력 할 때 텍스트 상자에 텍스트를 가져 오려고 합니다 ( jsfiddle 놀이터 ).
function edValueKeyPress() {
var edValue = document.getElementById("edValue");
var s = edValue.value;
var lblValue = document.getElementById("lblValue");
lblValue.innerText = "The text box contains: " + s;
//var s = $("#edValue").val();
//$("#lblValue").text(s);
}
<input id="edValue" type="text" onKeyPress="edValueKeyPress()"><br>
<span id="lblValue">The text box contains: </span>
이 코드는 것을 제외하고, 오류없이 실행 값 의 input text
동안, 상자 onKeyPress
값 항상 전에 변화가 :
질문 : 텍스트 상자의 텍스트를 어떻게 얻
onKeyPress
습니까?
보너스 채터
HTML DOM에는 “사용자가 입력 중” 과 관련된 세 가지 이벤트가 있습니다 .
onKeyDown
onKeyPress
onKeyUp
Windows 에서는 WM_Key
사용자가 키를 누르고 있고 키가 반복되기 시작하면 메시지 순서 가 중요해집니다.
WM_KEYDOWN('a')
-사용자가 A키를 눌렀습니다.WM_CHAR('a')
–a
사용자로부터 캐릭터를 받았습니다.WM_CHAR('a')
–a
사용자로부터 캐릭터를 받았습니다.WM_CHAR('a')
–a
사용자로부터 캐릭터를 받았습니다.WM_CHAR('a')
–a
사용자로부터 캐릭터를 받았습니다.WM_CHAR('a')
–a
사용자로부터 캐릭터를 받았습니다.WM_KEYUP('a')
-사용자가 A키를 놓았습니다.
텍스트 컨트롤에 5 개의 문자가 나타납니다. aaaaa
중요한 점은 WM_CHAR
메시지에 응답 하는 것, 반복 되는 메시지입니다. 그렇지 않으면 키를 누를 때 이벤트가 누락됩니다.
HTML 에서는 약간 다릅니다.
onKeyDown
onKeyPress
onKeyDown
onKeyPress
onKeyDown
onKeyPress
onKeyDown
onKeyPress
onKeyDown
onKeyPress
onKeyUp
html로는 제공 KeyDown
하고 KeyPress
모든 키 반복합니다. 그리고 KeyUp
이벤트는 사용자가 키를 놓을 때만 발생합니다.
테이크 아웃
- 나는 수 에 응답
onKeyDown
하거나onKeyPress
,하지만 전에 모두는 여전히 제기되는input.value
업데이트되었습니다 onKeyUp
텍스트 상자의 텍스트가 변경 될 때 발생하지 않기 때문에에 응답 할 수 없습니다 .
질문 : 텍스트 상자의 텍스트를 어떻게 얻 onKeyPress
습니까?
보너스 읽기
답변
input
이벤트 처리는 일관된 솔루션입니다. 모든 최신 브라우저에서 및 요소에 대해 지원 되며 필요할 때 정확히 실행 됩니다.textarea
input
function edValueKeyPress() {
var edValue = document.getElementById("edValue");
var s = edValue.value;
var lblValue = document.getElementById("lblValue");
lblValue.innerText = "The text box contains: " + s;
}
<input id="edValue" type="text" onInput="edValueKeyPress()"><br>
<span id="lblValue">The text box contains: </span>
그래도 조금 다시 작성하겠습니다.
function showCurrentValue(event)
{
const value = event.target.value;
document.getElementById("lblValue").innerText = value;
}
<input id="edValue" type="text" onInput="showCurrentValue(event)"><br>
The text box contains: <span id="lblValue"></span>
답변
단순하게 유지하십시오. onKeyPress()
및 모두 사용 onKeyUp()
:
<input id="edValue" type="text" onKeyPress="edValueKeyPress()" onKeyUp="edValueKeyPress()">
이렇게하면 가장 많이 업데이트 된 문자열 값 (키를 올린 후)을 가져오고 사용자가 키를 누르고 있으면 업데이트됩니다.
jsfiddle : http://jsfiddle.net/VDd6C/8/
답변
onKeyPress 동안 입력 텍스트 상자의 값은 항상 변경 전의 값입니다.
이것은 의도적 인 것입니다. 이벤트 리스너가 키 누르기를 취소 할 수 있도록합니다.
이벤트 리스너가 이벤트를 취소 하면 값이 업데이트되지 않습니다. 이벤트가 취소되지 않은 경우 값이 업데이트되지만 이벤트 리스너가 호출 된 후 입니다.
필드 값이 업데이트 된 후 값을 얻으려면 다음 이벤트 루프에서 실행할 함수를 예약하십시오. 이를 수행하는 일반적인 방법은 다음 setTimeout
과 같은 시간 초과 로 호출 하는 것입니다 0
.
$('#field').keyup(function() {
var $field = $(this);
// this is the value before the keypress
var beforeVal = $field.val();
setTimeout(function() {
// this is the value after the keypress
var afterVal = $field.val();
}, 0);
});
여기에서 시도하십시오 : http://jsfiddle.net/Q57gY/2/
편집 : 일부 브라우저 (예 : Chrome)는 백 스페이스에 대한 키 누르기 이벤트를 트리거하지 않습니다. 코드에서 keypress를 keyup으로 변경했습니다.
답변
컴팩트하게 유지하십시오.
키를 누를 때마다 함수 edValueKeyPress()
가 호출됩니다.
또한 해당 함수에서 일부 변수를 선언하고 초기화했습니다. 이로 인해 프로세스 속도가 느려지고 CPU와 메모리도 더 많이 필요합니다.
간단한 대체에서 파생 된이 코드를 간단히 사용할 수 있습니다.
function edValueKeyPress()
{
document.getElementById("lblValue").innerText =""+document.getElementById("edValue").value;
}
그게 당신이 원하는 전부이며 더 빠릅니다!
답변
<asp:TextBox ID="txtMobile" runat="server" CssClass="form-control" style="width:92%; margin:0px 5px 0px 5px;" onkeypress="javascript:return isNumberKey(event);" MaxLength="12"></asp:TextBox>
<script>
function isNumberKey(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
}
return true;
}
</script>
답변
지금까지 완전한 솔루션을 제공하는 답변은 없습니다. 해결해야 할 몇 가지 문제가 있습니다.
- 모든 키 누름이에 전달되지 않음
keydown
및keypress
핸들러 (예 : 백 스페이스 및 삭제 키는 일부 브라우저에서 억제됨). - 손질
keydown
은 좋은 생각이 아닙니다. keydown으로 인해 keypress가 발생하지 않는 상황이 있습니다! setTimeout()
스타일 솔루션은 사용자가 입력을 중지 할 때까지 Chrome / Blink 웹 브라우저에서 지연됩니다.- 마우스 및 터치 이벤트를 사용하여 잘라 내기, 복사 및 붙여 넣기와 같은 작업을 수행 할 수 있습니다. 이러한 이벤트는 키보드 이벤트를 트리거하지 않습니다.
- 입력 방법에 따라 브라우저는 사용자가 필드를 벗어날 때까지 요소가 변경되었다는 알림을 전달하지 않을 수 있습니다.
더 정확한 해결책은 처리 할 keypress
, keyup
, input
, 및 change
이벤트를.
예:
<p><input id="editvalue" type="text"></p>
<p>The text box contains: <span id="labelvalue"></span></p>
<script>
function UpdateDisplay()
{
var inputelem = document.getElementById("editvalue");
var s = inputelem.value;
var labelelem = document.getElementById("labelvalue");
labelelem.innerText = s;
}
// Initial update.
UpdateDisplay();
// Register event handlers.
var inputelem = document.getElementById("editvalue");
inputelem.addEventListener('keypress', UpdateDisplay);
inputelem.addEventListener('keyup', UpdateDisplay);
inputelem.addEventListener('input', UpdateDisplay);
inputelem.addEventListener('change', UpdateDisplay);
</script>
깡깡이:
http://jsfiddle.net/VDd6C/2175/
네 가지 이벤트를 모두 처리하면 모든 엣지 케이스를 포착합니다. 사용자의 입력으로 작업 할 때 모든 유형의 입력 방법을 고려하고 브라우저 간 및 장치 간 기능을 확인해야합니다. 위 코드는 내가 소유 한 모바일 장치뿐만 아니라 데스크톱의 Firefox, Edge 및 Chrome에서 테스트되었습니다.
답변
나는 일반적으로 필드의 값 (즉, 업데이트되기 전)을 키 이벤트와 관련된 키와 연결합니다. 다음은 최신 JS를 사용하므로 이전 IE의 지원을 조정해야합니다.
최근 JS 예
document.querySelector('#test').addEventListener('keypress', function(evt) {
var real_val = this.value + String.fromCharCode(evt.which);
if (evt.which == 8) real_val = real_val.substr(0, real_val.length - 2);
alert(real_val);
}, false);
이전 IE 지원 예
//get field
var field = document.getElementById('test');
//bind, somehow
if (window.addEventListener)
field.addEventListener('keypress', keypress_cb, false);
else
field.attachEvent('onkeypress', keypress_cb);
//callback
function keypress_cb(evt) {
evt = evt || window.event;
var code = evt.which || evt.keyCode,
real_val = this.value + String.fromCharCode(code);
if (code == 8) real_val = real_val.substr(0, real_val.length - 2);
}
[편집-이 방법은 기본적으로 백 스페이스, CTRL + A와 같은 키 누름을 비활성화합니다. 위의 코드는 전자를 수용하지만 후자와 몇 가지 다른 결과를 허용하기 위해 추가 수정이 필요합니다. 아래 Ian Boyd의 의견을 참조하십시오.]