Internet Explorer 9, 10 & 11 이벤트 생성자가 작동하지 않습니다


129

이벤트를 만들고 있으므로 DOM 이벤트 생성자를 사용하십시오.

new Event('change');

이것은 최신 브라우저에서는 잘 작동하지만 Internet Explorer 9, 10 및 11에서는 다음과 같이 실패합니다.

Object doesn't support this action

Internet Explorer (이상적으로 폴리 필을 통해)를 수정하려면 어떻게해야합니까? 내가 할 수 없다면 사용할 수있는 해결 방법이 있습니까?


55
"Internet Explorer를 어떻게 수정합니까?" xD
contactmatt

답변:


176

MDN에는 CustomEvent 생성자를위한 IE 폴리 필 이 있습니다 . IE에 CustomEvent를 추가하고 대신 사용하십시오.

(function () {
  if ( typeof window.CustomEvent === "function" ) return false; //If not IE

  function CustomEvent ( event, params ) {
    params = params || { bubbles: false, cancelable: false, detail: undefined };
    var evt = document.createEvent( 'CustomEvent' );
    evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
    return evt;
   }

  CustomEvent.prototype = window.Event.prototype;

  window.CustomEvent = CustomEvent;
})();

14
당신은 내 목숨을 구했습니다 완전히 대체해도 안전합니까? 나는 window.Event= CustomEvent마지막 줄 에서 일하는 것을 의미 합니다.
tfrascaroli 2016 년

7
IE11에서는 window.Event = CustomEvent, yes를 설정하는 것이 안전 해 보입니다.
Corey Alix

10
관심있는 사람은 'object'인 IE를 제외하고 'function'인 typeof (Event)를 확인하여 IE (이 경우)에 있는지 감지하는 것이 가능합니다. 그런 다음 위의 접근 방식을 사용하여 이벤트 생성자를 안전하게 채울 수 있습니다.
Euan Smith

난 그냥 비슷한 해결 방법을 조사하고 있습니다 StorageEventtypeof(StorageEvent)MS 에지에서 작동하지 않습니다. 이것은 작동합니다 : try { new StorageEvent(); } catch (e) { /* polyfill */ }.
kamituel

1
IE 정의 CustomEvent 생성자를 사용하는 타사 라이브러리를 사용하는 경우 window.CustomEvent를 대체하는 것이 안전하지 않을 수 있습니다.
Sen Jacob

55

문제를 해결하고 브라우저 간 이벤트 생성을 처리하는 가장 좋은 솔루션은 다음과 같습니다.

function createNewEvent(eventName) {
    var event;
    if (typeof(Event) === 'function') {
        event = new Event(eventName);
    } else {
        event = document.createEvent('Event');
        event.initEvent(eventName, true, true);
    }
    return event;
}

3
효과가있다! 나는 그것을 return event전달 해야한다고 생각합니다 dispatchEvent().
누 메논

initEvent오래되고 더 이상 사용되지 않습니다 . 적어도 현대적인 방법을 사용해야하며, 대체 방법으로 더 이상 사용되지 않는 방법을 사용해야합니다.
vsync

2
@vsync이되지 수도 있지만 문서는 당신이다 "대신 이벤트 ()를 같은 특정 이벤트 생성자를 사용하여"말을 연결 정확하게 때문에 선택의 여지가 정말 없다,이 polyfill를 시도하는 것.
0:42에

1
CustomEventdetail옵션을 통해 사용자 정의 데이터를 전달할 수 Event있지만 그렇지 않습니다. 내가 잘못?
pttsky

1
내 경험에 따라 IE9, 10 또는 11에서는 CustomEvent가 지원되지 않습니다. 유일한 좋은 대답은 받아 들여진 것 같습니다.
UndyingJellyfish

5

이 패키지는 마법을 수행합니다.

https://www.npmjs.com/package/custom-event-polyfill

패키지를 포함시키고 다음과 같이 이벤트를 전달하십시오.

window.dispatchEvent(new window.CustomEvent('some-event'))

의존성 95 개?
Damien Roche

4
@DamienRoche "종속성"을 "종속성"으로 잘못 읽었을 수 있습니까? 패키지는 실제로 0 개의 종속성과 102 개의 종속 항목 (즉, 패키지에 의존하는 패키지)을 갖기 때문입니다. 그 102 개의 종속 패키지는 아마도 7 월 95 일이었습니다.
독감

2
나는 피를 잘했다! : P
Damien Roche

3

HTML 토글 이벤트와 같은 간단한 이벤트를 전달하려는 경우 Internet Explorer 11 및 다른 브라우저에서 작동합니다.

let toggle_event = null;
try {
    toggle_event = new Event("toggle");
}
catch (error) {
    toggle_event = document.createEvent("Event");
    let doesnt_bubble = false;
    let isnt_cancelable = false;
    toggle_event.initEvent("toggle", doesnt_bubble, isnt_cancelable);
}
// disclosure_control is a details element.
disclosure_control.dispatchEvent(toggle_event);

5
당신이 혼합 왜 볼 수없는 es6 let(그리고 사용하지 var가 않습니다 초보자 혼동 수도 ... 오래된 IE에서 실행되어 코드로)이 복사 - 붙여 넣기
수직 동기화

1
@vsync는 어깨를 으쓱 내가 버전 번호를 언급. 내 개인 웹 사이트는 작년 IE11만을 대상으로 했으므로 이전 버전의 지원을 확인한 적이 없었습니다. (현재, 스타일 시트 나 스크립트없이 IE11 일반 HTML을 제공하고 있습니다. 사람들은 계속 이동해야합니다.) 어쨌든, 2017 년 4 월 현재 Microsoft에서 여전히 지원하는 유일한 Internet Explorer 버전은 버전 11이므로 약간의 ot 포인트. 지원되지 않는 브라우저를 타겟팅하여 사용하도록 권장하지 않습니다. 웹은 위험한 장소가 될 수 있습니다.
Patrick Dark

3
그것은 전혀 그것에 관한 것이 아니며 세상이나 다른 것을 바꾸려고 시도하는 것이 아닙니다. 예를 들어, 질문의 제목은 구체적으로 요구하며 IE 9,이 스레드를 발견 한 답변을 찾는 사람은 레거시 뱅킹 시스템 또는 컴퓨터를 제어 할 수 없으며 이전 IE와 함께 작동해야합니다.
vsync


2

custom-eventNPM 패키지는 나를 위해 아름답게 일

https://www.npmjs.com/package/custom-event

var CustomEvent = require('custom-event');

// add an appropriate event listener
target.addEventListener('cat', function(e) { process(e.detail) });

// create and dispatch the event
var event = new CustomEvent('cat', {
  detail: {
    hazcheeseburger: true
  }
});
target.dispatchEvent(event);

이것은 좋은 대답이지만 이미 다른 NPM 패키지가 있습니다.
mikemaccana

2
사용자에게 다양한 옵션을 제공하는 데 어떤 문제가 있습니까?
Liran H

더 일반적인 패키지입니다 npmjs.com/package/events-polyfill
마르쿠스 Jarderot

1

개인적으로 래퍼 함수를 ​​사용하여 수동으로 만든 이벤트를 처리합니다. 다음 코드는 모든 Event인터페이스 에 정적 메서드를 추가하고 (끝으로 끝나는 모든 전역 변수 Event는 이벤트 인터페이스 임) element.dispatchEvent(MouseEvent.create('click'));IE9 + 와 같은 함수를 호출 할 수 있습니다 .

(function eventCreatorWrapper(eventClassNames){
    eventClassNames.forEach(function(eventClassName){
        window[eventClassName].createEvent = function(type,bubbles,cancelable){
            var evt
            try{
                evt = new window[eventClassName](type,{
                    bubbles: bubbles,
                    cancelable: cancelable
                });
            } catch (e){
                evt = document.createEvent(eventClassName);
                evt.initEvent(type,bubbles,cancelable);
            } finally {
                return evt;
            }
        }
    });
}(function(root){
    return Object.getOwnPropertyNames(root).filter(function(propertyName){
        return /Event$/.test(propertyName)
    });
}(window)));

편집 : 모든 Event인터페이스 를 찾는 기능을 필요한 이벤트 인터페이스 ( ['Event', 'MouseEvent', 'KeyboardEvent', 'UIEvent' /*, etc... */]) 만 변경하는 배열로 바꿀 수도 있습니다 .

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