2012-04-12 60 views
0

我花了一段时间试图找出这一个。我确信有合适经历的人将能够看到问题,但我不明白为什么它不一致。AJAX不一致工作

基本上,这一切确实是打两个电话。它在页面加载时获得一个数字。然后,当用户提交表单时,它会进行第二个调用,它告诉我的PHP文件只将当前总提交数加1。

它工作的大部分时间,它甚至似乎是我在IE7和IE8的工作(在某种程度上 - 它似乎在某种程度上缓存数量,因此你只能告诉它已经从一个不同的浏览器更新)。

编辑:我只使用IE9的开发人员工具测试IE7和IE8,还没有尝试过自己的实际安装。

$(document).ready(function() { 

    var request = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest; 
     var url = "counter.php?myaction=getcount"; 
     request.open('GET', url, true); 
     request.onreadystatechange = function() { 
    if (request.readyState == 4) { 
     request.onreadystatechange = doNothing; 
     updateCounter(request.responseText); 
    } 
    }; 
    request.send(null); 

}); 

    function doNothing() {}; 

    function addCount() { 

    var request2 = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest; 
     var url2 = "counter.php?myaction=addcount"; 
     request2.open('GET', url2, true); 
     request2.onreadystatechange = function() { 
    if (request2.readyState == 4) { 
     request2.onreadystatechange = doNothing; 
     updateCounter(request2.responseText); 
       $('#stcPetitionForm').submit(); 
    } 
    }; 
    request2.send(null);  

    } 

    function updateCounter(numSubmissions) { 
      $("#myCounter").html("<p>" + numSubmissions + "</p>"); 
    } 

回答

1

GET请求被高速缓存。您是否在服务器端设置了缓存标头?

+0

出于某种原因,我的意见是不显示up ... 编辑:好的,那一个。以下是我想说的: 我修复了缓存问题。这可能会影响第二次电话吗? PHP只查看发送的'myaction'的值,如果它是'addcount',它会查看表单提交的当前值并将其增加1。第一次后,缓存是否会阻止它发生有人填写表格,如果他们想再填写一遍? – user1020189 2012-04-12 16:42:40

+0

如果你正在更新服务器的状态,你应该做一个POST而不是GET。 – epascarello 2012-04-12 16:54:11

+0

它也收到这个数字回来更新它在当前页面(虽然我想我可以用JS做到这一点) – user1020189 2012-04-12 16:58:19

0

发生这种情况是因为GET请求被缓存。

  • var d = new Date(); 
    var url2 = "counter.php?myaction=addcount&time=' + d.getTime(); 
    // you'd apply to all your url's not just url2 
    

以展示的getTime:

如何避免缓存例

  • function postTime(){ 
        var d = new Date(); 
        console.log(d.getTime()); 
    } 
    
    setInterval(postTime,1000);