再次调用时,AJAX函数请求会停止以前的加载 - 请不要使用jQuery

再次调用时,AJAX函数请求会停止以前的加载 - 请不要使用jQuery

问题描述:

我有这个功能将一个url加载到一个元素中。问题是,如果我重复调用它,就像在循环中加载多个元素一样,当前加载会停止:

I got this function to load an url into an element. The problem is that if I call it repetitively, like in a loop to load several elements, the current load stops:

function ajaxGetData(url, objId)
{
    var request;
    if (window.XMLHttpRequest) 
    { 
        request = new XMLHttpRequest();
    } 
    else if (window.ActiveXObject) 
    { 
        try 
        {
            request = new ActiveXObject('Msxml2.XMLHTTP');
        } 
        catch (e) 
        {
        try {
            request = new ActiveXObject('Microsoft.XMLHTTP');
        } 
        catch (e) {}
        }
    }

    if (!document.getElementById(objId))
    {
        return false;
    }
    var obj = document.getElementById(objId); /* <= fix: added var */
    ajaxLoadingIndicator(obj);

    request.addEventListener("progress", function(event){ajaxCallBack(event, obj)}, false);
    request.addEventListener("load", function(event){ajaxCallBack(event, obj)}, false);
    request.addEventListener("error", function(event){ajaxCallBack(event, obj)}, false);
    request.addEventListener("abort", function(event){ajaxCallBack(event, obj)}, false);

    request.onreadystatechange = function() 
    {
        if(request.readyState === 4) 
        { 
            if(request.status === 200) 
            { 
                obj.innerHTML  = request.responseText;
            }
            else
            {
                obj.innerHTML = '<div id="'+id+'">Error loading data.</div>';
            }
        }
    };
    request.open('GET', url, true);
    request.send(null);
}

function ajaxLoadingIndicator(obj)
{
    idBase = obj.id.split("_");
    id = idBase[0]+"_ajax_loading";
    obj.innerHTML = '<div id="'+id+'">Loading</div>';
}

function ajaxCallBack(e) 
{
    // Handle each event
    switch(e.type)
    {
        case 'error':
        {
            idBase = obj.id.split("_");
            id = idBase[0]+"_ajax_error";
            obj.innerHTML = '<div id="'+id+'">Server unavailable. Error loading data.</div>';
        } break;
    }
}

所以如果我这样做:

ajaxGetData(url1, objId1);
ajaxGetData(url2, objId2);
ajaxGetData(url3, objId3);

只有objId3获取其内容,其余内容卡在加载指示符中。

Only objId3 gets its content, the rest get stuck in the "loading" indicator.

你的代码中有一个全局变量 obj

You've got a global variable obj in your code.

// function ajaxGetData(url, objId)
obj = document.getElementById(objId);
ajaxLoadingIndicator(obj);

您的所有请求都在共享相同的变量,这就是为什么看起来只有最后一个请求正在完成。您可以使用声明中的 var 关键字进行修复。

All of your requests are sharing the same variable so that's why it appears that only the last request is completing. You can fix it using the var keyword in the declaration.