拥有一组支持原型的ajax代码,可以在IE以外的所有浏览器中使用。在IE8中,JSON(否则返回到Ajax.Request中指定的onSuccess处理函数)被抛入文件下载流,弹出并提示下载位置。
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中运行,在OS X上访问通过apache / django / python运行的站点。但是,由于VMWare Windows XP机器中的Chrome和Firefox功能正常,似乎直接指向IE8作为罪魁祸首。
答案 0 :(得分:3)
这个问题已经解决了。疯狂的问题,但事实证明,有一个javascript错误阻止脚本执行,标准表单提交通过浏览器发生,从而返回AJAX代码作为文件下载提示。该表单的设计方式使得禁用javascript的浏览器仍然可以使用名称为“js”的隐藏输入字段而不使用ajax的表单。当通过AJAX提交时,javascript将空白该字段的值,让服务器知道响应应该是JSON而不是整页刷新。好吧,那个空白js字段值的javascript部分正常处理但后来脚本出错了,因此event.stop()javascript从未执行过。导致表单被处理为标准的提交按钮单击,通过浏览器发出POST请求。
请注意以上代码......
askForm = $('askForm');
显然应该......
var askForm = $('askForm');
感谢允许这种语法的浏览器,但结果却让我发了一个IE8狂野追逐。一直在学习。
答案 1 :(得分:0)
将JSON发送到浏览器的服务器端文件是否发送了正确的标头?如果它不将自己标识为JSON,则浏览器可能会将其视为要下载的文件。