0

我有一个 js,它从不同的 php 文件和显示 js vars 的 html 中获取 sql 查询。

到目前为止,它可以工作一段时间,但由于 js 在获取数据时缓存每个 php 页面,它会慢慢使我的浏览器超载,最终导致浏览器崩溃。

我对此有几个问题: A)我将如何禁用 2 个 php 页面的“旧”集的缓存... B)有更好的方法吗?

var seconds = 3;
var divs = new Array("div1", "div2");
var urls = new Array("jaxcount.php", "jaxcount2.php");

    // Refresh DIV
    function refreshdiv() {
        for (var i = 0; i < 2; i++) {
            var div = divs[i];
            var url = urls[i];
            dorefresh(div, url);
            break;
        }
    }

    function dorefresh(div, url){
        // Stolen XMLHTTP Request Object

        var xmlHttp;
        try {
            xmlHttp = new XMLHttpRequest(); // Firefox, Opera 8.0+, Safari
        } catch (e) {
            try {
                xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); // Internet Exploder
            } catch (e) {
                try {
                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {
                    return false;
                }
            }
        }

        // IE Optimizations

        fetch_unix_timestamp = function () {
            return parseInt(new Date().getTime().toString().substring(0, 10));
        };

        var timestamp = fetch_unix_timestamp();
        var nocacheurl = url + "?t=" + timestamp;

        // The Beef

        xmlHttp.onreadystatechange = function () {
            if (xmlHttp.readyState === 4) {
                document.getElementById(div).innerHTML = xmlHttp.responseText;
                setTimeout('refreshdiv()', seconds * 1000);
            }
        };
        xmlHttp.open("GET", nocacheurl, false);
        xmlHttp.send(null);
    }

    // Trigger Refresh

    var seconds;
    window.onload = function startrefresh() {
        setTimeout('refreshdiv()', seconds * 1000);
    };
4

2 回答 2

3

该问题与浏览器中的页面缓存无关。它与您的 Ajax 调用的瀑布效应有关。

问题来自您setTimeout('refreshdiv()', seconds * 1000);在 Ajax 调用的回调内部调用的事实。

每次调用 refreshdiv 时都会调用两次 setTimeout。每次通话时,您都会拨打两个电话,然后加起来。最终,您将进行大量的 Ajax 调用。视觉上是这样的:

First Call      A
               / \
              /   \
Second       A     A
            / \   / \
Third      A   A A   A  
4th       AA  AA AA  AA
5th      AAAAAAAAAAAAAAAA 

你怎么能解决它?检查您是否有激活的定时器,如果没有激活的定时器,请设置它。

改变

setTimeout('refreshdiv()', seconds * 1000);

成为类似的东西

if (!window.timer) {
    window.timer = setTimeout(refreshdiv, seconds * 1000);
}

还有其他解决方案,但这个很容易实现。

于 2013-06-11T16:56:19.040 回答
0

虽然您可以(并且正在)使用缓存破坏器查询字符串,但最好修改服务器端代码以发出适当的缓存到期标头,例如

<?php
header('Cache-control: max-age=60'); // cache for 60 seconds at most
header('Expires: Tue, 11 Jun 2013 12:00:00 GMT'); // expire at a specific date/time.

然后,您只需每次都使用相同的 url,浏览器自己的缓存机制将负责清除陈旧的数据。

于 2013-06-11T16:58:35.503 回答