2010-02-10 9 views
3

다음 코드는 설명이 필요하지만 생성 된 요소에 click 이벤트를 바인딩하는 문제가 있습니다.동적으로 생성 된 요소를 jQuery에서 바인딩

25 행에서 'overlay'ID를 가진 div를 생성하고 있습니다. 그런 다음 CSS 속성을 설정합니다.

그런 다음 65 행에서 클릭하여 모달 숨기기를 트리거합니다. 문제는 작동하지 않는다는 것입니다. div에 html을 넣으면 .click이 예상대로 작동합니다.

도움을 주시면 감사하겠습니다. #overlay 요소가 존재하지 않는 경우

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>Modal</title> 

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.pack.js"></script> 
<script type="text/javascript"> 

$(document).ready(function() { 

    // Select the link(s) with name=modal 
    $('a[name=modal]').click(function(e) { 

     // Cancel the link behavior 
     e.preventDefault(); 

     // Get the id of this link's associated content box. 
     var id = $(this).attr('href'); 

     // Find the screen height and width 
     var overlayHeight = $(document).height(); 
     var overlayWidth = $(window).width(); 

     // Create the overlay 
     $('body').append('<div id="overlay"></div>'); 

     //Set css properties for newly created #overlay 
     $('#overlay').css({ 
       'width' : overlayWidth, 
       'height' : overlayHeight, 
       'position':'absolute', 
       'left' : '0', 
       'top' : '0', 
       'z-index' : '9000', 
       'background-color' : '#000', 
       'display' : 'none'   
      }); 

     // Get the viewpane height and width 
     var winH = $(window).height(); 
     var winW = $(window).width(); 

     // Center the modal 
     $(id).css('top', winH/2-$(id).height()/2); 
     $(id).css('left', winW/2-$(id).width()/2); 

     // Transition effects for overlay 
     $('#overlay').fadeIn(1000).fadeTo(1000,0.8); 

     // Transition effect for modal 
     $(id).fadeIn(1000); 

    }); 

    // Close link click = trigger out 
    $('.modal .close').click(function (e) { 
     //Cancel the link behavior 
     e.preventDefault(); 

     $('#overlay').fadeOut(1000); 
     $('.modal').fadeOut(200); 
    });  

    // Overlay click = trigger out 
    $('#overlay').click(function() { 
     $('#overlay').fadeOut(1000); 
     $('.modal').fadeOut(200); 
    }); 

    // Load rules in to modal 
    $('#rules .text').load('rules.html'); 

}); 

</script> 
<style type="text/css"> 

.modal{ 
    position:absolute; 
    display:none; 
    z-index:9999; 
} 
#rules{ 
    width:600px; 
    height:400px; 
} 
#rules p{ 
    background: #fff; 
    margin: 0; 
    padding: 0; 
} 
#rules .head{ 
    background: #ddd; 
    text-align: right; 
    padding: 0 10px; 
    height: 30px; 
} 
#rules .text{ 
    height: 370px; 
    padding: 0 20px; 
    overflow: auto; 
} 

</style> 
</head> 
<body> 

<p><a href="#rules" name="modal">Open Modal</a></p> 

<div id="rules" class="modal"> 
    <p class="head"><a href="#" class="close">close</a></p> 
    <p class="text"></p> 
</div> 

</body> 
</html> 
+0

+1 스택 오버플로에 오신 것을 환영합니다. @ Greg-J! – Sampson

답변

5

오버레이에 대한 클릭 이벤트는 요소가 존재하기 전에 바인딩됩니다. 바인딩 –을 유지하려면 live binding을 사용해야합니다. 그렇지 않으면 요소를 만들 때마다 바인딩을 수행해야합니다. 다만이 같은 live()를 사용하도록 기능을 변경 :

$('#overlay').live('click', function() { 
    $('#overlay').fadeOut(1000); 
    $('.modal').fadeOut(200); 
}); 

이벤트가 결합 될 때 이미 DOM에 정의되어 .modal .close 작품에 대한 클릭 이벤트.

일반 이벤트 바인딩은 live()으로 바인드 된 이벤트가 선택기와 일치하는 이후의 모든 요소에서도 작동하는 동안 DOM에 현재 존재하는 요소 만 고려합니다.

+0

이것은 정확히 내가 문제라고 생각했던 것입니다. 그러나 어떻게 해결해야할지 몰랐습니다. 고맙습니다! – S16

+2

나는 .delegate() (또는 jquery 1.7+에서 .on()이 더 빠르고 효율적이라고 믿는다. – Khodor

0
// Overlay click = trigger out 
    $('#overlay').click(function() { 
     $('#overlay').fadeOut(1000); 
     $('.modal').fadeOut(200); 
    }); 

는 페이지로드에 트리거됩니다. 코드 부분을 $('a[name=modal]').click(function(e) { 부분으로 옮기고 $ 부분 이후로 옮기면 작동합니다.

0

프로그래밍 방식으로 오버런을 작성하는 경우 $ .live();와 바인딩해야합니다.

$('#overlay').live("click", function() { 
    $('#overlay').fadeOut(1000); 
    $('.modal').fadeOut(200); 
}); 

이 바인딩 방법은 제공된 선택자와 일치하는 현재의 모든 요소와 미래의 요소를 바인딩합니다.

0

.live() 메소드를 사용하면로드 된 후 DOM에 추가하는 모든 요소와 함께 작동합니다.

// Overlay click = trigger out 
$('#overlay').live('click', function() { 
    $('#overlay').fadeOut(1000); 
    $('.modal').fadeOut(200); 
}); 

는 $의 클릭 핸들러 ('A [이름 = 모달]') 내부 (이 추가 될 때 클릭을 결합하는 것입니다 할 수있는 또 다른 방법.

당신은 변화도 아마해야 $ ('# 오버레이'). 페이드 아웃()에서 $ (이) .fadeOut().

0

.. 코드가 새로운 오버레이에게 a[name=modal] 링크를 클릭 할 때마다 생성됩니다 점을 명심

하나 끝내면 DOM에서 오버레이 요소를 제거하거나 클릭 밖에서 만들면/보여

당신 특정 문제가 이제까지 만들어지기 전에 오버레이에 클릭 이벤트를 바인딩한다는 것입니다 .. 클릭 이벤트에 숨길 단지 D (해당 링크를 클릭 후 생성 된 것이기 때문에 ..)

관련 문제