jQuery不起作用?

时间:2011-03-08 07:46:58

标签: javascript jquery

此代码应该通过淡出最顶层的元素直到只有第一个元素可见,然后淡入最顶层,从叠加的列表元素(我注释掉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>

由于

3 个答案:

答案 0 :(得分:4)

不同之处在于,将代码包装在$(function () {})中会导致fade函数声明为本地,而不是全局setTimeout评估全局范围内的'fade()',因此无法找到该函数。

通常不好的做法是给setTimeout一个字符串,所以用指向函数的指针替换它:

setTimeout(fade, 1000);

我不久前回答了一个类似的问题here,但该问题还依赖于从setTimeout中访问局部变量。

答案 1 :(得分:0)

在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中的代码将不会执行,从而确保您访问时引用的所有元素都可用。

答案 2 :(得分:0)

如果您打开浏览器的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中使用字符串很难做对。