이를 이벤트 위임이라고 하며 다음과 같이 작동합니다. 이벤트는 처리해야 하는 요소의 정적 부모( staticAncestors 이 jQuery 핸들러는 이벤트가 이 요소 또는 하위 요소 중 하나에서 트리거될 때마다 트리거됩니다. 그런 다음 핸들러는 이벤트를 트리거한 요소가 선택기( dynamicChild )와 일치하는지 확인합니다. 일치하는 항목이 있으면 사용자 지정 처리기 기능이 실행됩니다.
예를 들어 페이지에서 클래스 이름이 dosomething요소를 동적으로 생성하는 경우 이미 존재하는 부모에 이벤트를 바인딩합니다. 동적 콘텐츠), 이것은 (가장 쉬운 옵션은) document 입니다. document 가 가장 효율적인 옵션이 아닐 수도 있음 을 염두에 두십시오.
$(document).on('mouseover mouseout', '.dosomething', function(){ // what you want to happen when mouseover and mouseout // occurs on elements that match '.dosomething' });
이벤트가 바인딩된 시점에 존재하는 모든 부모는 괜찮습니다. 예를 들어
$('.buttons').on('click', 'button', function(){ // do something here });
에 적용될 것입니다
<div class="buttons"> <!-- <button>s that are generated dynamically and added here --> </div>
아직 생성되지 않은 하위 요소에 대한 이벤트를 처리하는 기능 외에도 위임된 이벤트의 또 다른 이점은 많은 요소를 모니터링해야 할 때 오버헤드를 훨씬 낮출 수 있다는 것입니다. tbody 1,000개 행이 있는 데이터 테이블에서 첫 번째 코드 예제는 1,000개 요소에 핸들러를 연결합니다.
위임된 이벤트 접근 방식(두 번째 코드 예제)은 이벤트 핸들러를 하나의 요소인 tbody 에만 연결하고 이벤트는 한 수준(클릭한 tr 에서 tbody )만 버블링하면 됩니다.
document.addEventListener('click', function (e) { if (hasClass(e.target, 'bu')) { // .bu clicked // Do your thing } else if (hasClass(e.target, 'test')) { // .test clicked // Do your other thing } }, false);
hasClass 는 어디에
function hasClass(elem, className) { return elem.className.split(' ').indexOf(className) > -1; }
개체를 만들 때 개체에 이벤트를 추가할 수 있습니다. 서로 다른 시간에 여러 객체에 동일한 이벤트를 추가하는 경우 명명된 함수를 만드는 것이 좋습니다.
var mouseOverHandler = function() { // Do stuff }; var mouseOutHandler = function () { // Do stuff }; $(function() { // On the document load, apply to existing elements $('select').hover(mouseOverHandler, mouseOutHandler); }); // This next part would be in the callback from your Ajax call $("<select></select>") .append( /* Your <option>s */ ) .hover(mouseOverHandler, mouseOutHandler) .appendTo( /* Wherever you need the select box */ ) ;
nickf
이벤트 바인딩 호출을 함수로 래핑한 다음 두 번 호출할 수 있습니다. 한 번은 문서 준비 시, 한 번은 새 DOM 요소를 추가하는 이벤트 이후입니다. 그렇게 하면 기존 요소에서 동일한 이벤트를 두 번 바인딩하는 것을 방지할 수 있으므로 기존 이벤트를 바인딩 해제하거나 새로 생성된 DOM 요소에만 (더 나은) 바인딩해야 합니다. 코드는 다음과 같습니다.
function addCallbacks(eles){ eles.hover(function(){alert("gotcha!")}); } $(document).ready(function(){ addCallbacks($(".myEles")) }); // ... add elements ... addCallbacks($(".myNewElements"))
Greg Borenstein
사용하려고 .live() 대신 .bind() ; .hover.live() 는 Ajax 요청이 실행된 후 .hover를 확인란에 바인딩합니다.
var body = $("body"); var btns = $("button"); var btnB = $("<button>B</button>"); // `<button>B</button>` is not yet in the document. // Thus, `$("button")` gives `[<button>A</button>]`. // Only `<button>A</button>` gets a click listener. btns.on("click", function () { console.log(this); }); // Too late for `<button>B</button>`... body.append(btnB);
var body = $("body"); var btnB = $("<button>B</button>"); var btnC = $("<button>C</button>"); // Listen to all clicks and // check if the source element // is a `<button></button>`. body.on("click", function (ev) { if ($(ev.target).is("button")) { console.log(ev.target); } }); // Now you can add any number // of `<button></button>`. body.append(btnB); body.append(btnC);
이것을 "이벤트 위임"이라고 합니다. 좋은 소식입니다. jQuery에 내장된 기능입니다 :-)
var i = 11; var body = $("body"); body.on("click", "button", function () { var letter = (i++).toString(36).toUpperCase(); body.append($("<button>" + letter + "</button>")); });
// creating a dynamic element (container div) var $div = $("<div>", {id: 'myid1', class: 'myclass'}); //creating a dynamic button var $btn = $("<button>", { type: 'button', text: 'Click me', class: 'btn' }); // binding the event $btn.click(function () { //for mouseover--> $btn.on('mouseover', function () { console.log('clicked'); }); // append dynamic button to the dynamic container $div.append($btn); // add the dynamically created element(s) to a static element $("#box").append($div);
참고: 이렇게 하면 각 요소에 대한 이벤트 핸들러 인스턴스가 생성 됩니다(루프에서 사용될 때 성능에 영향을 미칠 수 있음)
document 수준 이벤트 리스너를 스크립팅하는 것보다 모듈식 함수 방식으로 이벤트 리스너를 배포하는 것을 선호합니다. 그래서 저는 아래와 같이 합니다. 동일한 이벤트 리스너로 요소를 초과 구독할 수 없으므로 리스너를 두 번 이상 연결하는 것에 대해 걱정하지 마십시오. 하나만 고정됩니다.
var iterations = 4; var button; var body = document.querySelector("body"); for (var i = 0; i < iterations; i++) { button = document.createElement("button"); button.classList.add("my-button"); button.appendChild(document.createTextNode(i)); button.addEventListener("click", myButtonWasClicked); body.appendChild(button); } function myButtonWasClicked(e) { console.log(e.target); //access to this specific button }