如何使jQuery只找到第一个列表项,而不是所有列表项?

3
我正在尝试实现一个基本的jQuery无限轮播。这不仅是为了学习过程,也是为了其他任何事情(通常我不喜欢重新发明轮子,但是...我必须以某种方式学习,最好从基础开始)。
我已经成功地将列表向左动画化了,但是当涉及选择列表的第一个元素时,我卡住了。我尝试使用:
$('ul#services > li:first');
$('ul#services > li:first-child');
$('ul#services > li').eq([0]);

以下是xhtml代码:

在每种情况下,console.log(first)(使用的var名称)都会返回所有的列表项。我是否做错了什么明显的事情?

最终计划是克隆第一个li,将其附加到父ul,从列表中删除li,并允许列表无限滚动。它只是一些服务的列表而不是链接,因此目前我没有计划添加滚动或左/右功能。

当前的xhtml:

编辑以添加当前代码/ html的全部内容

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">

<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

    <title></title>

    <link rel="stylesheet" type="text/css" href="css/stylesheet.css" />

    <!--[if IE 8]>

        <link rel="stylesheet" type="text/css" href="css/ie8.css" />

    <![endif]-->

    <!--[if lte IE 7]>

        <link rel="stylesheet" type="text/css" href="css/ie7.css" />

    <![endif]-->

    <style type="text/css" media="screen">
ul#services {overflow: visible; }
    </style>

    <script type="text/javascript" src="js/jquery.js"></script>


    <script type="text/javascript">

        $(document).ready(

            function() {

                $(document).ready(function() {

                    $('h1 > span.businessName').each(
                            function() {
                                var text = $(this).html();
                                var first_letter = text.substr(0,1);

                                if ( /[a-zA-Z]/.test(first_letter) ) {
                                    $(this).html('<span class="firstLetter">' + first_letter + '</span>' + text.slice(1));
                                }
                            }
                    ); 
            });

                $('ul#services > li').filter(':odd').addClass('odd');
                $('ul#services > li').filter(':visible:last').addClass('last');

//--> Function starts

        jQuery.fn.carousel = function() {
            // 1. find the width of the list items:

                var listWidth = $('ul#services > li').outerWidth();

            // 2a. find the current first item:

                var curFirst = $('ul#services > li').first();

                console.log(curFirst);

            // 2b. append the current first item:

            // 2c. remove the first item 

            // 3. animate the list, to move left by listWidth:

                $('ul#services > li').delay(500).css('position','relative').animate(
                    {
                    left: '-=' + listWidth
                    },
                    5000,
                        function() {

    //                      $('ul#services').get(0).remove();
                            $('ul#services').delay(500).carousel()
                        }
                );
            };
//--> Function ends.
            $('ul#services').carousel();

            }
        )

    </script>


</head>

<body>

    <div id="pageWrap">

        <div id="branding">

            <h1><span class="businessName">business name</span> <span class="tagline">some other info</span></h1>
            <hr id="rule">

        </div>

        <div id="content">

<div class="carousel">

    <div class="wrapper">

        <ul id="services">
            <li>one</li
            ><li>two</li
            ><li>three</li
            ><li>four</li
            ><li>five</li
            ><li>six</li
            ><li>seven</li
            ><li>eight</li
            ><li>nine</li
            ><li>ten</li>
        </ul>

    </div>

        </div>

        <div id="mainPane">
<p>Lorem ipsum dolor sit amet...</p>
        </div>

        <div id="sidebar">

            <div id="contact">
    <!--
        STARTS hCARD (below)
    -->
                <div id="hcard">
                    <div id="hcard-yy-xx" class="vcard">
                        <span class="fn"><span class="given-name">YY</span> <span class="family-name">XX</span></span>
                        <div class="org">business name</div>
                        <a class="email" href="mailto:xx@xx.com">email</a>

                            <div class="tel">

                            </div>
                            <a class="downloadAs" href="http://suda.co.uk/projects/microformats/hcard/get-contact.php?uri=http://www.davidrhysthomas.co.uk/arch/tester.html">Download contact information</a>
                    </div>
                </div>
    <!--
        ENDS hCARD (above)
    -->
            </div>

            <div id="professionalBodies">

                <ul>
                    <li>some stuff</li>
                </ul>

            </div>

        </div>

    </div>

        <div class="push"></div>

    </div>

        <div id="footer">


        </div>

</body>

</html>

针对Nick Craver的回答进行更新:

...我认为你想要的是:$('ul#services li:first').remove(); ...你可能想要的是这样的:$('ul#services > li:first').delay(500)...

使用$('ul#services li:first').remove();会产生错误:

未捕获的类型错误:对象#没有方法'remove'

与使用$('ul#services > li:first').delay(500)...相比,行为似乎没有区别。


1
你首先设置在哪里?选择器是正确的,我猜问题出在外面了,你能把设置/使用它的代码贴出来吗? - Nick Craver
我本来希望隐藏我对jQuery的可怕罪行... =) 是的,我会发布我正在尝试利用的函数。给我几秒钟... - David Thomas
你能提供完整的代码吗?也许里面有些东西可以帮助我们。 - Nick Larsen
1
@Nick Craver,@NickLarson:已完成。 - David Thomas
2个回答

9

由于您正在学习它,我不会在这里进行所有更正,但以下是主要要点:

这是错误的:$('ul#services').get(0).remove();
我认为您想要的是:$('ul#services li:first').remove();

这是您看到的主要原因:$('ul#services > li').delay(500)... 这会在每个子<li>上启动动画,您会看到10个console.log,因为您每次都会启动carousel 10次,每个<li>一次。

您可能想要的是类似于$('ul#services > li:first').delay(500)...的东西。

这些都说得通吗?我不确定您想要的最终结果是什么,只是试图解释您当前的行为。


啊!我已经注意到了remove()错误,感谢Google的控制台。动画问题甚至没有出现在我的脑海中。谢谢!那么,我假设需要对ul进行动画处理,而不是后代的li(我在评论中留下了我的错误,但编辑以指出我已经注意到了您的建议,即对$('ul#services > li:first')进行动画处理,再次感谢?+1) - David Thomas
@ricebowl - 我不太确定你想要什么结果,所以很难说,你是想让它们向上滚动还是...? - Nick Craver
向左滚动。理想情况下,我正在尝试克隆第一个列表元素,将其附加到列表中,然后删除克隆元素。反复操作... - David Thomas
顺便提一句,使用 $('ul#services').get(0).remove() 会在Chrome控制台中生成错误:"Uncaught TypeError: Object #<an HTMLUListElement> has no method 'remove'"。 - David Thomas
除了从右到左的滚动偏好之外,这正是我想要的 =) 谢谢!+已接受! - David Thomas

4

1
假设你的意思是 var first = $('ul#services > li').first(),我只能说它没有起作用。 - David Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接