Javascript函数未在document.ready jquery代码中定义

时间:2013-07-24 09:53:36

标签: javascript jquery function scope anonymous-function

我在我的脚本中包含了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()之外,但它没有帮助。我甚至在getProgress内部的开头定义了startProgress,但它似乎没有识别出这个功能。我做错了什么?

5 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:3)

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

$(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;

答案 2 :(得分:1)

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

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

你可以在jQuery ready函数中定义函数getProgress

答案 3 :(得分:0)

请使用:

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

这应该可以正常工作。

答案 4 :(得分:-1)

function getProgress(uid)$(document).ready()内定义,因此它位于不在全局范围内的私有范围内。所以要使用它,只需将其移动到全局。