在setInterval函数

时间:2017-05-10 15:43:06

标签: javascript jquery

我正在尝试使用jQuery创建一个非常简单的幻灯片。不幸的是,我收到以下错误:

TypeError: $(...).get(...).hide is not a function

我查看了Stack Overflow,但找不到我的答案。最初,我在$(document).ready()之外定义了setTimeout和setInterval中调用的函数,因为我认为它使代码更清晰一些。但是,在对错误进行一些研究之后,似乎可能是代码在$(document).ready()之外的问题。但是,将它放在$(document).ready()函数中并不能解决问题。

$(document).ready(function () {
    var slideCount = 0;
    var currentSlide = 0;

    $("#slideshow").hide();

    var sliderTimeout = setTimeout(function () {


        $.ajax({
            type: "POST",
            url: "/Home/ShowSlideshow",
            dataType: "html",
            success: function (data) {
                if (data != null) {
                    $("#slideshow").html(data);
                    $("#slideshow").show();
                    $("#slideshow .slide").not(":first-child").hide();
                    slideCount = $("#slideshow .slide").length;

                    setInterval(function () {

                        alert($("#slideshow .slide").get(currentSlide));
                        $("#slideshow .slide").get(currentSlide).hide();


                        if (!(currentSlide >= slideCount)) {
                            $("#slideshow .slide").get(parseInt(currentSlide + 1)).show();
                            currentSlide++;
                        } else {
                            $("#slideshow .slide").get(0).show();
                            currentSlide = 0;
                        }
                    }, 2000);
                }
            },

            error: function (x, stat, er) {
                alert("Error " + stat + " " + er);
            }
        });
    }, 5000);

});

来自ajax请求的数据被正确返回。它还正确执行以下行:

    $("#slideshow").show();
                $("#slideshow .slide").not(":first-child").hide();

只有当它进入setInterval函数时才会出现问题。它发现元素很好(如alert($("#slideshow .slide").get(currentSlide));语句所示)只是没有隐藏它。

以下产生相同的错误:

    function displaySlideshow() {

    $.ajax({
        type: "POST",
        url: "/Home/ShowSlideshow",
        dataType: "html",
        success: function (data) {
            if (data != null) {
                $("#slideshow").html(data);
                $("#slideshow").show();
                $("#slideshow .slide").not(":first-child").hide();
                slideCount = $("#slideshow .slide").length;

                setInterval(slide, 5000);
            }
        },
        error: function (x, stat, er) {
            alert("Error " + stat + " " + er);
        }
    });
}

function slide () {

    alert($("#slideshow .slide").get(currentSlide));
    $("#slideshow .slide").get(currentSlide).hide();


    if (!(currentSlide >= slideCount)) {
        $("#slideshow .slide").get(parseInt(currentSlide + 1)).show();
        currentSlide++;
    } else {
        $("#slideshow .slide").get(0).show();
        currentSlide = 0;
    }
}   


$(document).ready(function () {


    $("#slideshow").hide();

    var sliderTimeout = setTimeout(displaySlideshow, 5000);



});

我尝试将setInterval函数放在ajax成功回调之外(但在setTimeout中),但仍然没有成功。

我已经努力寻找答案,但还没有成功。任何建议将不胜感激。

2 个答案:

答案 0 :(得分:0)

你需要做这样的事情:

$($("#slideshow .slide").get(currentSlide)).hide();

答案 1 :(得分:0)

而不是使用其他人指出的get()返回实际的DOM节点,将jQuery集合减少到你想要的一个元素:

$("#slideshow .slide").filter(":eq(" + currentSlide + ")").hide();

在您的情况下,您甚至可以将其缩短为:

$("#slideshow .slide:eq(" + currentSlide + ")").hide();