2010-10-18 143 views
2

有一组支持原型的ajax代码,可以在IE以外的所有浏览器中使用。在IE8中,JSON会返回到Ajax.Request中指定的onSuccess处理函数中,并被扔到文件下载流中,该流将弹出并提示下载位置。Internet Explorer 8中的Prototype Ajax.Request问题提示文件下载

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上,运行在VMWare Fusion中的IE8运行在OS X上访问通过apache/django/python运行的站点。但是,由于VMWare Windows XP机器中的Chrome和Firefox正常运行,似乎直接指向IE8作为罪魁祸首。

回答

3

此问题已解决。疯狂的问题在这里,但事实证明,有一个JavaScript错误,阻止脚本执行和标准表单提交发生通过浏览器,从而返回AJAX代码作为文件下载提示。该表单的设计方式是禁用JavaScript的浏览器仍然可以使用不带Ajax的表单,并使用名称为“js”的隐藏输入字段。当通过AJAX提交时,javascript会将此字段的值留空,以让服务器知道响应应该是JSON而不是整页刷新。那么,正常处理js字段值的那部分javascript,然后脚本错误,因此event.stop()JavaScript从未执行。导致表单作为标准提交按钮单击处理,通过浏览器发送POST请求。

注意在上面的代码...

askForm = $('askForm'); 

这显然应该是...

var askForm = $('askForm'); 

感谢,允许这种语法的浏览器,但它送我上IE8雁追逐结果。永远学习。

0

将JSON发送到浏览器的服务器端文件是否发送正确的标题?如果它不将自己标识为JSON,则浏览器可能会将其视为要下载的文件。

+0

使用指定mimetype =“text/javascript”的django.http.HttpResponse对象发送响应 - 也许我应该考虑修改它还是添加其他标头? – sansjoe 2010-10-18 14:34:59

+0

附录:刚试过mimetype作为'application/json',IE8的行为没有任何变化。 – sansjoe 2010-10-18 14:40:31