【问题标题】:JQuery ajax error function is executed even if query is successfulJQuery ajax错误函数即使查询成功也会执行
【发布时间】:2009-06-09 09:11:07
【问题描述】:

我正在尝试学习 JQuery - 我对 ajax 有一个小问题。我正在尝试使用从页面的 XML 响应返回的值填充 javascript 数组。
这是我的主页(ajax.html):

<html>
<head>
<script type="text/javascript" src="jquery/jquery.js"></script>
<script type="text/javascript" src="jquery/fiber.js"></script>
</head>
<body>
<p>Ajax</p>
<script>
var ringType = new Array();

</script>
</body>
</html>

fiber.js 是这样的:

//process things for fiber map
jQuery(document).ready(function() {
// do stuff when DOM is ready

//populate and display ringType
$.ajax({
  type: "GET",
  url: "ajaxHelper.pl",
  data: {
      getRingTypes: "1",
      },
  dataType: "xml",
  success: function(xml) {
      //if the query was successfull,
      alert("Got an xml object:"+$(xml));
      $(xml).find("ringType").each( function(){
          alert("Received reply "+$(this).text());
          var type = $(this).html(); //save the value
          //append to ringType array
          ringType.push(type);
      });
  },
  error:function (xhr, ajaxOptions, thrownError){
      alert(xhr.status);
      alert(thrownError);
  }
 });
 for(var i=0; i<ringType.length; i++){
    document.write("<br>"+ringType[i]);
 }

});

ajaxHelper.pl 生成这个 XML(在 \? 中没有反斜杠)(作为内容类型文本/xml):

<?xml version="1.0" encoding="ISO-8859-1"?>
    <\?xml version="1.0" encoding="ISO-8859-1"\?>
    <ringType>IA</ringType>
    <ringType>IL</ringType>
    <ringType>IN</ringType>
    <ringType>IR</ringType>
    <ringType>RT</ringType>

问题是,每次加载ajax.html,ajax查询都是成功的,但是却执行了error函数! xhr.status = 200(表示查询正常)并且 throwedException 未定义。

【问题讨论】:

  • 抱歉,xml 没有正确粘贴。又来了(有一些空格): IAILINIRRT
  • 尝试将 放在输出 XML 文档的顶部(如果还没有的话)
  • 如果您在浏览器 (mywebapp/ajaxHelper.pl) 中打开 ajaxHelper.pl 文件,浏览器是否会将来自该文件的响应识别为 XML?

标签: jquery ajax xml


【解决方案1】:

通过http://groups.google.com/group/jquery-en/browse_thread/thread/23679594ebe128a9

服务器可以返回一个带有 200 状态码的 XML 文档。但如果浏览器无法解析文档,则会发生 parseerror 并调用 jQuery 的错误处理程序。

确保您返回的是有效的 xml :)

【讨论】:

  • 有这个问题,但是 JSON 结果。修复是相同的,但有效:返回有效的 JSON 并且浏览器很高兴,在返回时调用正确的事件。
【解决方案2】:

所有浏览器都会出现这种情况吗?

1) 您可以使用 complete 代替 success 和 error 来处理状态。使用 if 来检查 XHR 返回状态并进行相应的分支。

http://docs.jquery.com/Ajax/jQuery.ajax#options

【讨论】:

  • 这种行为发生在所有浏览器上。我会尝试使用完成而不是成功,我会告诉你。
  • 我添加了完整的函数,当我检查它的状态时,我得到“parsererror”——这意味着我发送的 xml 无效。至少现在我知道在哪里继续挖掘。谢谢!
  • 显然 XML 必须定义 xsd 才有效。没有它们,我的代码将无法工作。现在(我已经创建了缺少的定义),一切都按预期工作。
【解决方案3】:

AJAX 是异步的。这意味着 $.ajax 函数将启动 ajaxHelper.pl 请求。同时它继续执行你的代码。在到达 $.ajax(...) 之后的下一行之前,请求没有机会返回

for(var i=0; i<ringType.length; i++){...

所以我想您遇到了一个未定义 ringType 的异常...?这可能就是触发错误功能的原因。

【讨论】:

  • 很公平,但它甚至不会触发启动成功功能的警报...
  • 抛出错误时,脚本将停止执行。我没有查看 jQuery 内部如何处理异常,只是尝试在回调中移动 for 循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-13
  • 2019-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多