입력 요소의 Javascript 변경 이벤트가 포커스를 잃을 때만 발생합니다.


84

입력 요소가 있고 내용의 길이를 계속 확인하고 길이가 특정 크기와 같을 때마다 제출 버튼을 활성화하고 싶지만 Javascript의 onchange 이벤트를 이벤트로 사용하는 데 문제가 있습니다. 입력 요소가 범위를 벗어날 때만 발생하고 내용이 변경 될 때 발생하지 않습니다.

<input type="text" id="name" onchange="checkLength(this.value)" />

---- onchange는 이름의 내용을 변경할 때 실행되지 않지만 이름이 초점을 벗어난 경우에만 실행됩니다.

이 이벤트가 콘텐츠 변경에 적용되도록 할 수있는 작업이 있습니까? 또는 이것을 위해 사용할 수있는 다른 이벤트? onkeyup 기능을 사용하여 해결 방법을 찾았지만 브라우저의 자동 완성기에서 일부 콘텐츠를 선택하면 실행되지 않습니다.

필드의 내용이 키보드로든 마우스로든 변경 될 때 작동 할 수있는 무언가를 원합니다. 아이디어가 있습니까?


당신은 사용할 수 onkeyuponchange?
James Allardice

1
내가 가진 유일한 문제는 브라우저의 자동 완성기 선택으로 인해 이러한 이벤트가 발생하지 않는다는 것입니다.
Sachin Midha

이것은 어떤 종류의 입력 필드입니까?
powtac

오 ... 샘플 코드에 추가하는 것을 잊었습니다. 텍스트 필드입니다.
Sachin Midha

1
:) ... 나는 이것이 매우 일반적인 문제 및 많은 사람들이 그것을 직면했을했을 생각했지만, 지금은 다른 방법으로 라운드를 보인다
Sachin Midha에게

답변:


120
(function () {
    var oldVal;

    $('#name').on('change textInput input', function () {
        var val = this.value;
        if (val !== oldVal) {
            oldVal = val;
            checkLength(val);
        }
    });
}());

이 잡을 것 change, 키 입력을, paste, textInput, input(가능한 경우). 그리고 필요 이상으로 발사하지 마십시오.

http://jsfiddle.net/katspaugh/xqeDj/


참조 :

textInput— W3C DOM 레벨 3 이벤트 유형. http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

사용자 에이전트는 하나 이상의 문자가 입력 된 경우이 이벤트를 전달해야합니다. 이러한 문자는 다양한 소스, 예를 들어 키보드 장치에서 키를 눌렀거나 놓아서 발생하는 문자, 입력 방법 편집기의 처리 또는 음성 명령으로 인해 발생하는 문자에서 유래 할 수 있습니다. "붙여 넣기"작업이 구조 또는 스타일 정보가없는 텍스트 구절과 같이 간단한 문자 시퀀스를 생성하는 경우이 이벤트 유형도 생성되어야합니다.

inputHTML5 이벤트 유형.

사용자가 값을 변경할 때 컨트롤에서 발생

Firefox, Chrome, IE9 및 기타 최신 브라우저에서 지원합니다.

이 이벤트는 요소가 포커스를 잃을 때 발생하는 onchange 이벤트와 달리 수정 직후에 발생합니다.


1
작동하지 않습니다 ... 끝에서 코드를 확인 했습니까 ?? 자동 완성기에서 선택 작업을하고 있었나요 ...?
Sachin Midha 2011-08-18

textInputChrome 15에서 확인 했는데 작동합니다. inputIE9에서 이벤트를 확인 했는데도 작동합니다. Firefox는을 지원해야 DOMAttrModified하지만 설치하지 않았습니다. 이 두 이벤트는 모든 종류의 텍스트 입력에서 발생하기 때문에 기대할 수있는 최선의 방법입니다.
katspaugh

1
굉장한 솔루션 .... 입력은 저에게 축복처럼 작동했습니다 ... 입력 외에 다른 것은 필요하지 않습니다. 그것은 FF4에 작동하지만 3.X에하지 않는, 내 바탕 화면에 3.6을했다 및이 일한 적이 ...
Sachin Midha

5
업데이트를 유지하기 위해 현재이 솔루션은 FF22의 단일 입력 변경으로 여러 번 실행되었습니다. 키 누르기 또는 텍스트 입력 이벤트를 사용할 필요가 없습니다. 입력 및 속성 변경으로 충분해야합니다
cyber-guard

1
IE9와 Firefox (36.0.4)를 포괄 할 수있는 최상의 조합 changekeyup,,을 발견했습니다 input. keypress은 삭제하고 백 스페이스와 같은 것들 캡처하지 않았기 때문에 이벤트는 IE9에서 작동하지 않았다 input키보드로하고 상황에 맞는 메뉴와 붙여 넣기 이벤트 커버.
TLS

9

katspaugh의 답변에 대한 확장으로 CSS 클래스를 사용하여 여러 요소에 대해 수행하는 방법이 있습니다.

   $('.myclass').each(function(){
        $(this).attr('oldval',$(this).val());
   });

   $('.myclass').on('change keypress paste focus textInput input',function(){
       var val = $(this).val();
       if(val != $(this).attr('oldval') ){
           $(this).attr('oldval',val); 
           checkLength($(this).val());
        }
    });

4

찾는 데 30 분이 걸렸지 만 2019 년 6 월에 작동합니다.

<input type="text" id="myInput" oninput="myFunction()">

js에서 프로그래밍 방식으로 이벤트 리스너를 추가하려는 경우

inputElement.addEventListener("input", event => {})

3

jQuery 방식으로 수행하십시오.

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


$('#name').keyup(function() {
  alert('Content length has changed to: '+$(this).val().length);
});

1
이것은 또한 필드가 초점을 잃을 때만 발사됩니다.
Felix Kling 2011-08-18

) @Felix 클링은, 사실, 그것은) (의 keyup로 변경
powtac

다시 keyup에 대한 동일한 문제 ... 나는 그것을 사용했고 그것에 문제가 있었다. 내 완전한 질문을 읽으십시오.
Sachin Midha

0

onkeyup을 사용할 수 있습니다.

<input id="name" onkeyup="checkLength(this.value)" />

나는 onkeyup을 사용했지만 사용자가 브라우저의 자동 완성기에서 선택하면이 이벤트가 트리거되지 않습니다. 이미 사용한 해결 방법의 질문에 이것을 작성했습니다 ...
Sachin Midha

0

모든 가능성을 포착하려면 onkeyuponclick(또는 onmouseup) 조합을 사용해야합니다 .

<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />

좋은 시도이지만 여기서 문제는 입력 요소가 아니라 자동
완성기에서

내가 생각할 수있는 유일한 또 다른 것은 끔찍한 일 setTimeout입니다. 필드의 가치를 주기적으로 확인하는 것입니다. 정확히 무엇을 하시겠습니까?
DaveRandom

그것은 매우 끔찍합니다 ... : D 이것은 암호 강도 표시기가하는 일과 유사하며, 암호를 계속 입력 할 때 암호 강도를 알려줍니다. 입력 한 문자열의 길이가 10 일 때만 버튼을 활성화하고 싶지 않으면 비활성화 상태로 유지합니다. 나는 ... 당신이있어 희망을
Sachin Midha에게

0

여기에 동일한 문제에 대해 개발 한 또 다른 솔루션이 있습니다. 그러나 많은 입력 상자를 사용하므로 이전 값을 요소 자체의 사용자 정의 속성 인 "데이터 값"으로 유지합니다. jQuery를 사용하면 관리하기가 매우 쉽습니다.

        $(document).delegate('.filterBox', 'keyup', { self: this }, function (e) {
            var self = e.data.self;

            if (e.keyCode == 13) {
                e.preventDefault();
                $(this).attr('data-value', $(this).val());
                self.filterBy(this, true)
            }
            else if (e.keyCode == 27) {
                $(this).val('');
                $(this).attr('data-value', '');
                self.filterBy(this, true)
            }
            else {
                if ($(this).attr('data-value') != $(this).val()) {
                    $(this).attr('data-value', $(this).val());
                    self.filterBy(this);
                }
            }
        });

여기에 5-6 개의 입력 상자에 'filterBox'클래스가 있으며 데이터 값이 자체 값과 다른 경우에만 filterBy 메서드를 실행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.