2

我正在创建 XMLHttpRequest 如下:

function checkDependencyFormFilledStatus(appName,formName){
    var xmlhttp;
    xmlhttp=new XMLHttpRequest();
    xmlhttp.open("GET","checkFormDependency.action formName="+formName+"&applicationName="+appName,false);
    xmlhttp.send();
    var dependentFormEmptyStatus = Ext.JSON.decode(xmlhttp.responseText);
    alert(xmlhttp.responseText);
    return dependentFormEmptyStatus;
}

对象返回的响应取决于操作类使用的数据库。

这在 Firefox 10.0 中运行良好。

但是对于 IE7,它只在第一次返回正确的响应。对于其余的函数调用,它返回相同的响应(无论我们在数据库中进行什么更改)。仅当我关闭选项卡并打开它时(甚至在重新加载页面时),它才会更新其响应。

如何让它在 IE 7 中工作?

4

2 回答 2

5

听起来响应正在被缓存。

在 URI 的末尾添加一个伪随机字符串(例如时间戳)以缓存突发。

于 2012-07-13T10:11:38.770 回答
3

您只是在使用 IE7 时遇到了缓存问题,因为它在创建 XMLHttpRequest() 并将其存储在内存中之后对其进行了缓存。即使有后续xmlhttp=new XMLHttpRequest();变量,也不会得到任何赋值,因为它已经有一个实例(从你的第一个xmlhttp=new XMLHttpRequest();)。

您需要做的是在每次使用后使您的 XMLHttpRequest 请求无效销毁。

您首先像这样创建您的 XMLHttpRequest(对于 msie 7):

function createXMLHttpRequest(){
    var xmlHttp = null;
    if(typeof XMLHttpRequest != "undefined"){
        xmlHttp = new XMLHttpRequest();
    }
    else if(typeof window.ActiveXObject != "undefined"){
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP.4.0");
        }
        catch(e){
            try {
                xmlHttp = new ActiveXObject("MSXML2.XMLHTTP");
            }
            catch(e){
                try {
                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                }
                catch(e){
                    xmlHttp = null;
                }
            }
        }
    }
    return xmlHttp;
}

所以每次在您要使用的功能中创建它。

function checkDependencyFormFilledStatus(appName,formName){
    if(xmlHttp_global){
        xmlHttp_global.abort(); // abort the current request if there's one 
    }
    // Create the object each time a call is about to be made
    xmlHttp_global = createXMLHttpRequest();
    if(xmlHttp_global){
    xmlHttp_global.onreadystatechange = myCallbackFunction; // make you callback thing here
    xmlHttp_global.open("GET","checkFormDependency.action formName="+formName+"&applicationName="+appName,false);
    xmlHttp_global.send(null);
    }
}

在您的回调(“onreadystatechange”函数)中,您在使用它后将其删除

function myCallbackFunction()
{
 if(xmlHttp_global && xmlHttp_global.readyState == 4){
 //do your thing here and ... or nothing 

var dependentFormEmptyStatus = Ext.JSON.decode(xmlhttp.responseText);
    alert(xmlhttp.responseText); // like this for example?

  xmlHttp_global = null; //delete your XMLHTTPRequest
 }

}

因此 IE 7 每次都会找到一个空引用,并且每次使用都需要重新创建它。

如果您不想每次都创建和删除它,您只需在 XMLHTTPRequest 中使用一些 HTTP-Headers

xmlHttp_global.setRequestHeader("If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 GMT");
xmlHttp_global.setRequestHeader("Cache-Control", "no-cache");

喜欢这里的建议

另一种选择包括:

  • 在 GET 方法上使用 POST 方法

    xmlHttp_global.open("POST","checkFormDependency.action",false); xmlHttp_global.setRequestHeader("内容类型","application/x-www-form-urlencoded"); // 或其他内容类型,由您决定 xmlHttp_global.send("formName="+formName+"&applicationName="+appName);

  • 在查询字符串中使用“虚拟”变量来爆出 IE(7,6) 的缓存器

    xmlHttp_global.open("GET","checkFormDependency.action formName="+formName+"&applicationName="+appName+"randomVar="+Math.Random(),false);

链接

于 2012-07-13T10:45:15.230 回答