jQuery에서 val ()이 change ()를 트리거하지 않습니다.


343

change버튼으로 값을 변경하면 텍스트 상자 에서 이벤트 를 트리거하려고하는데 작동하지 않습니다. 이 바이올린을 확인하십시오 .

텍스트 상자에 무언가를 입력하고 다른 곳을 클릭 change하면 트리거됩니다. 그러나 단추를 클릭하면 텍스트 상자 값이 변경되지만 change트리거되지는 않습니다. 왜?



제목 자체가 내 질문에 대답했습니다. .change () 에서 확인 됨 "참고 : 예를 들어 .val ()을 사용하여 JavaScript를 사용하여 입력 요소의 값을 변경하면 이벤트가 발생하지 않습니다."
Bob Stein

내가 건너가 좋겠 stackoverflow.com/questions/11873721/... , 빨리가 어떤 도움이되기를 바랍니다.
JeopardyTempest

답변:


454

onchange 사용자가 입력을 입력하면 입력이 포커스를 잃을 때만 발생합니다.

onchange값을 설정 한 후을 사용 하여 이벤트를 수동으로 호출 할 수 있습니다 .

$("#mytext").change(); // someObject.onchange(); in standard JS

또는 다음을 사용하여 이벤트를 트리거 할 수 있습니다 .

$("#mytext").trigger("change");

18
jquery를 확장하고 원하는 것을 할 valWithChange 함수를 추가하십시오. 그것은 당신이 자동화 값 변경에서 트리거 이벤트를 싶지 않아 여러 번 기본 작업이 될 수 없습니다, 경우에만 요소와 사용자의 상호 작용
redsquare

8
나는 체인의 옵션을 해결하기 위해 편집이 답변을보고 싶다 .change()받는 .val()방법을.
Snekse 2016 년

19
입력 유효성 검사 .val().change()하기 때문에 일부 사람들이 전화를 걸기 때문일 수 있습니다 . 트리거 .change()에하는 .val()무한 루프가 발생할 것입니다.
초에 yingted

7
자신의 유효성 검사에 실패한 것으로 값을 변경하는 경우에만 가능합니다.
Leng

3
나는 blur비슷한 것을 성취 하기 위해 결속을 $('#mytext').focus().val('New text').blur();
Wes Johnson

63

redsquare의 훌륭한 제안에서 이것은 잘 작동합니다.

$.fn.changeVal = function (v) {
    return this.val(v).trigger("change");
}

$("#my-input").changeVal("Tyrannosaurus Rex");

5
포장 할 필요가 없습니다 this.return this.val(v).trigger("change");
Mr. Polywhirl

27

val원래 val함수 의 프록시로 바꾸어 변경을 트리거 하도록 함수를 매우 쉽게 재정의 할 수 있습니다 .

jQuery를로드 한 후 문서 어딘가에이 코드를 추가하십시오.

(function($){
    var originalVal = $.fn.val;
    $.fn.val = function(){
        var result =originalVal.apply(this,arguments);
        if(arguments.length>0)
            $(this).change(); // OR with custom event $(this).trigger('value-changed');
        return result;
    };
})(jQuery);

실례 : 여기

( 실제로 값이 변경되지 않은 경우에도 호출 change될 때 트리거 됩니다 val(new_val).)

값이 실제로 변경되었을 때만 변경을 트리거하려면 다음 중 하나를 사용하십시오.

//This will trigger "change" event when "val(new_val)" called 
//with value different than the current one
(function($){
    var originalVal = $.fn.val;
    $.fn.val = function(){
        var prev;
        if(arguments.length>0){
            prev = originalVal.apply(this,[]);
        }
        var result =originalVal.apply(this,arguments);
        if(arguments.length>0 && prev!=originalVal.apply(this,[]))
            $(this).change();  // OR with custom event $(this).trigger('value-changed')
        return result;
    };
})(jQuery);

이에 대한 실제 예 : http://jsfiddle.net/5fSmx/1/


4
흠, 불필요한 오리 패치, 나는 생각 :-p. 로, 더 나은 때문일 수 있습니다 redsquare에 의해 주석 , 이러한 기능을보다 다른 이름을 지정 .val().
binki

1
이름을 바꾸면 기존 코드를 변경해야합니다. 기존 코드는 계속 작동합니다
Yaron U.

4
그러나 올바른 정의를 .val()염두에두고 작성된 모든 코드 는 갑자기 부작용을 일으키기 시작합니다 :-p.
binki

2
또한 플러그인이 제대로 작동하지 않아서 쉽게 고칠 수 없을 수도 있습니다.
SoWhat

1
부작용을 피하기 위해 위와 같이 val 함수를 수정했지만 다른 이벤트 ( "val")를 트리거하여 기존 코드를 유지하면서 필요할 때마다 쉽게 처리 할 수 ​​있습니다. $ (... ) .on ( 'change val', ...)
ulu


14

값을 설정 한 후 수동으로 트리거해야 할 수도 있습니다.

$('#mytext').change();

또는:

$('#mytext').trigger('change');

8

이벤트가 버블 링되지 않는 것 같습니다. 이 시도:

$("#mybutton").click(function(){
  var oldval=$("#mytext").val();
  $("#mytext").val('Changed by button');
  var newval=$("#mytext").val();
  if (newval != oldval) {
    $("#mytext").trigger('change');
  }
});

이게 도움이 되길 바란다.

$("#mytext").trigger('change')이전 값을 저장하지 않고 평범한 오래된 것을 시도했지만 .change값이 변경되지 않은 경우에도 화재가 발생합니다. 그렇기 때문에 이전 값을 저장하고 $("#mytext").trigger('change')변경된 경우에만 호출 했습니다.


현재 HTML 요소 변경을 효과적으로 구현하고 있기 때문에 더 많은 투표권을 얻지 못한 것에 놀랐습니다.
vol7ron

4

2019 년 2 월 .addEventListener()현재 jQuery .trigger()또는 .change()에서 작동하지 않으므로 Chrome 또는 Firefox를 사용하여 아래에서 테스트 할 수 있습니다.

txt.addEventListener('input', function() {
  console.log('not called?');
})
$('#txt').val('test').trigger('input');
$('#txt').trigger('input');
$('#txt').change();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" id="txt">

.dispatchEvent()대신 사용해야 합니다.

txt.addEventListener('input', function() {
  console.log('it works!');
})
$('#txt').val('yes')
txt.dispatchEvent(new Event('input'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="text" id="txt">


1

에서 https://api.jquery.com/change/ :

change그 값이 변경 될 때 이벤트 요소로 전송된다. 이 이벤트는 <input>요소, <textarea>상자 및 <select>요소로 제한됩니다 . 선택 상자, 확인란 및 라디오 버튼의 경우 사용자가 마우스로 선택하면 이벤트가 즉시 시작되지만 다른 요소 유형의 경우 요소가 포커스를 잃을 때까지 이벤트가 지연됩니다.


1

나는 이것이 오래된 스레드라는 것을 알고 있지만 다른 사람들을 위해 위의 해결책은 change이벤트를 확인하는 대신 다음과 같이 좋지 않을 수도 input있습니다. 이벤트를 확인하십시오 .

$("#myInput").on("input", function() {
    // Print entered value in a div box
    $("#result").text($(this).val());
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.