2015-01-13 5 views
0

클릭하면 해당 DIV 내부에 다른 DIV가 추가됩니다. 그런 다음 새로 추가 된 DIV를 클릭하면 제거됩니다.jQuery에서 중첩 된 클릭

HTML

<div id="container"></div> 

jQuery를

$('#container').on('click', function(e){ 

    // Add other DIV 
    $(this).append('<div class="other">XYZ</div>'); 

    e.stopPropagation(); 

    // Remove other DIV 
    $('div.other').bind('click', function(event){ 

    $(this).remove(); 

    event.stopPropagation(); 

    }); 

}); 

어떻게 효율적으로 내가 아이 div를 많이해야 할 계획이 방법입니까?

+0

매우 효과적이라고 생각합니다 ... – tymeJV

+0

"많이"무엇인가요? 일반적으로 선택기와 일치하는 모든 요소가 아닌 추가 된 요소에만 클릭을 첨부해야합니다. 지 수십만 개의 요소를 삽입해야하는 경우 위임 된 이벤트 처리기가 더 좋습니다. – adeneo

+0

모든 클래스가'other'를 가지고 있다면, 간단히'$ ("# container")를 할 수 있습니다 on ("click", ".other", function() {' – tymeJV

답변

2

다른 이벤트가 발생하면 이벤트를 첨부하면 의도하지 않은 부작용이 발생할 수 있으며 DOM에 메모리 누수가 발생할 수 있습니다.

일반적으로 처리기를 한 번 부착하고 자주 실행하십시오.

$(document) 
    .on('click', '#container', function(e) { 
     // Add other DIV 
     $(this).append('<div class="other">XYZ</div>'); 
    }) 
    .on('click', 'div.other', function(e) { 
     $(this).remove(); 
     e.stopPropagation(); 
    }); 
+0

이 위젯은 이벤트 위임을 사용하기 때문에 좋습니다. –

+0

@eg_dac 예, 저는 항상 사용합니다. 첨부하고 잊어 버리십시오. document.ready에서 아무 문제가 없습니다. – amphetamachine

+0

구문 분석의 성능에 대해서는 어떻게됩니까? 타이어 DOM 트리? –

1

나는 약간 그래서 JQuery와 바꿀 것 당신은 .bind 대신으로 .Append의 선택 떨어져 체인 등을 CSTE 연구진 사용할 수 있습니다

$('#container').on('click', function(e){ 
    // Add other DIV 
    $(this).append(
     $('<div>').attr('class', 'other') 
      .html('XYZ') 
      // Remove other DIV 
      .on('click', function(event){ 
       $(this).remove(); 
       event.stopPropagation(); 
      }); 
    ) 
    e.stopPropagation(); 
}); 

그건 안된 코드,하지만 기능적이어야한다 너와 똑같아. 전체 DOM에서 이벤트가 발생하여 비효율적이므로 $ (document)에 대한 바인딩을 피할 것입니다. DOM 구문 분석은 자바 스크립트 코드 실행에서 가장 시간이 많이 소요되는 부분이므로 JQuery 선택기를 재사용하는 것이 더 효율적이기도하다.

+0

이 코드는 #container를 클릭 할 때마다 새로운 기능을 생성합니다. – amphetamachine

+1

...이 요소는이 요소가 제거 될 때 파괴되므로 이벤트는 여전히 한 번만 존재합니다. 필요한 경우에만 생성되며, 실행시에 요소에 대한 DOM을 매우 빠르게 트래버스합니다.이 경우 $ (문서)가 사용되면 효율성이 떨어집니다. JQuery 셀렉터가 더 구체적 일수록 실행 속도가 빠릅니다. – MaKR

0

많은 일을하지 않기 때문에 최적화가 필요하지 않을 것입니다. 당신이 바닐라 JS를 사용하지 않고 최적의을 수 있도록하려면하지만,이 같은 갈 것 :

var $myDiv = $('<div class="other">XYZ</div>'); //Cache the div instead of creating it every click 

$('#container').on('click', function(e){ 
    if($myDiv.is(e.target)) //Check if your div is the clicked target 
     $myDiv.remove(); //Remove the div 
    else 
     $myDiv.appendTo(this) // Else append the div. 
}); 

그냥 유의 div 어린이 요소를 포함 할 경우 if로 변경되어야한다 :

if($(e.target).closest($myDiv).length) 
+0

#container가 항상 첫 번째 였기 때문에 이벤트 대상에 대한 행운이 없었습니다. –

+0

@redhatlab * "항상 먼저"* 당신이 의미하는 바를 설명 할 수 있습니까? '$ myDiv'가 음수의 z- 인덱스 (이벤트 위임이 작동하지 않아야 함)를 제외하고,이 솔루션은 효과적이어야합니다. –

+0

위임 폼으로 전환했고 대상을 다시 사용하지 않아도되었지만 이전 버전의 스크립트에서는 클릭 한 대상 요소를 가져올 수 없었습니다. 이제는 언급 했으니 까, 나는 다른 DIV를 수용하기 위해 Z- 색인을 사용하고 있었다. 충고 고맙습니다. 나는 이제 DIV를 만들려고 노력했습니다. 다른 드래그 가능합니다. –

관련 문제