2014-12-25 7 views
2

JS 코드에서 생성 된 요소를 클릭하여 요소를 Show-Hide으로 만들고 싶습니다. 그러나 어떤 이유로 getElementByIdgetElementsByClassName은 이러한 HTML 요소를 선택하지 못합니다. 여기 JavaScript/JQuery에서 생성 된 요소를 감지/선택하는 방법은 무엇입니까?

는 HTML 코드

var code = '<p class="click-me">Click Me!</p>'; 
$('#container').append(code); 
:

<div id="toShow">Hello World!</div> 
<div id="container"></div> 

컨테이너 div<p> (보기 숨기기하는 데 사용됩니다) 요소와 appending 만들기 : (http://jsfiddle.net/vy09nnco/ 데모를 확인하시기 바랍니다)

$(document).ready(function() {  
    var code = '<p class="click-me">Click Me!</p>';  
    var divToShow = document.getElementById('toShow'); 
    var clickMeDiv = document.getElementsByClassName('click-me'); // Here is the problem 
    var isOpenedClass = 'isOpened'; 
    var formIsClosed = true; 

    $(clickMeDiv).click(function() { 
     $(divToShow).toggleClass(isOpenedClass); 
     formIsClosed = false; 
    }); 
    $(clickMeDiv).click(function() { 
     if (formIsClosed) { 
      $(divToShow).removeClass(isOpenedClass); 
     } 
     formIsClosed = true; 
    })  
    $('#container').append(code);  
}); 
: 여기

는 전체 JQuery와 코드

Show-Hide에 다른 요소를 사용하면 잘 작동합니다 (예 : http://jsfiddle.net/vy09nnco/1/). 그 이유는 생성 된 코드를 선택해야 문제가 발생하기 때문입니다.

도움 주셔서 감사합니다.

+1

요소는 문서에 없지만 [여기] (http://jsfiddle.net/vy09nnco/3/)의 차이점을 참조하십시오. – Wilmer

+1

innerhtml 대신 DOM 개체를 사용하여 새 요소를 만드는 경우 요소에 대한 직접적인 참조를 가지며 이벤트 리스너를 직접 연결할 수 있습니다. – Jasen

+1

개체가 DOM에 존재하기 전에 수신기를 추가하려고합니다. 먼저 추가하거나 추가 콜백에 수신기를 만듭니다. –

답변

1

페이지가로드 된 후에 요소를 만들므로 DOM에 없으므로이 요소에 첨부 된 리스너가 없기 때문입니다. 당신은 body에 이벤트 리스너를 추가 할 수 있습니다 (또는 부모 요소 또는 무언가) 새로 만든 요소를 ​​찾기 위해 :

$("body").on("click", clickMeDiv, function() { 

대신

$(clickMeDiv).click(function() { 

FIDDLE

당신이있어 이후 어쨌든 Jquery를 사용하면 바닐라 자바 ​​스크립트를 사용할 이유가 없습니다. 당신은 훨씬 덜 코드와 같은 soemthing을 수행 할 수 있습니다

FIDDLE

+0

하지만 표시된 div ('toShow')를 클릭하면 왜 숨길 수 있습니까? –

+0

@ CésarNontol 업데이트 내 대답 – jmore009

+0

그것은 좋은 작품! 시간 내 줘서 고마워. 제발,'slideToggle (100)'에 대해 설명해 주시겠습니까? 그리고 div가 열리거나 닫힐 때를 식별하는 방법은 무엇입니까? –

1

당신은 당신의 클릭 이벤트 핸들러를 설정하기 전에 DOM에 요소를 추가해야합니다. 아래에서 재정렬 된 JavaScript를 참조하십시오.

$(document).ready(function() {  
    var code = '<p class="click-me">Click Me!</p>';  
    var divToShow = document.getElementById('toShow'); 
    var clickMeDiv = document.getElementsByClassName('click-me'); // Here is the problem 
    var isOpenedClass = 'isOpened'; 
    var formIsClosed = true; 
    $('#container').append(code); //moved up this line 

    $(clickMeDiv).click(function() { 
     $(divToShow).toggleClass(isOpenedClass); 
     formIsClosed = false; 
    }); 
    $(clickMeDiv).click(function() { 
     if (formIsClosed) { 
      $(divToShow).removeClass(isOpenedClass); 
     } 
     formIsClosed = true; 
    });  
}); 
+0

고맙습니다! 알았다. 문제는 기능 순서대로 이루어졌습니다. –

관련 문제