jQuery.click () vs onClick


558

거대한 jQuery 애플리케이션이 있으며 클릭 이벤트에 대해 아래 두 가지 방법을 사용하고 있습니다.

첫 번째 방법

HTML

<div id="myDiv">Some Content</div>

jQuery

$('#myDiv').click(function(){
    //Some code
});

두 번째 방법

HTML

<div id="myDiv" onClick="divFunction()">Some Content</div>

자바 스크립트 함수 호출

function divFunction(){
    //Some code
}

내 응용 프로그램에서 첫 번째 또는 두 번째 방법을 사용합니다. 어느 것이 더 낫습니까? 성능이 더 좋습니까? 그리고 표준?


9
quirksmode.org/js/introevents.html 에서 이벤트 핸들러 및 해당 장단점을 첨부하는 다양한 방법에 대해 배울 수 있습니다 . jQuery는 고급 이벤트 등록을위한 훌륭한 래퍼입니다.
Felix Kling

12
click 함수를 $ (document) .ready (function () 안에 두어야합니다.
joan16v

답변:


559

표준 이벤트 등록 모델에 따라 사용하는 $('#myDiv').click(function(){것이 좋습니다 . (jQuery는 내부적으로addEventListener and를 사용합니다 attachEvent).

기본적으로 현대적인 방식으로 이벤트를 등록하는 것이 방해없이 이벤트를 처리하는 방법입니다. 또한 대상에 대해 둘 이상의 이벤트 리스너를 등록 addEventListener()하기 위해 동일한 대상을 호출 할 수 있습니다 .

var myEl = document.getElementById('myelement');

myEl.addEventListener('click', function() {
    alert('Hello world');
}, false);

myEl.addEventListener('click', function() {
    alert('Hello world again!!!');
}, false);

http://jsfiddle.net/aj55x/1/

addEventListener를 사용하는 이유는 무엇입니까? (MDN에서)

addEventListener는 W3C DOM에 지정된대로 이벤트 리스너를 등록하는 방법입니다. 장점은 다음과 같습니다.

  • 이벤트에 대해 둘 이상의 핸들러를 추가 할 수 있습니다. 이것은 다른 라이브러리 / 확장 프로그램을 사용하더라도 제대로 작동해야하는 DHTML 라이브러리 또는 Mozilla 확장에 특히 유용합니다.
  • 리스너가 활성화 될 때 단계를보다 세밀하게 제어 할 수 있습니다 (캡처 및 버블 링).
  • HTML 요소뿐만 아니라 모든 DOM 요소에서 작동합니다.

최신 이벤트 등록에 대한 추가 정보-> http://www.quirksmode.org/js/events_advanced.html

HTML 속성 설정과 같은 다른 방법 , 예 :

<button onclick="alert('Hello world!')">

또는 DOM 요소 속성 , 예 :

myEl.onclick = function(event){alert('Hello world');}; 

오래되어 쉽게 덮어 쓸 수 있습니다.

HTML 속성 은 마크 업을 더 크고 읽기 어렵게하기 때문에 피해야합니다. 내용 / 구조 및 동작에 대한 우려는 잘 구분되지 않으므로 버그를 찾기가 어렵습니다.

DOM 요소 특성 메소드 의 문제점 은 이벤트 당 하나의 이벤트 핸들러 만 요소에 바인드 할 수 있다는 것입니다.

전통적인 이벤트 처리에 대한 자세한 내용-> http://www.quirksmode.org/js/events_tradmod.html

MDN 참조 : https://developer.mozilla.org/en-US/docs/DOM/event


13
$('#myDiv').click(function(){먼저 코드 를 실행 한 다음 JavaScript에서 20 행의 HTML을 동적으로 생성하고 각 행에 동일한 기능을 실행하려면 JavaScript를 클릭해야하는 버튼이 있습니다. 먼저 수행하면 HTML이 생성되기 전에 이벤트 핸들러가 추가되어 작동하지 않습니다. onclick="functionName()"동적으로 생성 된 HTML에 넣는 것이 더 쉬워 보이면 버튼이 바로 작동합니다. 아니면이 상황에 대한보다 우아한 해결책을 알고 있습니까?
zuallauz

17
이 경우 @zuallauz jQuery는 .delegate()기능을 제공 합니다. 앞으로 사이트에 나타날 요소에 이벤트를 첨부합니다.
Zefiryn

17
@SimonRobb .live는 더 이상 사용되지 않습니다. 를 사용하여 .delegate이전 버전 또는 사용에 대한 .on새로운 jQuery를 버전.
Selvakumar Arumugam

4
@ 베가, 좋은 지적. 가독성은 어떻습니까? 이제 페이지에서 참조 된 모든 JS 파일을 검색하여 함수 이름을 검색하는 대신 요소의 ID별로 요소의 모든 클릭 핸들러를 확인해야합니다. 이것에 대해 무엇을 가져가십니까?
supertonsky

6
@supertonsky에 동의합니다. 나는 $ ( '# myDiv'). click (function () {이 더 낫다. , 아이디, 자식, HTML 태그를 참조하고 CSS 변경 및 클래스 이름을 변경해야하는 경우 어떻게됩니까? 다른 코드를 사용한 경험에서 매우 추악합니다.
Jon

65

성능을 향상 시키려면 기본 JavaScript를 사용하십시오. 더 빠른 개발을 위해서는 jQuery를 사용하십시오. jQuery와 Native Element Performance의 성능 비교를 확인하십시오 .

Windows Server 2008 R2 / 7 64 비트의 Firefox 16.0 32 비트에서 테스트를 수행했습니다.

$('span'); // 6,604 operations per second
document.getElementsByTagName('span'); // 10,331,708 operations/sec

클릭 이벤트의 경우 기본 브라우저 이벤트 vs jquery 트리거 또는 jQuery vs 기본 클릭 이벤트 바인딩을 확인하십시오 .

Windows Server 2008 R2 / 7 64 비트에서 Chrome 22.0.1229.79 32 비트에서 테스트

$('#jquery a').click(window.testClickListener); // 2,957 operations/second

[].forEach.call( document.querySelectorAll('#native a'), function(el) {
    el.addEventListener('click', window.testClickListener, false);
}); // 18,196 operations/second

9
jQuery는 다양한 환경에서 실행될 수 있어야하므로 더 많은 로트를 만들 수 있고 작성, 유지 관리가 더 쉬워 지지만 속도가 가장 중요하다면 jQuery가 답이 아닙니다
Coops

forEach를 사용할 때주의하십시오. 모든 원인이 모든 브라우저와 호환되는 것은 아닙니다. 폴리 필이 유용 할 수도 있습니다.
khaled_webdev

39

내가 이해 한 바에 따르면, 귀하의 질문은 실제로 jQuery를 사용할지 여부에 관한 것이 아닙니다. 오히려 : HTML이나 이벤트 리스너를 통해 이벤트를 인라인으로 바인딩하는 것이 더 낫습니까?

인라인 바인딩은 더 이상 사용되지 않습니다. 또한이 방법으로 하나의 함수 만 특정 이벤트에 바인딩 할 수 있습니다.

따라서 이벤트 리스너를 사용하는 것이 좋습니다. 이런 식으로 많은 함수를 단일 이벤트에 바인딩하고 필요한 경우 나중에 바인딩 해제 할 수 있습니다. 이 순수한 JavaScript 코드를 고려하십시오.

querySelector('#myDiv').addEventListener('click', function () {
    // Some code...
});

이것은 대부분의 최신 브라우저에서 작동합니다.

그러나 프로젝트에 jQuery를 이미 포함시킨 경우 jQuery : .on또는 .click함수 만 사용하십시오 .


<div onclick = "handler1 (); handler2 (); handler3 ();"> </ div>와 같은 인라인 HTML을 사용하여 여러 함수를 등록 할 수 있습니다
Kira

2
이 방법으로 여전히 하나의 "표현식"만 등록합니다. 예를 들어, 경우이 handler1오류가 발생합니다, handler2그리고 handler3지금 전화를받을 수 없습니다. 또한 리스너에서 특정 기능을 동적으로 추가 및 제거 할 수 없습니다. 그리고 마지막으로 handler1, handler2그리고 handler3냄새가 나는 세계적인 범위에서 선언되어야합니다.
Michał Miszczyszyn

정의되지 않은 try..catch상태 handler2에서 함수를 사용하면 작동하지 않습니다. 사용자 브라우저에서 JS가 비활성화되어 있으면 FYI 인라인 JavaScript가 작동하지 않습니다. 다른 사용자에게 잘못 알려주지 마십시오.
Michał Miszczyszyn

비활성화 된 JavaScript가 확실하지 않다고 언급했습니다. 나는 다른 사람들을 오도하거나 속이지 않습니다
Kira

이 경우 다음 <div onclick = "function () {try {handler1 (); handler2 (); handler3 ();} catch {}}"> </ div>
Kira

15

jQuery를 사용하여 함수를 클릭에 바인딩 할 수 있습니다.

<div id="myDiv">Some Content</div>

$('#myDiv').click(divFunction);

function divFunction(){
 //some code
}

14

$('#myDiv').clickJavaScript 코드를 HTML 과 분리하기 때문에 더 좋습니다 . 페이지 비헤이비어와 구조를 다르게 유지해야합니다 . 이것은 많은 도움이됩니다.


2
이 답변은 js를 디자인하고 작성하는 사람들이 대부분의 경우 다르기 때문에 의미가 있습니다. 그리고 이것이 게시 된 후 거의 4 년이 지난 후에 이것을 공표하는 것이 이상하다고 느꼈습니다 !!
LearningEveryday

14

표준과 성능을 모두 제공하므로이를 수행하십시오.

 $('#myDiv').click(function(){
      //Some code
 });

두 번째 방법은 간단한 JavaScript 코드이며 jQuery보다 빠릅니다. 그러나 여기서 성능은 거의 같습니다.


11

IMHO, onclick은 다음 조건이 충족되는 경우에만 .click보다 선호되는 방법입니다.

  • 페이지에 많은 요소가 있습니다
  • 클릭 이벤트에 등록 할 이벤트는 하나뿐입니다
  • 모바일 성능 / 배터리 수명이 걱정됩니다

모바일 장치의 JavaScript 엔진이 같은 세대의 데스크톱보다 4 ~ 7 배 느리기 때문에이 의견을 형성했습니다. jQuery가 사용자 경험과 배터리 수명을 희생하면서 모든 이벤트를 바인딩하기 때문에 모바일 장치의 사이트를 방문하고 불안한 스크롤을 수신하면 싫어요. 최근의 또 다른 지원 요소는 정부 기관에만 문제가되지만;), JavaScript 프로세스가 오래 걸리거나 프로세스를 기다리는 중이라는 메시지 상자가 표시된 IE7 팝업이 있습니다. 이것은 jQuery를 통해 바인딩 할 요소가 많을 때마다 발생했습니다.


10

작품의 차이. click ()을 사용하면 여러 함수를 추가 할 수 있지만 속성을 사용하면 마지막 함수 중 하나만 실행됩니다.

데모

HTML

<span id="JQueryClick">Click #JQuery</span> </br>
<span id="JQueryAttrClick">Click #Attr</span> </br>

자바 스크립트

$('#JQueryClick').click(function(){alert('1')})
$('#JQueryClick').click(function(){alert('2')})

$('#JQueryAttrClick').attr('onClick'," alert('1')" ) //This doesn't work
$('#JQueryAttrClick').attr('onClick'," alert('2')" )

성능에 대해 이야기하는 경우 직접 사용하는 것이 항상 빠르지 만 속성을 사용하면 하나의 기능 만 할당 할 수 있습니다.


$ ( '# JQueryAttrClick'). attr ( 'onClick', "alert ( '2'); alert ( '3'); alert ( '4')")와 같은 속성을 사용하여 둘 이상의 함수를 실행할 수 있습니다.
Kira

8

우려 사항 분리가 핵심이므로 이벤트 바인딩이 일반적으로 허용되는 방법입니다. 이것이 기본적으로 많은 기존 답변이 말한 것입니다.

그러나 선언적 마크 업 아이디어를 너무 빨리 버리지 마십시오. 장소가 있으며 Angularjs와 같은 프레임 워크가 중심입니다.

<div id="myDiv" onClick="divFunction()">Some Content</div>일부 개발자가 남용했기 때문에 전체 가 너무 부끄럽다는 것을 이해해야합니다 . 그래서 그것은 같은 희생의 비율에 도달했습니다 tables. 일부 개발자는 실제로tables 테이블 형식 데이터를 피 합니다. 이해하지 않고 행동하는 사람들의 완벽한 예입니다.

나는 내 행동을 내 견해와 분리시키는 아이디어를 좋아하지만. 나는 마크 업 선언으로 어떤 문제를 볼 (그것이하지 않습니다 방법 하는가가 아니라 행동). 부트 스트랩 자바 스크립트 구성 요소와 매우 유사한 실제 onClick 속성 또는 사용자 정의 속성의 형태 일 수 있습니다.

이 방법으로 마크 업만으로이 기능을 사용하면 조회 자바 스크립트 이벤트 바인더를 반대로 바꾸는 대신에 수행 할 작업을 확인할 수 있습니다.

따라서 위의 세 번째 대안으로 데이터 속성을 사용하여 마크 업 내의 동작을 설명 적으로 알 수 있습니다. 행동은 시야에서 벗어나지 만 한 눈에 무슨 일이 일어나고 있는지 볼 수 있습니다.

부트 스트랩 예 :

<button type="button" class="btn btn-lg btn-danger" data-toggle="popover" title="Popover title" data-content="And here's some amazing content. It's very engaging. Right?">Click to toggle popover</button>

출처 : http://getbootstrap.com/javascript/#popovers

참고 두 번째 예의 주요 단점은 글로벌 네임 스페이스의 오염입니다. 이것은 위의 세 번째 대안을 사용하거나 Angular와 같은 프레임 워크 및 자동 범위가있는 ng-click 속성을 사용하여 우회 할 수 있습니다.


4

둘 다 다른 목적으로 사용될 수 있다는 점에서 더 나을 것은 없습니다 . onClick(실제로해야합니다 onclick) 성능이 약간 우수하지만 차이가 있음을 의심합니다.

그것들이 다른 일을한다는 점은 주목할 가치가 .click있습니다 : 모든 jQuery 컬렉션에 바인딩 할 수 있지만 바인딩 onclick하려는 요소에 대해 인라인으로 사용해야합니다. 또한 사용하는 바인딩 하나의 이벤트 만 할 수있는 onclick반면,.click 계속 바인딩 할 수 있습니다.

내 의견으로는, 나는 그것에 대해 일관되고 모든.click 곳에서 사용 하고 모든 JavaScript 코드를 함께 유지 하고 HTML과 분리합니다.

를 사용하지 마십시오 onclick. 당신이하고있는 일을 알지 못하면 아마 사용할 이유가 없습니다.


2
"더 나은"이 명시 적으로 정의되어 있지 않더라도 이벤트 핸들러를 마크 업에 직접 넣는 것은 좋은 생각이 아닙니다.
Jay

@ Jayraj 내 대답에서 언제 좋은 생각이라고 말한 적이 있습니까?
폭발 약

3
( "둘 중 어느 것도 낫지 않다 ") 보다 더 나쁘지 .click않다는 말 은 사실상 마일 을 쓰는 것이 더 나은 방법 일 때 코드를 작성하는 거의 또는 좋은 방법 이라는 것을 암시했다 . 죄송하지만 IMHO 답변을 바꿔야합니다onclickonclick.click
Jay

2
@ExplosionPills 나는 둘 중 어느 쪽이 더 낫다는 답을 제거 할 것입니다. 마지막 단락은 모순처럼 들립니다.
Juan Mendes

4
<whatever onclick="doStuff();" onmouseover="in()" onmouseout="out()" />

onclick, onmouseover, onmouseout 등의 이벤트는 실제로 성능에 좋지 않습니다 ( Internet Explorer에서는 주로 그림 참조). Visual Studio를 사용하여 코드를 작성하는 경우 이러한 페이지를 실행하면 이들 중 하나가 모두 메모리를 차지하는 별도의 SCRIPT 블록을 생성하므로 성능이 저하됩니다.

말할 것도없이 우려분리 해야합니다. JavaScript와 레이아웃은 분리해야합니다!

이러한 이벤트에 대해 짝수 핸들러를 작성하는 것이 좋습니다. 하나의 이벤트는 각각에 대해 수천 개의 개별 스크립트 블록을 작성하는 대신 수백 / 수천 개의 항목을 캡처 할 수 있습니다!

(또한 모든 사람들이 말하는 것입니다.)


3

jQuery 의 주요 아이디어 중 하나 는 불쾌한 HTML 코드 에서 JavaScript를 분리하는 것 입니다. 첫 번째 방법은 갈 길입니다.


3

대부분의 경우 기본 JavaScript 메소드는 성능이 유일한 기준일 때 jQuery보다 나은 선택이지만 jQuery는 JavaScript를 사용하고 개발을 쉽게합니다. 성능을 크게 저하시키지 않기 때문에 jQuery를 사용할 수 있습니다. 특정한 경우 성능 차이는 무시할 수 없습니다.


2

사용하는 첫 번째 방법 onclick jQuery가 아니라 단순히 Javascript이므로 jQuery의 오버 헤드를 얻지 못합니다. 각 요소에 이벤트 핸들러를 추가하지 않고 다른 요소에 추가해야 할 경우 선택기를 통해 jQuery 방법을 확장 할 수 있지만 이제는 jQuery를 사용해야하는지 여부 만 의문입니다.

개인적으로 jQuery를 사용하고 있기 때문에 일관성이 있고 스크립트에서 마크 업을 분리하므로 그대로 사용합니다.


1
jQuery 예제는 실제 document.querySelector('#something').addEventListener(...Javascript와 실질적으로 동일 하거나 유사하므로 요점이 아닙니다. 마찬가지로 jQuery 바로 가기가 아닌 Javascript의 자식 노드에서 버블 링 이벤트를 잡을 수 있습니다. 문제의 핵심은 이러한 이벤트가 뷰가 아닌 컨트롤러 (자바 스크립트 동작 정의 파일)에 있어야한다는 것입니다 ( html에 여기 저기 흩어져서 전역 변수 기능이 필요하거나 인라인 코드가 더
나빠짐

2

첫 번째 방법은 선호하는 것입니다. 고급 이벤트 등록 모델을 사용합니다. 즉, 동일한 요소에 여러 핸들러를 연결할 수 있습니다. 이벤트 객체에 쉽게 액세스 할 수 있으며 처리기는 모든 함수 범위에서 작동 할 수 있습니다. 또한 동적입니다. 즉, 언제든지 호출 할 수 있으며 동적으로 생성 된 요소에 특히 적합합니다. jQuery를 사용하든 다른 라이브러리 또는 기본 메소드를 직접 사용하든 실제로 중요하지 않습니다.

인라인 속성을 사용하는 두 번째 방법은 많은 전역 함수 (네임 스페이스 오염으로 이어짐)가 필요하고 컨텐츠 / 구조 (HTML)와 동작 (JavaScript)을 혼합합니다. 사용하지 마십시오.

성능이나 표준에 대한 질문에 쉽게 대답 할 수 없습니다. 두 가지 방법은 완전히 다르며 다른 일을합니다. 첫 번째는 강력하지만 두 번째는 멸시를받습니다 (나쁜 스타일로 간주).


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