Internet Explorer 8中Prototype Ajax.Request导致文件下载问题

2 投票
2 回答
1188 浏览
提问于 2025-04-16 05:39

我有一段可以用原型的ajax代码,这段代码在除了IE以外的所有浏览器上都能正常工作。但是在IE8中,原本应该返回给Ajax.Request中指定的onSuccess处理函数的JSON数据,却被转到一个文件下载的窗口,弹出来让你选择下载位置。

askForm = $('askForm');
var askUrl = '.';
var askParameters = askForm.serialize(true);
askForm.disable();

var askAjax = new Ajax.Request(
    askUrl, {
    method: 'post', 
    parameters: askParameters, 
    onSuccess: handleResults,
    onFailure: handleError
    }
);

function handleError(transport) {
   alert('Please refresh this page, an error occurred in processing at the server.');
}

function handleResults(transport) {
...
}

在handleResults函数中还有更多代码,但这个函数从来没有被调用。经过调试发现,下载提示是在调用Ajax.Request函数时出现的。

每次IE8提示下载的文件名都不一样,都是4个看起来随机的十六进制值(8个字符),而且没有文件扩展名。文件的内容就是从服务器返回的纯JSON数据……

{"question": ["Enter your question*"], "name": ["Enter your name (First L.)*"], "sender": ["Enter your e-mail*"]}

如果能提供一些建议,我会非常感激。这种情况发生在Snow Leopard上,IE8在VMWare Fusion中运行,访问的是一个通过apache/django/python在OS X上运行的网站。不过,由于在VMWare的Windows XP机器上,Chrome和Firefox都能正常工作,所以看起来问题直接出在IE8上。

2 个回答

0

服务器端发送给浏览器的JSON文件,是否发送了正确的头信息?如果没有告诉浏览器这是JSON格式,浏览器可能会把它当作一个需要下载的文件。

3

这个问题已经解决了。事情有点复杂,原来是因为出现了一个JavaScript错误,导致脚本无法正常运行,结果浏览器就直接提交了表单,返回了一个下载文件的提示,而不是我们想要的AJAX响应。这个表单设计得很巧妙,即使在不支持JavaScript的浏览器中,也能通过一个隐藏的输入框来使用,那个输入框的名字是“js”。当通过AJAX提交表单时,JavaScript会把这个输入框的值清空,这样服务器就知道应该返回JSON格式的数据,而不是刷新整个页面。其实,清空这个输入框值的那段JavaScript代码本身是正常执行的,但之后脚本出错了,导致event.stop()这段代码没有执行。结果就是表单被当作普通的提交按钮点击处理,浏览器发出了一个POST请求。

注意上面的代码...

askForm = $('askForm');

其实应该是...

var askForm = $('askForm');

感谢那些支持这种语法的浏览器,但这让我在IE8上经历了一场无果的追逐。总是在学习中。

撰写回答