AJAX中的onreadystatechange无法正常工作

时间:2012-03-01 09:09:42

标签: javascript ajax http

当我发出ajax请求时,我的onreadystatechange有问题,它曾用于调用该函数 现在它不会调用processRequest。

我不确定我是否编辑了某些东西或者是什么......可以帮助..

function createAjaxObject(url, callback) 
{
    /// @par Implementation 
    var req = init();
  req.onreadystatechange = processRequest;

    /// @brief  Creates a ajax object based on the runnunf browser    
    function init() 
    {
        if (window.XMLHttpRequest)
            return new XMLHttpRequest();
        else if (window.ActiveXObject) 
            return new ActiveXObject("Microsoft.XMLHTTP");
    }

    /// @brief Checks if request is complete and HTTP call is successful
    function processRequest () 
    {   

        /// readyState of 4 signifies request is complete

        if (req.readyState == 4){

            /// status of 200 signifies sucessful HTTP call
            if (req.status == 200){
                if (callback) 
                callback(req.responseXML);
            }
        }
    }

     this.doPost = function(param) {

             if (req.readyState == 4) {

        /// make a HTTP GET request to the URL asynchronously
        req.open("POST",url, true);
        req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        req.setRequestHeader("Content-length",param.length);
        req.setRequestHeader("Connection", "close");
        req.send(param);

        }
    }
}

感谢,

1 个答案:

答案 0 :(得分:2)

这一行:

if (req.readyState == 4) {

...(以及相应的})不应出现在您分配给this.doPost的函数中。 E.g:

this.doPost = function(param) {

    /// make a HTTP GET request to the URL asynchronously
    req.open("POST",url, true);
    req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    req.setRequestHeader("Content-length",param.length);
    req.setRequestHeader("Connection", "close");
    req.send(param);
};

我假设您使用的方式是:

var obj = new createAjaxObject(url, callback);
obj.doPost();

...因为引用的代码实际上从不调用发布帖子的函数,而只是将它分配给this上的属性。您为this指定属性的通常位置是在构造函数中,因此我使用上面的new

(顺便说一句:JavaScript代码中的压倒性惯例是对用作构造函数的函数使用初始上限,例如CreateAjaxObject [或者更好,仅AjaxObject]而不是createAjaxObject 。)

我会对该代码进行其他更改,但我认为这是最小的。


附注:我建议您使用JavaScript库,例如jQueryPrototypeYUIClosureany of several others。它们平滑了很多的浏览器差异,并提供了大量经过良好测试的实用程序功能,让您专注于实际需要做的事情。