5

我正在通过 ajax 加载一个 json 文件。如果 Chrome 开发工具已打开,则一切正常。如果 Chrome 开发工具已关闭,则会失败。值得庆幸的是,即使关闭,开发工具仍然会继续这样做,所以我仍然可以看到我得到的异常:

Failed to load resource: the server responded with a status of 412 (Precondition Failed) http://localhost/experiments/escape/maps/test.json

为什么开发工具是否开放会有先决条件?此外,打开和关闭开发工具似乎不太可能以任何方式影响服务器的行为,所以我认为是 Chrome 阻止了请求,而不是异常中建议的服务器。

不幸的是,开发工具在关闭时不会跟踪网络活动,因此我无法使用网络选项卡获取更多信息。

AJAX 通过 JQuery 处理,代码如下:

map.load = function(mapName, tileSource, tileWidth, tileHeight, onLoad) {
    $.ajax({
        url: '../escape/maps/'+mapName+'.json',
        type: 'post',
        success: function(mapData) {
            // there's loads of stuff in here but I don't think it's relevant to the question as the failure prevents the success method from being called.
        }
    });
};

此代码在 Firefox 中不会导致任何问题,因此似乎专门连接到 Chrome 开发工具。欢迎任何建议,因为我完全糊涂了!

编辑:好的,所以这根本不是开发工具的错误——我在开发工具中禁用了缓存,重新启用它可以让脚本正常工作。为什么我的代码依赖于缓存?在 Firefox 中禁用/启用缓存不会导致任何问题

EDIT2:好的,我想我已经接近了。失败的前提条件是 if-modified-since 条件(文件未更改)。我假设 chrome 发送此消息以确认是否使用缓存版本,但是,尽管先决条件失败,但它不会加载缓存版本。我认为这可能意味着缓存以某种方式损坏,所以我清除了缓存。不幸的是,这并不能解决问题。该文件将愉快地加载一次,但下次我回到我开始处理相同问题的地方。有任何想法吗?

4

1 回答 1

3

@Rondel - 你明白了!问题是我愚蠢地使用'post'来获取静态文件。发布请求永远不应该被缓存,这就是 Chrome 不检索它的原因。我仍然不知道为什么 chrome 仍然发送 if-modified-since 标头,但无论如何更改请求类型以获得问题的解决方案(对不起,Crome 开发工具不公平地责怪你 - 问题,像往常一样,是我的代码!)

于 2013-05-17T14:24:38.950 回答