입력에 대해 프로그래밍 방식으로 onchange 이벤트를 강제하는 방법은 무엇입니까?


123

입력에 대해 프로그래밍 방식으로 onchange 이벤트를 강제하는 방법은 무엇입니까?

나는 다음과 같은 것을 시도했다.

var code = ele.getAttribute('onchange');
eval(code);

그러나 내 최종 목표는 리스너 기능을 실행하는 것이며 작동하지 않는 것 같습니다. 'value'속성 만 업데이트하는 것도 아닙니다.

답변:


142

만들기 Event개체를하고에 전달 dispatchEvent요소의 방법 :

var element = document.getElementById('just_an_example');
var event = new Event('change');
element.dispatchEvent(event);

이렇게하면 addEventListener메서드 를 호출 하거나 onchange요소 의 속성을 설정하여 등록되었는지 여부에 관계없이 이벤트 리스너가 트리거됩니다 .


이벤트를 버블 링하려면 Event생성자에 두 번째 인수를 전달해야합니다 .

var event = new Event('change', { bubbles: true });

브라우저 호환성에 대한 정보 :


2
예, MDN 생성 및 이벤트 트리거 는 좋은 리소스입니다!
야쿱 거룩한

1
이것이 기본적으로 제대로하는 방법입니다. 지금은 모든 브라우저에서 지원 caniuse.com/#feat=dispatchevent
윌렘 멀더

1
이것은이다 사실 이 질문에 대한 대답. 우리는이를 현대적인 방식으로 달성해야합니다.
Константин Ван

1
IE11에서 동일한 작업을 수행하려고하지만 reactjs 입력 필드를 변경하려고 할 때 작동하지 않습니다. var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); elem.dispatchEvent(evt);
Bodosko

3
모든 사람들이 이것이 최선의 답이라고 말하는 이유는 무엇입니까? 링크 된 이벤트 문서에 따르면, IE의 경우에도 현재 버전은 아직 이 기능을 지원하지 않습니다.
jeff-h

96

jQuery에서는 주로 다음을 사용합니다.

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

2
tihs가 나를 도왔다! 코드를 사용하여 확인란의 값 (선택 여부)을 설정하고 있었는데 이벤트가 내가 무엇을하든 IE에서 전혀 발생하지 않았습니다. blur () focus () 및 기타 몇 가지를 시도했습니다. 내가 트리거라고 부르는 값을 설정하고 트리거를 호출하기 위해 클릭 이벤트를 추가했습니다. 여러 번의 화재가 발생하지만 나에게는 중요하지 않습니다. IE에서는 코드를 통해 체크 박스를 추가하고 변경 이벤트가 발생하기 전에 체크 박스를 두 번 클릭해야합니다. 이 팁에 감사드립니다.
Dustin Davis

6
업데이트로 $ ( "# element"). change (); jquery 1.0부터 동일한 작업을 수행합니다.
CookieOfFortune

3
이것은 네이티브 onchange를 트리거하지 않습니다. jQuery를 통해 바인딩 된 모든 onchange 리스너에서만 실행됩니다!
Willem Mulder

여기 좀 도와 주 시겠어요? 이러한 솔루션 중 어느 것도 .. 나를 위해 제대로 작동하지 stackoverflow.com/questions/51216332/...
게이브

61

ugh eval을 아무것도 사용하지 마십시오 . 글쎄요, 몇 가지가 있지만 매우 드뭅니다. 대신 다음을 수행합니다.

document.getElementById("test").onchange()

더 많은 옵션을 보려면 여기를 참조하십시오. http://jehiah.cz/archive/firing-javascript-events-properly


3
JSON 객체화 평가;)
Aaron Powell

3
JSON 객체화를위한 json2.js! JSON.parse는 이미 최신 브라우저에서 사용할 수 있습니다
jinglesthula 2011

12
이 기술 은 "onchange"를 설정하여 변경 핸들러가 연결된 경우 에만 작동합니다. w3c 또는 microsoft 이벤트 핸들러를 트리거하는 '실제'이벤트를 생성하지 않습니다. 자세한 내용은 링크를 참조하십시오.
Stephen Nelson

6
나는이 대답은 지금 오래된 생각 악당의 대답은 사용 new Event(...)하고 dispatchEvent요즘 적합한 솔루션 인 것 같습니다.
야쿱 거룩한

4
이 대답은 사용되지 않습니다 . 위의 코드는 Element.addEventListener이벤트를 처리 하는 데 사용 된 경우 작동하지 않습니다 . 현대적인 방법으로 달성하려면 @Miscreant의 답변을 참조하십시오.
Константин Ван 2011

23

어떤 이유로 ele.onchange ()가 내 페이지의 IE에서 "메서드를 찾을 수 없음"을 던지고 있으므로 Kolten이 제공 한 링크에서이 함수를 사용 하고 fireEvent (ele, 'change')를 호출했습니다. :

function fireEvent(element,event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}

그러나 나는 onchange ()가 작동 해야하는지 확인하는 테스트 페이지를 만들었습니다.

<input id="test1" name="test1" value="Hello" onchange="alert(this.value);"/>
<input type="button" onclick="document.getElementById('test1').onchange();" value="Say Hello"/>

편집 : ele.onchange ()가 작동하지 않는 이유는 실제로 onchange 이벤트에 대해 아무것도 선언하지 않았기 때문입니다. 그러나 fireEvent는 여전히 작동합니다.


2
이 브라우저 감지 방법 (객체 감지에 의한)이 내가 제공 한 예보다 더 좋습니다.
Chris MacDonald

이것은 파이어 폭스 (23)에 대해 더 이상 작동하지 않습니다 "element.dispatchEvent는 함수가 아닙니다"
올리버

4
Google 직원 여러분. 2016 년입니다! 요즘 우리는 같은 코드를 작성하는 element.dispatchEvent(new Event('change', true, true))대신에있어서 신비로운 주로 사용되지 않는 모든의 createEventinitEvent물건.
ericsoco

3

이것은 IE와 Chrome에 대한 가장 정답입니다.

javascript=>

var element = document.getElementById('xxxx');
var evt = document.createEvent('HTMLEvents');
evt.initEvent('change', false, true);
element.dispatchEvent(evt);

2

QUnit 하단에서 가져옴

function triggerEvent( elem, type, event ) {
    if ( $.browser.mozilla || $.browser.opera ) {
        event = document.createEvent("MouseEvents");
        event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
            0, 0, 0, 0, 0, false, false, false, false, 0, null);
        elem.dispatchEvent( event );
    } else if ( $.browser.msie ) {
        elem.fireEvent("on"+type);
    }
}

물론 $ .browser 항목을 사용자 고유의 브라우저 감지 방법으로 대체하여 jQuery를 독립적으로 만들 수 있습니다.

이 기능을 사용하려면 :

var event;
triggerEvent(ele, "change", event);

이것은 기본적으로 무언가가 실제로 변경된 것처럼 실제 DOM 이벤트를 발생시킵니다.


1

이 코드 스 니펫으로 모든 이벤트를 추가하는 경우 :

//put this somewhere in your JavaScript:
HTMLElement.prototype.addEvent = function(event, callback){
  if(!this.events)this.events = {};
  if(!this.events[event]){
    this.events[event] = [];
    var element = this;
    this['on'+event] = function(e){
      var events = element.events[event];
      for(var i=0;i<events.length;i++){
        events[i](e||event);
      }
    }
  }
  this.events[event].push(callback);
}
//use like this:
element.addEvent('change', function(e){...});

그런 다음 이벤트 이름이 element.on<EVENTNAME>()어디에 있는지 사용할 수 있습니다. 그러면 <EVENTNAME>모든 이벤트가<EVENTNAME>


-2

Javascript에서 이벤트를 트리거합니다.

 document.getElementById("yourid").addEventListener("change", function({
    //your code here
})

2
이것은 이벤트를 트리거하지 않고 수신 대기합니다.
invalidusername

-4

jQuery를 사용하는 경우 다음이 필요합니다.

$('#elementId').change(function() { alert('Do Stuff'); });

또는 MS AJAX :

$addHandler($get('elementId'), 'change', function(){ alert('Do Stuff'); });

또는 요소의 원시 HTML에서 :

<input type="text" onchange="alert('Do Stuff');" id="myElement" />

질문을 다시 읽은 후해야 할 일을 잘못 읽은 것 같습니다. 변경 이벤트를 강제하는 방식으로 DOM 요소를 업데이트하는 방법을 찾지 못했습니다. 다음과 같이 별도의 이벤트 처리기 메서드를 사용하는 것이 가장 좋습니다.

$addHandler($get('elementId'), 'change', elementChanged);
function elementChanged(){
  alert('Do Stuff!');
}
function editElement(){
  var el = $get('elementId');
  el.value = 'something new';
  elementChanged();
}

변경을 수행 할 JavaScript 메소드를 이미 작성 중이므로 호출 할 추가 행이 1 개뿐입니다.

당신이 경우 또는, 있다 은 Microsoft AJAX 프레임 워크를 사용하여 모든 이벤트 핸들러를 통해 액세스 할 수 있습니다 :

$get('elementId')._events

발동 할 올바른 이벤트 핸들러를 찾기 위해 반사 스타일의 작업을 수행 할 수 있습니다.


1
나는 그가 이벤트가 발생했을 때 함수를 실행하는 것이 아니라 실제 이벤트를 발생시키고 싶다고 생각한다 . lol
Kolten

-5

JQuery를 사용하여 다음을 수행 할 수 있습니다.

// for the element which uses ID
$("#id").trigger("change");

// for the element which uses class name
$(".class_name").trigger("change");

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