以下代码是相当自我解释的,但我遇到了将click事件绑定到已创建的元素的问题。
你可以在第25行看到我正在创建一个id为'overlay'的div。然后我设置了它的css属性。
然后在第65行我绑定点击以触发隐藏模态。问题是,它不起作用。如果我将div放在html中,.click就会按预期工作。
感谢任何帮助。
<!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 :(得分:5)
在元素存在之前,对叠加层的单击事件进行绑定。您需要使用live binding来保留绑定 - 否则每次创建元素时都必须执行绑定。只需更改您的功能即可使用live()
,如下所示:
$('#overlay').live('click', function () {
$('#overlay').fadeOut(1000);
$('.modal').fadeOut(200);
});
.modal .close
的点击事件有效,因为绑定事件时已在DOM中定义。
普通事件绑定仅考虑DOM中当前存在的元素,而与live()
绑定的事件也适用于与选择器匹配的所有未来元素。
答案 1 :(得分:0)
// Overlay click = trigger out
$('#overlay').click(function () {
$('#overlay').fadeOut(1000);
$('.modal').fadeOut(200);
});
当#overlay元素不存在时,在页面加载时触发。如果您在$('a[name=modal]').click(function(e) {
部分内部移动此代码,但在$ ('body').append('<div id="overlay"></div>');
部分之后,它应该可以正常工作。
答案 2 :(得分:0)
如果您以编程方式创建#overlay,则需要将其与$ .live()绑定;
$('#overlay').live("click", function () {
$('#overlay').fadeOut(1000);
$('.modal').fadeOut(200);
});
这种绑定方法绑定到与提供的选择器匹配的所有现有和未来元素。
答案 3 :(得分:0)
使用.live()方法,它将适用于加载后添加到DOM的任何元素。
// Overlay click = trigger out
$('#overlay').live('click', function () {
$('#overlay').fadeOut(1000);
$('.modal').fadeOut(200);
});
另一种方法是在添加时将其绑定到点击(在$('a [name = modal]')的点击处理程序内。
您可能还应该将$('#overlay')。fadeOut()更改为$(this).fadeOut()。
答案 4 :(得分:0)
请注意,每次点击a[name=modal]
链接时,您的代码都会创建新的叠加层。
完成后从DOM中删除overlay元素..或者在点击之外创建它,只需在点击事件中显示/隐藏它。
您特定的问题是您在创建之前将点击事件绑定到叠加层(,因为您将在点击链接后创建)