html <input type =“text”/> onchange 이벤트가 작동하지 않음


88

실험을하려고합니다. 내가 원하는 것은 사용자가 텍스트 상자에 무언가를 입력 할 때마다 대화 상자에 표시된다는 것입니다. 내가 사용 onchange이 일어날 수 있도록 이벤트 속성을하지만 일을하지 않습니다. 작동하려면 제출 버튼을 눌러야합니다. 나는 AJAX에 대해 읽었고 이것에 대해 배우려고 생각하고 있습니다. 작동하려면 AJAX가 여전히 필요합니까 아니면 간단한 JavaScript로 충분합니까? 도와주세요.

index.php

<script type="text/javascript" src="javascript.js"> </script>

<form action="index.php" method="get">
 Integer 1: <input type="text" id="num1" name="num1" onchange="checkInput('num1');" /> <br />
 Integer 2: <input type="text" id="num2" name="num2" onchange="checkInput('num2');" /> <br />
 <input type="submit" value="Compute" />
</form>

javascript.js

function checkInput(textbox) {
 var textInput = document.getElementById(textbox).value;

 alert(textInput); 
}

4
당신이에서 getElementById 호출 할 필요가 없습니다, 그래서 당신은 "이"대신 아이디로 보낼 수 있습니다
레미 bourgarel

그래 ... 감사합니다 Ash Burlaczenko가 말한대로했습니다 ...
Newbie Coder

JQuery를 사용하여 여기에 좋은 솔루션이 제안되었습니다. stackoverflow.com/a/8167009/2065594
Cyril Jacquart

답변:


127

onchange컨트롤이 흐려질 때만 트리거됩니다. onkeypress대신 시도하십시오 .


19
클립 보드에서 사용자 페이스트 후 변화를 검출하기위한 작동하지 않습니다
Juozas Kontvainis을

19
내 문제가 해결되었습니다. 내가 선호하는 onkeyup가에 새 값 취득을 위해,하지만 input( 'element.value')
stealthjong

4
또한 적어도 jquery를 사용할 때 백 스페이스 키를 누른 후 "keypress"가 발생하지 않는 것을 알 수 있습니다. 백 스페이스를 눌렀다 놓은 후 "keyup"이 발생합니다. "입력"은이 문제를 해결하고 복사-붙여 넣기에 대해서도 작동합니다. 여기에서 이것이 적절한 해결책이라고 생각합니다 (사용자 "99 문제-구문이 하나가 아닙니다"가 아래에서 지적했듯이).
Patrick Finnigan

4
'onkeypres', 'onkeyup'등은 텍스트가 변경된 경우에만 함수를 호출하고 싶을 때 해결책이 아닙니다 ! 이 경우 키 이벤트는 불필요한 트래픽을 생성합니다. (이 답변이 해결책으로 선택되었다는 점이 매우 이상합니다. 특히 투표 수가 너무 적습니다 !! 저는 답장을 반대표로 표시하는 것을 좋아하지 않기 때문에 반대표를 표시하지 않습니다. 그 이유를 설명하고 싶습니다. 하지 OK - 그것은 더 도움)!
아포 스톨

HTML ≥5 또는 jQuery ≥1.7의 경우 클립 보드에서 붙여 넣기를 처리하는 다른 솔루션이 아래에 있습니다.
user202729

42

.on('input'...jQuery 1.7 이상에서 입력 (붙여 넣기, 키업 등)에 대한 모든 변경 사항을 모니터링하는 데 사용 합니다.

정적 및 동적 입력의 경우 :

$(document).on('input', '.my-class', function(){
    alert('Input changed');
});

정적 입력에만 해당 :

$('.my-class').on('input', function(){
    alert('Input changed');
});

정적 / 동적 예제가있는 JSFiddle : https://jsfiddle.net/op0zqrgy/7/


이것은 나를 위해 완벽하게 작동했습니다-감사합니다. 다른 사용자를위한 참고 사항-onLoad 또는 모니터링을 '시작'하기 위해 실제로 위 코드를 실행하는 것을 잊지 마십시오.
Robert Penridge 2014 년

댓글에 너무 늦었지만 ... 응답하는 사용자가 일반 JavaScript를 표시하는 경우 왜 jQuery를 사용하도록 제안합니까?
Andrés Morales

@ AndrésMorales 많은 응용 프로그램이 즉시 액세스 할 수있는 공통 라이브러리이며 그렇지 않은 응용 프로그램에 간단하게 추가 할 수 있습니다. 분명히이 대답은 jQuery를 사용할 수 없거나 사용하지 않는 응용 프로그램에는 적용되지 않습니다.
rybo111

@ rybo111 맞아요! jQuery는 공통 라이브러리이며 널리 사용되지만 "JavaScript를 사용하여 두 숫자의 합"에 대한 밈 질문과이를 수행하기 위해 jQuery를 사용하는 것에 대한 가장 찬성 응답에 직접 연결됩니다. 사실은 아니지만 많은 사람들이 JavaScript와 jQuery를 분리 할 수 ​​없습니다.
Andrés Morales

@ AndrésMorales 내 대답에는 "붙여 넣기, 키업 등"이 포함됩니다. 이 질문에 대답했을 때 (7 년 전!) jQuery 솔루션이 편리했던 것을 기억합니다.
rybo111

30

마우스 클릭을 사용하여 입력 필드의 내용을 변경할 수 있기 때문에 키 입력을 확인하는 것은 부분적인 해결책 일뿐입니다. 텍스트 필드를 마우스 오른쪽 버튼으로 클릭하면 키 입력없이 값을 변경하는 데 사용할 수있는 잘라 내기 및 붙여 넣기 옵션이 있습니다. 마찬가지로 자동 완성이 활성화 된 경우 필드를 마우스 왼쪽 버튼으로 클릭하고 이전에 입력 한 텍스트의 드롭 다운을 가져올 수 있으며 마우스 클릭을 사용하여 선택 항목 중에서 선택할 수 있습니다. 키 입력 트랩은 이러한 유형의 변경 사항을 감지하지 못합니다.

안타깝게도 최소한 내가 아는 한 변경 사항을 즉시보고하는 "onchange"이벤트는 없습니다. 그러나 모든 경우에 작동하는 솔루션이 있습니다. setInterval ()을 사용하여 타이밍 이벤트를 설정합니다.

입력 필드에 "city"라는 ID와 이름이 있다고 가정 해 보겠습니다.

<input type="text" name="city" id="city" />

"city"라는 전역 변수가 있습니다.

var city = "";

페이지 초기화에 다음을 추가하십시오.

setInterval(lookForCityChange, 100);

그런 다음 lookForCityChange () 함수를 정의하십시오.

function lookForCityChange()
{
    var newCity = document.getElementById("city").value;
    if (newCity != city) {
        city = newCity;
        doSomething(city);     // do whatever you need to do
    }
}

이 예에서 "city"값은 100 밀리 초마다 확인되며 필요에 따라 조정할 수 있습니다. 원한다면 lookForCityChange ()를 정의하는 대신 익명 함수를 사용하십시오. 코드 또는 브라우저가 입력 필드에 대한 초기 값을 제공 할 수 있으므로 사용자가 작업을 수행하기 전에 "변경"에 대한 알림을받을 수 있습니다. 필요에 따라 코드를 조정하십시오.

10 분의 1 초마다 발생하는 타이밍 이벤트의 아이디어가 부적절 해 보이면 입력 필드가 포커스를받을 때 타이머를 시작하고 흐림시 종료 (clearInterval () 사용) 할 수 있습니다. 포커스를받지 않고 입력 필드의 값을 변경할 수 없다고 생각하므로 이러한 방식으로 타이머를 켜고 끄는 것이 안전 할 것입니다.


1
포커스를받지 않고 입력 필드의 값을 변경할 수없고 요소가 포커스를 잃었을 때 흐림이 발생하는 경우 onblur에서 변경 사항을 찾아 보는 것이 어떻습니까?
Pakman

입력 필드가 변경되거나 변경 후 포커스를 잃을 때 조치를 취 하시겠습니까? 즉시 행동하고 싶다면 onblur를 기다릴 수 없습니다.
Dragonfly

@Pakman 어떤 경우에는 괜찮은 솔루션입니다. 그러나 입력 한대로 검색하려면-매우 멋진 기능인 IMO (컴퓨터가 지루하지 않고 훨씬 더 빠르게 작업을 수행 할 수 있는데 사용자가 항목을 찾아야하는 이유는 무엇입니까?) 텍스트가 변경 될 때 발생해야합니다. 왜 그렇게 할 수 없습니까?
The Dag

이것이 와서 너무 슬프다.
Chuck Batson

1
@ChuckBatson이 답변은 2012 년입니다. 2016 년에 귀하의 의견을 게시 한 것으로 나타났습니다. jQuery를 사용하는 경우 제 답변을 참조하십시오. 이제 매우 쉽습니다.
rybo111

26

HTML5oninput모든 직접적인 변경 사항을 포착 하는 이벤트를 정의합니다 . 그것은 나를 위해 작동합니다.


1
type = "number"스피너 컨트롤에서도 작동합니다 (onkeypress는 작동하지 않음).
Bob

13

onchange 입력 요소에 대한 변경 사항이 사용자에 의해 커밋 된 경우에만 발생하며, 대부분의 경우 요소가 포커스를 잃을 때입니다.

요소 값이 변경 될 때마다 함수가 실행되도록하려면 oninput이벤트를 사용해야합니다 . 값이 사용자의 마우스 (예 : 붙여 넣거나 자동 채우기 등)로 변경 될 수 있으므로 키 업 / 다운 이벤트보다 낫습니다.

여기 에서 변경 이벤트 에 대해 자세히 알아보십시오.

여기 에서 입력 이벤트 에 대해 자세히 알아 보세요.


11

"onchange"대신 다음 이벤트 사용

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

6

첫째, '작동하지 않는'것은 무엇입니까? 경고가 보이지 않습니까?

또한 귀하의 코드는 이렇게 단순화 될 수 있습니다.

<input type="text" id="num1" name="num1" onkeydown="checkInput(this);" /> <br />

function checkInput(obj) {
    alert(obj.value); 
}

2

Safari가 텍스트 입력 필드에서 "onchange"이벤트를 발생시키지 않는 문제가 발생했습니다. jQuery 1.7.2 "변경"이벤트를 사용했지만 작동하지 않았습니다. 결국 ZURB의 textchange 이벤트를 사용하게되었습니다. 마우스 이벤트와 함께 작동하며 필드를 떠나지 않고도 실행할 수 있습니다.
http://www.zurb.com/playground/jquery-text-change-custom-event

$('.inputClassToBind').bind('textchange', function (event, previousText) {
    alert($(this).attr('id'));
});

2

IMO가 중요하다는 몇 가지 의견 :

  • USER 액션이 ENTER 또는 blur가 대기 할 때까지 '변경'이벤트를 생성하지 않는 입력 요소 가 올바른 동작 입니다.

  • 사용하려는 이벤트는 "input"( " oninput ")입니다. 다음은 두 가지의 차이점을 잘 보여줍니다. https://javascript.info/events-change-input

  • 두 이벤트는 두 가지 다른 사용자 동작 / 순간을 나타냅니다 ( "입력"이벤트는 사용자가 선택 목록 옵션을 작성하거나 탐색하고 있지만 여전히 변경 사항을 확인하지 않음을 의미합니다. "변경"은 사용자가 값을 변경했음을 의미합니다 (입력 또는 흐리게 표시 우리의)

  • 여기에 권장되는 많은 주요 이벤트를 수신하는 것은이 경우에 좋지 않습니다. (입력에서 ENTER의 기본 동작을 수정하는 사람들처럼) ...

  • jQuery는 이와 관련이 없습니다. 이것은 모두 HTML 표준입니다.

  • 이것이 올바른 동작 인 이유를 이해하는 데 문제가있는 경우 실험적으로 마우스 / 패드없이 키보드 만 사용하는 텍스트 편집기 나 브라우저를 사용하는 것이 도움이 될 수 있습니다.

내 2 센트.


1

onkeyup이 나를 위해 일했습니다. back space를 누를 때 onkeypress가 트리거되지 않습니다.


값을 붙여 넣으면 어떻게됩니까? 이벤트를 트리거하기 위해 "onpaste"도 사용합니다
Louis

1

onchange(event)와 함께 사용 하는 것이 좋습니다 <select>. 함께 <input>하면 이벤트 이하로 사용할 수 있습니다 :

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)

-3

시도해보십시오 onpropertychange. IE에서만 작동합니다.


6
왜 개발자가 포기한 OBSOLETE BROWSER에서만 작동하는 속성을 고려하고 싶은 사람이 있습니까? 반대 투표.
잔디 전능하신
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.