[英]jQuery doesn't work in <head>?
这段代码应该通过淡出最顶层的元素,直到只有第一个元素可见,然后淡入最顶层的元素,然后淡出最重要的元素,从叠加的列表元素(我注释掉CSS以便我可以看到正在发生的事情)进行幻灯片展示。休息,重新开始。 如果我把脚本放在我的内容下面<body>
并抛出$(function() {
它完全正常,但在<head>
没有任何反应。我昨天写了这个,今天我仍然看不到错,所以我在这里发帖。
<!DOCTYPE html>
<html>
<head>
<title></title>
<style type="text/css">
ul {
position: relative;
}
ul li {
/*position: absolute;
left: 0;
top: 0;*/
}
</style>
<script src="jquery-1.5.1.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(function() {
var i = 0;
var count = $('ul li').size();
function fade() {
if (i < count-1) {
$('ul li:nth-child('+(count-i)+')').fadeOut(300);
i++;
} else {
$('ul li:nth-child('+count+')').fadeIn(300, function(){$('ul li').show();});
i = 0;
}
}
$('button').click(function() {
setInterval('fade()', 1000);
});
});
</script>
</head>
<body>
<button>Slideshow GO!</button>
<ul id="slider">
<li><img src="1.jpg" /></li>
<li><img src="2.jpg" /></li>
<li><img src="3.jpg" /></li>
<li><img src="4.jpg" /></li>
</ul>
</body>
</html>
谢谢
区别在于将代码包装在$(function () {})
会导致fade
函数在本地声明,而不是全局声明。 setTimeout
在全局范围内计算'fade()'
,因此无法找到该函数。
通常不好的做法是给setTimeout
一个字符串,所以用指向函数的指针替换它:
setTimeout(fade, 1000);
我不久前在这里回答了类似的问题,但是这个问题还依赖于从setTimeout中访问局部变量。
在jQuery中编程的基本方法是将所有DOM访问代码包含在$(document).ready()事件处理程序中。 重做你的javascript如下:
var i = 0;
var count;
function fade() {
if (i < count-1) {
$('ul li:nth-child('+(count-i)+')').fadeOut(300);
i++;
} else {
$('ul li:nth-child('+count+')').fadeIn(300, function(){$('ul li').show();});
i = 0;
}
}
}
$(document).ready(function() {
count = $('ul li').size();
$('button').click(function() {
setInterval('fade()', 1000);
});
} );
请注意,i,count和fade在$(document).ready之外声明,因为它们的范围是全局的。 这是关键,因为您的setInterval处理程序需要全局可用。
jQuery的一大优势在于,无论您将代码放在何处,都可以保证它会在应该的时候执行。 在加载整个DOM树之前,$(document).ready中的代码将不会执行,从而确保您访问时引用的所有元素都可用。
如果您打开浏览器的JavaScript控制台,它会告诉您具体问题是什么:
fade is not defined
setInterval('fade()', 1000);
试试这个:
$(function() {
var i = 0;
var count = $('ul li').size();
$('button').click(function() {
setInterval(function(){
if (i < count-1) {
$('ul li:nth-child('+(count-i)+')').fadeOut(300);
i++;
} else {
$('ul li:nth-child('+count+')').fadeIn(300, function(){$('ul li').show();});
i = 0;
}
}, 1000);
});
});
在setInterval
使用字符串很难正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.