的XMLHttpRequest在IE-7(XMLHttpRequest in IE-7)

2019-09-19 10:07发布

我创建的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中工作吗?

Answer 1:

听起来就像是响应被缓存。

一个伪随机字符串(例如时间戳)添加到URI的端部到缓存突发。



Answer 2:

你只是有缓存的问题与IE7的,因为它缓存了XMLHttpRequest()它创建后,并将其存储在内存中。 即使subsequents xmlhttp=new XMLHttpRequest(); 变量没有得到任何分配新建分配FY因为它已经有一个实例 (从你的第一个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将每次找到一个空的引用,将有必要再重新创建每次使用。

如果你不想创建和删除eacht时候你只是一些HTTP报头中的XMLHTTPRequest的发挥

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

建议喜欢这里

另一种替代方案包括:

  • 使用POST方法比GET方法

    xmlHttp_global.open( “POST”, “checkFormDependency.action”,假); xmlHttp_global.setRequestHeader( “内容类型”, “应用程序/ x WWW的形式进行了urlencoded”); //或另一种内容类型,它取决于你xmlHttp_global.send( “表格名称=” +表格名称+ “&的applicationName =” + APPNAME);

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

    xmlHttp_global.open( “GET”, “checkFormDependency.action表格名称=” +表格名称+ “&的applicationName =” + APPNAME + “randomVar =” +的Math.random(),假);

链接

  • XMLHTTPRequest的高速缓存在IE 7和6


文章来源: XMLHttpRequest in IE-7