차이 무엇 addEventListener
과 onclick
?
var h = document.getElementById("a");
h.onclick = dothing1;
h.addEventListener("click", dothing2);
위의 코드는 별도의 .js 파일에 함께 있으며 모두 완벽하게 작동합니다.
답변
둘 다 정확하지만 그중 어느 것도 그 자체로는 “최상의”것은 아니며 개발자가 두 가지 방법을 모두 사용하기로 선택한 이유가있을 수 있습니다.
이벤트 리스너 (addEventListener 및 IE의 attachEvent)
이전 버전의 Internet Explorer는 거의 모든 브라우저와 다르게 자바 스크립트를 구현합니다. 9 미만의 버전 에서는 다음과 같이 attachEvent
[ doc ] 메소드 를 사용합니다 .
element.attachEvent('onclick', function() { /* do stuff here*/ });
대부분의 다른 브라우저 (IE 9 이상 포함)에서는 다음과 같이 addEventListener
[ doc ] 를 사용 합니다.
element.addEventListener('click', function() { /* do stuff here*/ }, false);
이 접근 방식 ( DOM 레벨 2 이벤트 )을 사용하면 이론적으로 무제한의 이벤트를 단일 요소에 첨부 할 수 있습니다. 실질적인 제한 사항은 클라이언트 측 메모리 및 기타 성능 문제로, 각 브라우저마다 다릅니다.
위의 예제는 익명 함수 [ doc ]를 사용하는 것을 나타냅니다 . 함수 참조 [ doc ] 또는 클로저 [ doc ]를 사용하여 이벤트 리스너를 추가 할 수도 있습니다 .
var myFunctionReference = function() { /* do stuff here*/ }
element.attachEvent('onclick', myFunctionReference);
element.addEventListener('click', myFunctionReference , false);
또 다른 중요한 특징은 addEventListener
최종 매개 변수인데,이 매개 변수는 리스너가 버블 링 이벤트에 반응하는 방식을 제어합니다 [ doc ]. 예제에서 거짓을 전달했습니다.이 사례는 아마도 95 %의 유스 케이스에 대한 표준입니다. attachEvent
인라인 이벤트를 사용할 때 또는에 해당하는 인수가 없습니다 .
인라인 이벤트 (HTML onclick = “”속성 및 element.onclick)
자바 스크립트를 지원하는 모든 브라우저에서 HTML 코드에서 바로 이벤트 리스너를 인라인으로 배치 할 수 있습니다. 아마 이것을 보았을 것입니다 :
<a id="testing" href="#" onclick="alert('did stuff inline');">Click me</a>
대부분의 숙련 된 개발자는이 방법을 피하지만 작업을 완료합니다. 간단하고 직접적입니다. 여기서 처리기 자체는 일종의 익명 함수이지만 클로저 또는 익명 함수를 사용할 수 없으며 범위 제어가 제한됩니다.
다른 방법은 다음과 같습니다.
element.onclick = function () { /*do stuff here */ };
… 범위를 더 많이 제어하고 (HTML 대신 스크립트를 작성하기 때문에) 익명 함수, 함수 참조 및 / 또는 클로저를 사용할 수 있다는 점을 제외하고는 인라인 자바 스크립트와 같습니다.
인라인 이벤트의 중요한 단점은 위에서 설명한 이벤트 리스너와 달리 하나의 인라인 이벤트 만 할당 할 수 있다는 것입니다. 인라인 이벤트는 요소 [ doc ] 의 속성 / 속성으로 저장되므로 덮어 쓸 수 있습니다.
<a>
위의 HTML 예제 를 사용하여 :
var element = document.getElementById('testing');
element.onclick = function () { alert('did stuff #1'); };
element.onclick = function () { alert('did stuff #2'); };
… 요소를 클릭하면 “Did stuff # 2” 만 표시 됩니다 . 첫 번째로 할당 된 onclick
속성을 두 번째 값으로 덮어 쓰고 원래 인라인 HTML onclick
속성도 덮어 썼습니다 . http://jsfiddle.net/jpgah/ 에서 확인하십시오 .
대체로 인라인 이벤트를 사용하지 마십시오 . 특정 사용 사례가있을 수 있지만 100 % 확실하지 않은 경우 인라인 이벤트를 사용하지 않아야합니다.
현대 자바 스크립트 (Angular 등)
이 답변이 처음 게시되었으므로 Angular와 같은 자바 스크립트 프레임 워크가 훨씬 더 대중화되었습니다. Angular 템플릿에 다음과 같은 코드가 표시됩니다.
<button (click)="doSomething()">Do Something</button>
인라인 이벤트처럼 보이지만 그렇지 않습니다. 이 유형의 템플릿은 뒤에서 이벤트 리스너를 사용하는보다 복잡한 코드로 변환됩니다. 여기에 이벤트에 대해 쓴 모든 내용이 여전히 적용되지만 최소한 하나의 계층으로 인해 핵심에서 제거됩니다. 너트와 볼트를 이해해야하지만 최신 JS 프레임 워크 모범 사례에 이러한 종류의 코드를 템플릿으로 작성하는 경우 인라인 이벤트를 사용하고 있다고 생각하지 마십시오.
어느 것이 최고입니까?
문제는 브라우저 호환성과 필요성의 문제입니다. 요소에 둘 이상의 이벤트를 첨부해야합니까? 미래에 당신은? 확률은 당신입니다. attachEvent 및 addEventListener가 필요합니다. 그렇지 않은 경우 인라인 이벤트는 트릭을 수행하는 것처럼 보일지 모르지만 미래에 대비하는 것이 훨씬 나을 것 같지만 최소한 예상 할 수는 없습니다. JS 기반 이벤트 리스너로 이동해야 할 수도 있으므로 시작하십시오. 인라인 이벤트를 사용하지 마십시오.
jQuery 및 기타 자바 스크립트 프레임 워크는 일반 모델에서 DOM 레벨 2 이벤트의 다양한 브라우저 구현을 캡슐화하므로 반역자로서 IE의 역사에 대해 걱정할 필요없이 브라우저 간 호환 코드를 작성할 수 있습니다. jQuery와 동일한 코드, 모든 크로스 브라우저 및 준비가 완료되었습니다.
$(element).on('click', function () { /* do stuff */ });
그러나이 한 가지에 대해서만 프레임 워크를 사용하지 마십시오. 이전 브라우저를 관리하기 위해 작은 유틸리티를 쉽게 굴릴 수 있습니다.
function addEvent(element, evnt, funct){
if (element.attachEvent)
return element.attachEvent('on'+evnt, funct);
else
return element.addEventListener(evnt, funct, false);
}
// example
addEvent(
document.getElementById('myElement'),
'click',
function () { alert('hi!'); }
);
사용해보십시오 : http://jsfiddle.net/bmArj/
보고있는 스크립트가 브라우저의 차이점을 다른 방식으로 고려하지 않는 한 (질문에 표시되지 않은 코드로) 사용 addEventListener
하지 않는 부분 은 9 미만의 IE 버전에서는 작동하지 않습니다.
문서 및 관련 자료
답변
다른 두 가지 기능이 있는지 확인할 수있는 차이점 :
var h = document.getElementById('a');
h.onclick = doThing_1;
h.onclick = doThing_2;
h.addEventListener('click', doThing_3);
h.addEventListener('click', doThing_4);
기능 2, 3 및 4는 작동하지만 1은 작동하지 않습니다. 때문입니다 addEventListener
반면, 기존의 이벤트 핸들러를 덮어 쓰지 않습니다 onclick
우선 기존의 onclick = fn
이벤트 핸들러.
물론 다른 중요한 차이점 onclick
은 항상 작동하지만, addEventListener
Internet Explorer 9 이전 버전에서는 작동하지 않는다는 것입니다 . IE <9 에서는 유사한 구문 attachEvent
이 약간 다릅니다.
답변
이 답변에서는 DOM 이벤트 핸들러를 정의하는 세 가지 방법을 설명합니다.
element.addEventListener()
코드 예 :
element.addEventListener()
여러 가지 장점이 있습니다.
- 무제한 이벤트 핸들러 를 등록 하고로 제거 할 수 있습니다
element.removeEventListener()
. - 가지고
useCapture
당신은 그것에서 이벤트를 처리할지 여부를 나타내는 매개 변수를 캡처 또는 버블 링 단계를 . addEventListener의 useCapture 속성을 이해할 수 없습니다.를 참조하십시오 . - 의미 에 대한 관심 . 기본적으로 이벤트 핸들러 등록을보다 명확하게합니다. 초보자에게는 함수 호출로 무언가가 발생 한다는 것을 알 수 있지만 DOM 요소의 일부 속성에 이벤트를 할당하는 것은 적어도 직관적이지 않습니다.
- 문서 구조 (HTML)와 논리 (JavaScript) 를 분리 할 수 있습니다 . 작은 웹 응용 프로그램에서는 중요하지 않은 것처럼 보이지만 더 큰 프로젝트 에서는 중요합니다. 그렇지 않은 프로젝트보다 구조와 논리를 분리하는 프로젝트를 유지하는 것이 훨씬 쉽습니다.
- 올바른 이벤트 이름과 혼동을 제거합니다. 인라인 이벤트 리스너를 사용하거나
.onevent
DOM 요소의 속성에 이벤트 리스너를 할당하기 때문에 경험이 부족한 많은 JavaScript 프로그래머는 이벤트 이름이 예를 들어onclick
또는 라고 생각합니다onload
. 이벤트 이름의 일부on
가 아닙니다 . 올바른 이벤트 이름은click
및load
이며 이벤트 이름이에 전달되는 방식.addEventListener()
입니다. - 거의 모든 브라우저 에서 작동 합니다 . 여전히 IE <= 8을 지원해야하는 경우 MDN의 polyfill을 사용할 수 있습니다 .
element.onevent = function() {}
(예를 들어 onclick
, onload
)
코드 예 :
이것은 DOM 0에 이벤트 핸들러를 등록하는 방법입니다. 이제 다음과 같은 이유로 권장하지 않습니다.
- 하나의 이벤트 핸들러 만 등록 할 수 있습니다 . 또한이 메소드를 사용하여 지정된 이벤트 핸들러를 제거하려면
onevent
특성을 초기 상태 (예 :)로 되돌려 야하기 때문에 지정된 핸들러를 제거하는 것은 직관적이지 않습니다null
. - 오류에 적절하게 응답 하지 않습니다 . 예를 들어 실수로 문자열을에 할당하면 (
window.onload
예window.onload = "test";
🙂 오류가 발생하지 않습니다. 코드가 작동하지 않으며 이유를 찾기가 정말 어려울 것입니다..addEventListener()
그러나 오류가 발생합니다 (적어도 Firefox에서는). TypeError : EventTarget.addEventListener의 Argument 2는 객체가 아닙니다 . - 이벤트를 캡처 또는 버블 링 단계에서 처리하려는 경우 선택할 수있는 방법을 제공하지 않습니다.
인라인 이벤트 핸들러 ( onevent
HTML 속성)
코드 예 :
와 마찬가지로 element.onevent
이제는 권장하지 않습니다. element.onevent
가지고 있는 문제 외에도 다음과 같은 문제가 있습니다.
- A는 잠재적 인 보안 문제 가 XSS 훨씬 더 해로운 수 있기 때문에. 오늘날 웹 사이트는 적절한
Content-Security-Policy
HTTP 헤더를 보내 인라인 스크립트를 차단하고 신뢰할 수있는 도메인의 외부 스크립트 만 허용해야합니다. 콘텐츠 보안 정책 은 어떻게 작동합니까?를 참조하십시오 . - 문서 구조와 논리를 분리 하지 않습니다 .
- 서버 측 스크립트로 페이지를 생성하고 각각 동일한 인라인 이벤트 핸들러를 사용하여 백 개의 링크를 생성하는 경우 이벤트 핸들러가 한 번만 정의 된 경우보다 코드가 훨씬 길어집니다. 즉, 클라이언트가 더 많은 콘텐츠를 다운로드해야하므로 웹 사이트 속도가 느려집니다.
또한보십시오
답변
onclick
모든 브라우저에서 작동 하지만 addEventListener
이전 버전의 Internet Explorer에서는 작동하지 않으며 attachEvent
대신 사용 됩니다.
단점은 onclick
하나의 이벤트 핸들러 만있을 수 있고 다른 두 개는 등록 된 모든 콜백을 시작한다는 것입니다.
답변
내가 아는 한 DOM “로드”이벤트는 여전히 매우 제한적으로 작동합니다. 즉 window object
, 예를 들어 , images
및 <script>
요소 에만 실행됩니다 . 직접 onload
할당도 마찬가지 입니다. 이 둘 사이에는 기술적 인 차이가 없습니다. 아마도 .onload =
더 나은 크로스 브라우저 가용성이 있습니다.
그러나 load event
a <div>
또는 <span>
요소 또는 기타에 a 를 지정할 수 없습니다 .
답변
요약:
addEventListener
여러 이벤트를 추가 할onclick
수 있지만이 작업을 수행 할 수는 없습니다.onclick
은HTML
속성 으로 추가 할 수있는 반면에는 요소addEventListener
내에서만 추가 할 수 있습니다<script>
.addEventListener
이벤트 전파를 중지시킬 수있는 세 번째 인수를 취할 수 있습니다.
둘 다 이벤트를 처리하는 데 사용될 수 있습니다. 그러나 addEventListener
모든 작업을 수행 할 수 있으므로 선호하는 선택이되어야합니다 onclick
. 인라인 onclick
을 HTML 속성으로 사용하지 마십시오 . 이는 자바 스크립트와 HTML을 혼용하기 때문에 잘못된 방법입니다. 코드를 유지 관리하기가 쉽지 않습니다.
답변
한 세부 사항은 아직 언급되지 않았습니다 현대 데스크톱 브라우저가 “클릭”으로 다른 버튼 누름을 고려 AddEventListener('click'
하고 onclick
기본적으로.
- Chrome 42 및 IE11에서는 왼쪽 및 가운데 클릭시 모두
onclick
를AddEventListener
클릭하십시오. - 파이어 폭스 38에서
onclick
발사 에만 왼쪽 클릭에 있지만,AddEventListener
왼쪽, 중간에 화재를 클릭 하고 바로 클릭.
또한 스크롤 커서가 포함 된 경우 중간 클릭 동작이 브라우저에서 매우 일치하지 않습니다.
- Firefox에서는 중간 클릭 이벤트가 항상 발생합니다.
- Chrome에서는 가운데 클릭이 스크롤 커서를 열거 나 닫으면 실행되지 않습니다.
- IE에서는 스크롤 커서가 닫히면 열리지 만 실행되지 않습니다.
키보드로 선택 가능한 HTML 요소 (예 : input
공간에서 실행되거나 요소를 선택할 때 입력) 와 같은 “클릭”이벤트도 주목할 가치가 있습니다 .