JS - 制作自定义AJAX函数的问题

时间:2012-12-05 08:47:47

标签: javascript ajax

我正在尝试创建一个函数来处理我的AJAX帖子。 我能够让它发送数据,但是我遇到了从请求中接收数据的问题。

基本上,我有一个名为ajaxPost(paramArray, target)的函数,它的作用是接受参数并将它们放入一个字符串中以提交给target

我认为这个问题来自ajaxReq.onreadystatechange,我认为它正在跳过这个并结束脚本。

我不知道我是否正确解释了我的意思,这是脚本:

function ajaxPost(paramArray, target){
    var param = '';
    var key;
    for (key in paramArray){
        param = param + key + '=' + paramArray[key] + '&';
    }
    param = param.substring(0, param.length - 1);

    var ajaxReq = new XMLHttpRequest();
    ajaxReq.onreadystatechange = function(){
        if(ajaxReq.readyState == 4 && ajaxReq.status == 200){
            return ajaxReq.responseText;
            document.write('Test?');
        }
    }
    ajaxReq.open('POST', target, true);
    ajaxReq.setRequestHeader('Content-type', "application/x-www-form-urlencoded");
    ajaxReq.send(param);
}

这是“完成工作”的功能,这是一个调用上述功能的函数示例:

function submitPost(form){
    var title = form.title.value;
    var text = form.textBody.value;
    var name = form.nameOfPoster.value;
    var paramArray = new Array();
    paramArray['title'] = title;
    paramArray['text'] = text;
    paramArray['name'] = name;
    if (ajaxPost(paramArray, 'post.php')){
        location.reload(true);
    }
}

这实际上是将参数发送到ajaxPost(),如果它返回了某些内容,则重新加载页面。

正如我所说,我认为忽略了本文开头提到的那一部分。我只是想知道是否可以在收到数据之前暂停该功能。

请不要告诉我使用jQuery,我正在尝试使用javascript:)

感谢。 如果你有这些提示,请添加其他提示。

1 个答案:

答案 0 :(得分:2)

AJAX是异步的。您尝试使用它的方式将无效,因为ajaxReq.onreadystatechange函数将在请求完成后执行。同时,脚本执行不会停止。所以,这个:

if (ajaxPost(paramArray, 'post.php')){
        location.reload(true);
}

将在ajaxReq.onreadystatechange

之前执行

你应该做的是将回调传递给你的函数:

function ajaxPost(paramArray, target, callback){
    var param = '';
    var key;
    for (key in paramArray){
        param = param + key + '=' + paramArray[key] + '&';
    }
    param = param.substring(0, param.length - 1);

    var ajaxReq = new XMLHttpRequest();
    ajaxReq.onreadystatechange = function(){
        if(ajaxReq.readyState == 4 && ajaxReq.status == 200){
            callback(ajaxReq.responseText);
            document.write('Test?');
        }
    }
    ajaxReq.open('POST', target, true);
    ajaxReq.setRequestHeader('Content-type', "application/x-www-form-urlencoded");
    ajaxReq.send(param);
}

而不是:

function submitPost(form){
    var title = form.title.value;
    var text = form.textBody.value;
    var name = form.nameOfPoster.value;
    var paramArray = new Array();
    paramArray['title'] = title;
    paramArray['text'] = text;
    paramArray['name'] = name;
    ajaxPost(paramArray, 'post.php', function(res) { if(res)  location.reload(true); });
}