Javascript 使用带有jQuery的setTimeout排序函数时出现问题

Javascript 使用带有jQuery的setTimeout排序函数时出现问题,javascript,jquery,tabs,settimeout,Javascript,Jquery,Tabs,Settimeout,我正在使用一些jQuery代码创建选项卡,其中页面内容被分成几个部分(可从选项卡块顶部导航),并希望在单击“下一个”或“上一个”链接(位于每个选项卡内容的底部)时执行以下操作: 要向上滚动到选项卡块顶部的页面(使用“.scrollTo”插件成功实现)超过750ms 滚动后,选项卡将更改为相应的“上一页”或“下一页”选项卡(由标签url标识)-250毫秒后 使用以下代码: $(".external_link").click(function() { $.scrollTo(515, 750, {ea

我正在使用一些jQuery代码创建选项卡,其中页面内容被分成几个部分(可从选项卡块顶部导航),并希望在单击“下一个”或“上一个”链接(位于每个选项卡内容的底部)时执行以下操作:

  • 要向上滚动到选项卡块顶部的页面(使用“.scrollTo”插件成功实现)超过750ms
  • 滚动后,选项卡将更改为相应的“上一页”或“下一页”选项卡(由标签url标识)-250毫秒后
  • 使用以下代码:

    $(".external_link").click(function() {
    $.scrollTo(515, 750, {easing:'easeInOutQuad'});
    setTimeout(changeTab($(this).attr("href")), 1000);
    return false;
    });
    
    这两件事在密苏里州同时发生。如果有人能告诉我我做错了什么,我将非常感激

    守则全文如下:

    $(document).ready(function() {
    
    $(".tab_content").hide();
    $("ul.content_tabs li:first").addClass("active").show();
    $(".tab_content:first").show();
    
    $('.content_tabs li').each(function(i) {
    var thisId = $(this).find("a").attr("href");
    thisId = thisId.substring(1,thisId.length) + '_top';
    $(this).attr("id",thisId);
    });
    
    function changeTab(activeTab) {
    
    $("ul.content_tabs li").removeClass("active");
    $(activeTab + '_top').addClass("active");
    
    $(".tab_content").hide();
    $(activeTab).fadeIn();
    
    }
    
    //check to see if a tab is called onload
    if (location.hash!=""){changeTab(location.hash);}
    //if you call the page and want to show a tab other than the first, for instance     index.html#tab4
    
    $("ul.content_tabs li").click(function() {
    if ($(this).hasClass("active"))
    return false;
    
    changeTab($(this).find("a").attr("href"));
    return false;
    });
    
    
    $(".external_link").click(function() {
    $.scrollTo(515, 750, {easing:'easeInOutQuad'});
    setTimeout(changeTab($(this).attr("href")), 1000);
    return false;
    });
    });
    
    我尝试使用setTimeout执行此操作对吗?我的知识极其有限

    setTimeout(changeTab($(this).attr("href")), 1000); 
    
    这是错误的,你必须输入一个函数,而不是执行一个函数的结果,250毫秒更有意义。changeTab是函数,changeTab(参数)是执行函数。所以试试看

    var that = $(this);
    setTimeout(function() {changeTab(that.attr("href"))}, 250); 
    

    我认为它们同时执行的原因是,当设置超时时,您直接调用changeTab函数,而上一个函数在继续之前等待750ms。

    您正在将函数调用传递给
    setTimeout()
    。您需要传递一个函数引用。调用将立即执行,但函数引用将在超时过期时执行。像这样调用
    setTimeout()

    setTimeout(function() { changeTab($(this).attr("href")); }, 1000);
    

    此外,您应该考虑利用<代码> ON/<代码>选项,该选项指示在滚动完成时调用的函数。这样做可能更有意义:

    $.scrollTo(515, 750, {
        easing: 'easeInOutQuad',
        onAfter: function () {
            setTimeout(function() { changeTab($(this).attr("href")); }, 250);
        }
    });
    

    完美的非常感谢!:)