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.