【问题标题】:How to call function outside of jQuery(document).ready with setTimeout()?如何使用 setTimeout() 调用 jQuery(document).ready 之外的函数?
【发布时间】:2025-12-28 22:20:07
【问题描述】:

我的代码如下所示:

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

    function func1(cont)
    {
        //Some code here
        search.setSearchCompleteCallback(this, searchComplete, null);
        //Some other code
    }
    func1(cont);

    function searchComplete()
    {
        //Some code
        cont += 1;
    if (cont < length ) {
    func1(cont);
    } else {
            // Other code
    }
    }
});

所以我想做的是延迟 func1(cont); 的执行在 searchComplete() 函数内部。这样做的原因是所有代码都是为了与 Google 搜索 API 和 PageRank 检查一起工作,我需要放慢脚本速度,以免被禁止。 (特别是它提出的关于 PR 检查的请求)。 如果我只是在 func1(cont) 上使用 setTimeout();它说没有定义 func1(),如果我尝试在 $(document).ready() 之外获取函数,它会看到该函数但 Google 代码不会因为它需要完全加载页面。

如何修复 setTimeout 或如何将脚本暂停几秒钟?

谢谢!

【问题讨论】:

    标签: javascript jquery settimeout


    【解决方案1】:

    func1(cont);
    

    作为

    window.setTimeout(function() {
        func1(cont);
    }, 1000);
    

    【讨论】:

    • 就是这样!现在可以了。你能解释一下是什么问题吗?谢谢!
    • @Brayn,您的原始代码是这样的吗:window.setTimeout(func1(cont), 1000);?还是window.setTimeout('func1(cont)', 1000);?在前一种情况下,您立即调用func1,然后setTimeout 抱怨它没有给出函数参数(因为func1 不返回函数)。在后一种情况下,func1 在全局范围/闭包中被调用,但那里没有这样的func1,因此出现错误。
    • 我使用的是:window.setTimeout('func1(cont)', 1000);。谢谢,我明白了!
    【解决方案2】:

    而不是像这样声明函数:

    function func1(cont) {}
    

    这样声明:

    var func1 = function(cont) {}
    

    您需要重新排列代码:

    $(document).ready(function(){
        var cont = 0;
        var func1;
    
        var searchComplete = function()
        {
            //Some code
            cont += 1;
            if (cont < length ) {
                func1(cont);
            } else {
                    // Other code
            }
        }
    
        func1 = function(cont)
        {
            //Some code here
            search.setSearchCompleteCallback(this, searchComplete, null);
            //Some other code
        }
    
        func1(cont);
    });
    

    【讨论】:

    • 第一部分不是必须的,两个声明是等价的。
    • 看起来一模一样,而且您的代码也不会延迟对 func1() 的重复调用。在范围内声明函数并将它们分配给范围内的变量在作用域方面是相同的,并且两者的工作方式相同。
    • 我已经尝试过你的代码,但是当我尝试在“searchComplete”中使用 setTimeout 时仍然没有找到“func1”
    • 我已经更新了代码,但仍然收到“func1 is not defined”错误。我在 func1(cont) 上使用 setTimeout 就在:“if (cont
    【解决方案3】:

    我会尝试这样的事情。我更喜欢在 jquery 命名空间中声明 var 和函数,但您同样可以将 cont 变量和函数移到文档就绪函数之外,并让它们在全局范围内可用。

    $(document).ready(function(){
        $.cont = 0;
        $.func1 = function() {
            //Some code here
            search.setSearchCompleteCallback(this, $.searchComplete, null);
            //Some other code
        }
    
        $.searchComplete = function() {
            //Some code
            $.cont += 1;
            if (cont < length ) {
                setTimeout($.func1,1000);
            } else {
                // Other code
            }
        }
    
         setTimeout($.func1,1000); // delay the initial start by 1 second
    });
    

    【讨论】:

    • 我已经尝试过这种方法,但它会从 jQuery 库本身引发错误...
    【解决方案4】:

    希望我的描述正确:

    • document.ready() 事件触发
    • 在 document.ready() 中,您希望在 X 毫秒后调用函数
    • 此函数将 Google 对象 search.setSearchCompleteCallback() 连接到另一个函数(它看起来需要来自 this 的父对象)

    如果是这种情况,为什么需要在 document.ready() 范围内声明的任何函数?您不能简单地将所有 3 个全局化吗?例如

    var search = null; // initialise the google object
    var cont = 0;
    
    function timedSearch()
    {
      search.setSearchCompleteCallback(this, searchComplete, null);
    }
    
    function searchComplete()
    {
       if (++cont < length) // postfix it below if this is wrong
           setTimeout(timedSearch,1000);
    }
    
    $(document).ready(function()
    {
       setTimeout(timedSearch,1000);
    }
    

    如果我误解了,请给我投反对票。

    【讨论】:

    • 我已经尝试过了,但随后我生成了“google.search is undefined”错误。我认为谷歌 API 需要在你做任何事情之前加载页面。在文档中,他们使用 google.setOnLoadCallback() 函数来触发“func1”。我尝试使用它,但它 setTimeout 仍然不起作用。