javascript - 带有加载通知的跨浏览器 xmlhttprequest 响应

标签 javascript ajax cross-browser xmlhttprequest

我有跨浏览器实用程序功能,用于设置我从该站点复制的正确的 XMLHttpRequest 对象。其次,我想有一个适当的功能来返回文本或加载加载数据的通知。如果加载数据需要很长时间,最好有一个错误通知。谢谢。

if (!AJAX) var AJAX = {};
else if (AJAX && typeof(AJAX) != "object")
throw new Error("AJAX is not an Object type");

JSAJAX = {
NAME: "AJAX",
VERSION: 1.0,

initAJAX: function(){
    var objxml = null;
    var ProgID = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Microsoft.XMLHTTP"];            

    try{
        objxml = new XMLHttpRequest();
    }
    catch(e){                
        for (var i = 0; i < ProgID.length; i++){
            try{
                objxml = new ActiveXObject(ProgID[i]);
            }
            catch(e){                        
                continue;
            }
        }
    }

    return objxml;            
},

getAJAXResponseText: function(xhr){
    var outObj = {};

    outObj.outMsg = "";
    outObj.loadingFlag = false;
    outObj.errorFlag = false;

    if (xhr.readyState == 4){

        if (xhr.status == 200){
            outObj.outMsg = xhr.responseText;
            outObj.loadingFlag = false;
            outObj.errorFlag = false;
        }else{
            outObj.outMsg = "There was a problem with the request " + xhr.status;
            outObj.loadingFlag = false;
            outObj.errorFlag = true;
        }

    }else{

        if (xhr.status == 200){
            outObj.loadingFlag = true;
            outObj.errorFlag = false;               
        }else{
            outObj.outMsg = "There was a problem with the request " + xhr.status;
            outObj.loadingFlag = false;
            outObj.errorFlag = true;                
        }
    }

    return outObj;
}
}

这里的代码:

window.onload = makeRequest;
var xhr = false;
var currMsg;

function makeRequest() {
currMsg = document.getElementById("updateArea").innerHTML;

xhr = AJAX.initAJAX();

if (xhr) {
    xhr.onreadystatechange = showState;
    xhr.open("GET", "colors.xml", true);
    xhr.send(null);
}
else {
    document.getElementById("updateArea").innerHTML = "Sorry, but I couldn't create an XMLHttpRequest";
}
}

function showState() {
var retObj = AJAX.getAJAXResponseText(xhr);

if (retObj.loadingFlag) { // Missing time expiriration of loading
    document.getElementById("updateArea").innerHTML = currMsg + "<h2>Loading...</h2>";
}else{
    document.getElementById("updateArea").innerHTML = currMsg + "<p>" + retObj.outMsg + "</p>";
}
}

最佳答案

这是解决方案(感谢@Itay Moav):

if (!AJAX) var AJAX = {};
else if (AJAX && typeof(AJAX) != "object")
throw new Error("AJAX is not an Object type");

AJAX = {
NAME: "AJAX scripts",
VERSION: 1.0,

initAJAX: function(){
    var objxml = null;
    var ProgID = ["Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.3.0", "Microsoft.XMLHTTP"];            

    try{
        objxml = new XMLHttpRequest();
    }
    catch(e){                
        for (var i = 0; i < ProgID.length; i++){
            try{
                objxml = new ActiveXObject(ProgID[i]);
            }
            catch(e){                        
                continue;
            }
        }
    }

    return objxml;            
},

getAJAXResponseText: function(xhr){
    var outObj = {};

    outObj.outMsg = "";
    outObj.loadingFlag = false;
    outObj.errorFlag = false;

    if (!xhr){
            outObj.outMsg = "The request has expired";
            outObj.loadingFlag = false;
            outObj.errorFlag = true;

    }else if (xhr.readyState == 4){

        if (xhr.status == 200){
            outObj.outMsg = xhr.responseText;
            outObj.loadingFlag = false;
            outObj.errorFlag = false;
        }else{
            outObj.outMsg = "There was a problem with the request " + xhr.status;
            outObj.loadingFlag = false;
            outObj.errorFlag = true;
        }

    }else{

        if (xhr.status == 200){
            outObj.loadingFlag = true;
            outObj.errorFlag = false;               
        }else{
            outObj.outMsg = "There was a problem with the request " + xhr.status;
            outObj.loadingFlag = false;
            outObj.errorFlag = true;                
        }
    }

    return outObj;
}
}

还有这个:

window.onload = makeRequest;
var xhr = false;
var currMsg;
var timer;

function makeRequest() {
currMsg = document.getElementById("updateArea").innerHTML;

xhr = AJAX.initAJAX();

if (xhr) {
    xhr.onreadystatechange = showState;
    xhr.open("GET", "colors.xml", true);
    timer = setTimeout(function(){xhr = null;}, 2000); // can't delete the object
    xhr.send(null);
}
else {
    document.getElementById("updateArea").innerHTML = "Sorry, but I couldn't create an XMLHttpRequest";
}
}

function showState() {
var retObj = AJAX.getAJAXResponseText(xhr);

if (!retObj.errorFlag){
    if (retObj.loadingFlag) {
        document.getElementById("updateArea").innerHTML = currMsg + "<h2>Loading...</h2>";
    }else{
        clearTimeout(timer);
        document.getElementById("updateArea").innerHTML = currMsg + "<p>" + retObj.outMsg + "</p>";
    }
}else{
    document.getElementById("updateArea").innerHTML = currMsg + "<p>" + retObj.outMsg + "</p>";
}
}

关于javascript - 带有加载通知的跨浏览器 xmlhttprequest 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6604935/

相关文章:

javascript - 如何在 webpack 中导入的 html 文件中使用从 index.js 导入的样式?

javascript - 如何使用 jQuery 调用需要基本身份验证的 JSON Web 服务?

javascript - javascript中的多线程

html - firefox中img标签宽度高度问题

javascript - 如何在reactjs中互相嵌入组件?

javascript - 获取和设置 chrome 标志

php - 如何将 jQuery/AJAX 结果放入表格单元格

jquery - 当单击表单内的链接时,如何停止触发表单的 ajax 事件?

jQuery 重新应用 native 不支持的 CSS 规则(例如在 IE 中)

jquery - 使用 jQuery 进行独立于浏览器的键码处理