XML又出问题了。。。郁闷中
时间:2009-05-17
来源:互联网
我已经将Content-Type设置成text/xml了啊,奇怪。。。。
$.ajax({
url: xxx,
data: xxx,
cache: false,
dataType: "xml",
error: function(xml) {
alert('Error loading XML doc' + xml);
},
success: function(xml) {
xxxxx
}
})
作者: benlaohu 发布时间: 2009-05-17
最好有在线测试地址
作者: shawphy 发布时间: 2009-05-17
<row>
<ID>1</ID>
<userid>admin</userid>
<password>dddddd</password>
<privilege>0</privilege>
<managedid>all</managedid>
<memo/>
<status>0</status>
</row>
<row>
<ID>32</ID>
<userid>tester</userid>
<password>hello</password>
<privilege>0</privilege>
<managedid/>
<memo/>
<status>0</status>
</row>
</recordset>
我用http工具跟踪过,返回的头信息确实是text/xml。
具体现象:
我在页面有多行记录,每行记录后面我都加了链接,并且可以通过jquery绑定了click事件,通过这个事件,我去服务器请求一个xml下来。当我操作一条记录的时候,正常执行。但是如果紧接着电击另外一条的时候,就会出现这个xml错误了。服务段的代码我也看了,每次都会调用一个函数,这个函数的第一行就是header("content-type: text/xml")啊,奇怪的问题。
如果用$.get,第一次能够成功,第二次不能成功。如果用$.ajax(),那么第一次也不能成功。参数什么的,都应该是一致的阿,奇怪奇怪
作者: benlaohu 发布时间: 2009-05-17
<?xml version="1.0" encoding="utf-8" ?> 类似的东东
作者: seekarmor 发布时间: 2009-05-17
好像在最前面得有
<?xml version="1.0" encoding="utf-8" ?> 类似的东东
看提示应该就是这个原因
作者: keakon 发布时间: 2009-05-17
另外,刚才发现一个现象,通过http可以看到两次请求的request不太一样。
可以执行的如下:
GET xxxxxxxxxxx HTTP/1.1
Host: xxxxx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 GTB5 (.NET CLR 3.5.30729)
Accept: application/xml, text/xml, */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
X-Requested-With: XMLHttpRequest
Referer: xxxxxxxxxxxxxxxxxx
Cookie: PHPSESSID=9vjt9qtsgq2o5debfoo35vdp92
下一个请求,也就是不能执行的如下:
GETxxxxxxxxxxxx HTTP/1.1
Host: xxxxxx
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 GTB5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: xxxxxxxxxxxxxxxxxxxxx
Cookie: PHPSESSID=9vjt9qtsgq2o5debfoo35vdp92
很显然,第二次的少了一个X-Requested-With: XMLHttpRequest。这应该是jquery产生的吧?同样的代码,怎么第二次的会没有了这个呢??
还有就是第二次的那个accept也不一样了。
作者: benlaohu 发布时间: 2009-05-17
我搜了一下那句话,遇到的比较少,但还是有的。
可以肯定的是,出问题的肯定是由于第二次他不是当作text/xml来处理了
所以firefox认为那个xml需要 <?xml-stylesheet href="CSS URL" type="text/css"?> 来设置样式。
总之,呼唤更多代码……
作者: shawphy 发布时间: 2009-05-17
用php+smarty做的,里面有一些smarty的东西,不过应该不影响理解。
我的做法是这样子的:首先显示这个页面,如果用户点击了删除,那么在服务端,我会首先删除,然后再把剩余的行以xml的形式封装,回传。浏览器接收到xml后,使用javascript解析,然后再重新画出这个表格。
是不是因为这个表格是重新画的,所以才出现问题???我准备把重画这部分去掉,服务端接收到参数后,直接删除,然后不封装剩余的行,而是由客户端重新reload页面。这样没问题,我试过了。但是就不知道两种方式那个好一些。
多谢多谢。
===================================================================
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ss</title>
<link href="../Scripts/global_tpl.css" rel="stylesheet" type="text/css" />
<script src="../Scripts/jquery.js" type="text/javascript"></script>
</head>
<body>
<div id="header">
<ul>
<li><img src="../Images/my_logo.jpg" width="198" height="49" alt="logo" /></li>
</ul>
</div>
<div id="nav_button">
{--include file='operator/nav_button.tpl'--}
</div>
<div id="nav">
<ul>
<li>当前位置</li>
<li>-</li>
<li>系统管理员</li>
</ul>
</div>
<div id="leftnav" class="leftnav">
<ul>
<li>欢迎回来,{--$userid--}。</li>
</ul>
</div>
<div id="addobject" class="rightul">
<ul>
</ul>
</div>
<div id="content">
<table class="tbstyle" style="width: 100%">
<tr>
<td>用户名</td>
<td>等级</td>
<td>可管理对象</td>
<td>状态</td>
<td></td>
</tr>
{--section name=nr loop=$data--}
<tr>
<td>{--$data[nr].userid--}</td>
<td>{--if ($data[nr].privilege == 0)--}系统
{--elseif ($data[nr].privilege == 1)--}营商
{--elseif ($data[nr].privilege == 2)--}区
{--else--}n/a
{--/if--}
</td>
<td>{--$data[nr].managedid--}</td>
<td>{--if ($data[nr].status == 0)--}正常
{--elseif ($data[nr].status == 1)--}未启用
{--elseif ($data[nr].status == 2)--}禁用
{--/if--}
</td>
<td><a href="../include/responseFunc.php?action=8&tname=admin&recid={--$data[nr].ID--}">删除</a>
<a href="addadmin.php?userid={--$data[nr].userid--}&recid={--$data[nr].ID--}">修改</a>
</td>
</tr>
{--/section--}
</table>
<br />
<br />
<script type="text/javascript">
$("a[href*='response']").bind("click", function() {
href_string = $(this).attr("href");
para_string = href_string.substring(href_string.indexOf("?") + 1, href_string.length);
pagename = href_string.substring(0, href_string.indexOf("?"));
$.get(pagename,
para_string,
function(xml) {
// remove the table content
$("tr:gt(0)").remove();
// loop, show data
$(xml).find("row").each(function() {
var $row = $(this);
rowHTML = "<tr>\r";
rowHTML = rowHTML + "<td>" + $row.find("userid").text() + "</td>\r";
privilege = $row.find("privilege").text();
privilege_str = "";
if (privilege == "0") {
privilege_str = "系统";
} else if (privilege == "1") {
privilege_str = "营商";
} else if (privilege == "2") {
privilege_str = "区";
}
rowHTML = rowHTML + "<td>" + privilege_str + "</td>\r";
rowHTML = rowHTML + "<td>" + $row.find("managedid").text() + "</td>\r";
status1 = $row.find("status").text(); // var status conflict with IE?
status_str = "";
if (status1 == "0") {
status_str = "正常";
} else if (status1 == "1") {
status_str = "未启用";
} else if (status1 == "2") {
status_str = "禁用";
}
rowHTML = rowHTML + "<td>" + status_str + "</td>\r";
rowHTML = rowHTML +
'<td><a href="../include/responseFunc.php?action=8&tname=admin&recid=' + $row.find('ID').text() +
'">删除</a> \r' +
'<a href="addadmin.php?userid=' + $row.find("userid").text() + '&recid=' + $row.find('ID').text() +
'">修改</a>\r</td>';
rowHTML = rowHTML + "</tr>\r";
// append to HTML
$("table").append(rowHTML);
})
},
"xml");
return false;
})
</script>
<div id="footer">
<ul>
<li>©2009</li>
<li>公司</li>
</ul>
</div>
</div>
</body>
</html>
作者: benlaohu 发布时间: 2009-05-17
说是呼唤更多代码,需要的是精简的,有问题的代码……
我们又没有你那里的测试环境……
你这样一大堆代码上来,依然无法帮你做调试的啊……
简而言之,如果你能提供一个简化过的,能够重现问题的代码,我们才能帮你从代码角度调试。
否则永远就只能对着你的描述还有代码进行YY了。
如此能帮你解决问题的几率就小了很多。
如何简化代码?
1,做加法:
前台页面
<a href="http://sssss/response/sss.php">xxx</a>
$("a[href*='response']").bind("click", function() {
$.get($(this).attr("href"),function(xml) {
//code
},"xml");
});
这已经是最简单不过的代码了,毫无破绽。
如果这样问题就消失了,那就是前台页面的问题,逐步加上一些代码,直到发现问题位置。
最终得到最简化的出错代码。
同样,后台也是,首先输出一个简单的xml,没有问题,再逐步加上。直到问题重现。
2,做减法,逐步删除无关内容,直至问题消失。
============================================
很多情况下,这样子你很可能自己已经发现问题并解决了!
作者: shawphy 发布时间: 2009-05-17
http://www.webmasterworld.com/forum26/208.htm
没有样式并不影响XML解析,如果不是直接访问,Firefox不会用样式去显示XML文档啊
话说为什么不在服务器端直接返回html,没看出你用jQuery处理XML会获得什么好处
至于head,你用ajax函数关掉cache试试
作者: keakon 发布时间: 2009-05-17
已经找到问题所在,就是我通过JQuery添加进dom的内容($("#xxx").append(xxxx)),无法再次通过jquery提交,否则就会出现上述错误。正在找为什么会出现这个情况。
不过,我已经放弃在JQuery中解析xml了,直接通过浏览器的reload来做,代码又少又方便,哈哈。不过缺点就是不如jquery来的快,整个页面都要刷新。
再次感谢。
作者: benlaohu 发布时间: 2009-05-17
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28