【问题标题】:Javascript function not defined within document.ready jquery codeJavascript 函数未在 document.ready jquery 代码中定义
【发布时间】:2013-07-24 09:53:35
【问题描述】:

我已经在我的脚本中包含了 jquery,现在我正在尝试制作这个上传进度条脚本的 jquery 版本:http://www.ultramegatech.com/2008/12/creating-upload-progress-bar-php/

这是我的尝试:

$(document).ready(function () {

    function startProgress(uid) {
        console.log("starting progress");
        setTimeout('getProgress("' + uid + '")', 500);
        //some more stuff
    }

    function getProgress(uid) {
        console.log("getting progress");
        $.ajax({
            type: "GET",
            url: 'upload_getprogress.php?uid=' + uid,
            success: function (msg) {
                progress = msg;
                setTimeout('getProgress("' + uid + '")', 100);
                // do some more stuff
            }

        });
    }

    $('#upload').submit(function () {
        startProgress('<?php echo $uid; ?>');
    });
});

但是我收到了这个错误:

Uncaught ReferenceError: getProgress is not defined

怎么样?

我试图将函数放在document.ready() 之外,但没有帮助。我什至在startProgress 内部的开头定义了getProgress,但它似乎无法识别该功能。我做错了什么?

【问题讨论】:

  • setTimeout 函数语法有错误,所以正确的语法可以完美运行。

标签: javascript jquery function scope anonymous-function


【解决方案1】:

无法仔细检查,但我猜这是因为提交回调的范围。尝试这些方法;

$(document).ready(function(){   
    $('#upload').submit(function(){ window.startProgress('<?php echo $uid; ?>'); });
});

var startProgress = function(uid) {
       console.log("starting progress");
       setTimeout('getProgress("' + uid + '")', 500);
       //some more stuff
};

var getProgress = function(uid) {
    console.log("getting progress");
    $.ajax({  type: "GET", 
        url: 'upload_getprogress.php?uid=' + uid, 
        success: function(msg) {   
            progress = msg;
            setTimeout('getProgress("' + uid + '")', 100);
                    // do some more stuff
        }

    });
};

window.startProgress = startProgress;
window.getProgress = getProgress;

【讨论】:

  • 您不需要将函数定义为变量,然后再定义window.function = function,但除此之外,这应该可以解决问题,所以 +1 :)
  • 谢谢,现在可以使用了。但是我的代码不起作用的原因是什么?早些时候,我确实尝试将函数保留在document.ready() 之外,并将$('#upload').submit() 代码留在里面,但即使这样也没有用。将函数的定义简单地更改为 var = function() 有何不同?
【解决方案2】:

getProgress()document.ready() 的回调范围内定义。如果您将字符串参数传递给setTimeout(),则会在全局范围内进行评估。所以你的方法从那里看不到。

您可以更改您的代码,使用这样的匿名函数:

 setTimeout( function() {
   getProgress( uid); 
 }
 , 100);

【讨论】:

    【解决方案3】:

    如果你使用 setTimeout 函数,如
    setTimeout('getProgress("' + uid + '")',500)

    您必须将函数 getProgress 放在全局范围内, 如果你使用 setTimeout( getProgress(uid),500) 之类的 setTimeout 函数,

    你可以在 jQuery 就绪函数中定义函数 getProgress

    【讨论】:

      【解决方案4】:

      请使用:

      setTimeout(function() { getProgress( uid ); }, 500 )
      

      应该没问题。

      【讨论】:

      • 那会用文字字符串调用 getProgress...getProgress("' + uid + '");
      【解决方案5】:

      function getProgress(uid)$(document).ready() 内部定义,因此它在私有范围内而不是在全局范围内。所以要使用它,只需将其移至全局即可。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-06
        • 1970-01-01
        • 2017-03-30
        • 1970-01-01
        • 1970-01-01
        • 2011-04-06
        相关资源
        最近更新 更多