jQuery AJAX回调未触发

3

我有一个AJAX请求:

$.ajax({
   url : "proxy.php",
   type : "POST",
   data : xmlData,
   contentType : "application/x-www-form-urlencoded",
   processData : false,
   success : function(data) {
       // success
   },
   error : function(data) {
       // error
   },    
});

这是由PHP代理回答的问题:

header('Content-type: text/xml');
echo $someXmlResponse;
exit();

没有任何回调被触发,无论是成功还是错误。

这不是我第一次遇到这种情况了。出了什么问题?


编辑:一些更新——尾随逗号不是问题,但感谢指出。控制台没有显示错误。Firebug显示请求已经正确发送和接收。请求返回状态码200 OK,数据也正确返回。


感谢大家的帮助。你们所有的反馈都很有用。然而,没有一个能够解决问题。看起来这是Firefox 4b5中的一个bug。


2
首先需要进行基本的调试。控制台中是否有任何错误消息?Firebug显示了什么 - 请求是否实际被触发?它们返回什么状态码?您发送了什么类型的数据?为什么要使用显式内容类型? - Pekka
你在控制台中是否收到任何JavaScript错误? - Jake N
@Pekka - 感谢您的评论。我更新了问题,我应该提到所有这些数据,但基本调试显然没有显示任何内容。回调根本没有被触发。 - Yuval Adam
@Yuval 好的,请求已经发出了吗?服务器返回的状态码是什么? - Pekka
1
@Yuval,你可以尝试使用complete回调函数吗?它是否触发了?你是如何测试它们是否触发的,使用alert()吗? - Pekka
1
有时候在Chrome中查看页面会更有帮助,它的错误报告比Firefox要好得多,在回调或生成函数中的JavaScript语法错误有时是完全静默的。 - Tgr
3个回答

3
您所观察到的行为可能是由于服务器返回的无效XML无法解析。尝试返回保证有效的XML内容:
header('Content-Type: text/xml'); // <-- Notice the Content-Type header casing
echo '<foo/>';
exit();

同时,您将contentType设置为application/x-www-form-urlencoded,而您的数据参数称为xmlData,假设为XML。通过将processData参数设置为false,您表明数据应按原样发布,而不会自动转换为application/x-www-form-urlencoded,但仍然在请求中指示此内容类型,这似乎是矛盾的。
另外,如果您期望从服务器收到XML,则可以指定dataType:'xml'
因此,您的请求可能如下所示:
$.ajax({
    url: 'proxy.php',
    type: 'POST',
    contentType: 'text/xml',
    data: '<request/>',
    processData: false,
    dataType: 'xml',
    success: function(data) {

    },
    error: function(data) {

    }
});

Darin,[data:'<request/>']在这里具体是做什么的?之前,他使用它来发送一个值,我认为这个值是由一个名为'xmlData'的变量保存的,而你已经用'<request />'替换了它。这里到底发生了什么? - d2burke

2

这可能不是你的问题,但在某些版本的IE中会导致问题。在error:回调函数之后有一个尾随逗号。

无论是否是问题,你都应该将其删除。

$.ajax({
   url : "proxy.php",
   type : "POST",
   data : xmlData,
   contentType : "application/x-www-form-urlencoded",
   processData : false,
   success : function(data) {
       // success
   },
   error : function(data) {
       // error
   }  // <--- removed trailing comma
});

谢谢,但那不是问题所在。 - Yuval Adam

0

你尝试过使用"dataType"而不是"data"吗?像这样:

试试:

$.ajax({
   url : "proxy.php",
   type : "POST",
   dataType : 'xml',
   contentType : "application/x-www-form-urlencoded",
   processData : false,
   success : function(xml) {
       // success
   },
   error : function(xml) {
       // error
   }  
});

不 - 显然我必须发布XML数据。 - Yuval Adam
非常抱歉,您并不总是需要发送才能接收,因为您的PHP没有明确说明它正在接收任何内容,这一点我表述不够清楚,这是我的疏忽。无论如何,那么您是否仍然不需要声明数据类型呢?您试过这样做吗? - d2burke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接