我正在从托管在同一个CRM实例上的网络资源上向CRM发出FetchXML请求
此代码适用于IE,但不适用于Chrome ...为什么?
$.ajax({
type: "POST",
dataType: 'xml',
contentType: "text/xml; charset=utf-8",
processData: false,
url: path,
data: fetchRequest,
beforeSend: function(xhr) {
xhr.setRequestHeader(
"SOAPAction",
"http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute"
); //without the SOAPAction header, CRM will return a 500 error
}
}).done(
function(data){
$(data).find("a\\:Entity").each(function () {
// loop entered in IE but not in chrome
}
}
);
修改
问题不在于ajax调用,问题在于.find()没有从返回的xml中获取节点。
所以要明确我从每个浏览器的请求中得到的内容看起来都是相同的xml但是这里的find方法
$(data).find('a\\Entity')
在chrome中没有返回任何项目......它在IE中完美运行。
答案 0 :(得分:3)
好的,我想我找到了问题
http://bugs.jquery.com/ticket/155
由于不同浏览器中selectSingleNode的不同实现,jQuery find()存在问题。这个错误说它已修复,但我认为不是。
修改强>
我发现让选择器看起来像这样似乎可以工作
$(xml).find("a\\:Entity, Entity")
这有点像黑客,但它解决了我的特殊问题
答案 1 :(得分:2)
您很可能需要连接到.fail
以查看它是否返回错误。您应该能够将它附加到.done
函数的末尾,例如
$.ajax({
type: "POST",
dataType: 'xml',
contentType: "text/xml; charset=utf-8",
processData: false,
url: path,
data: fetchRequest,
beforeSend: function(xhr) {
xhr.setRequestHeader(
"SOAPAction",
"http://schemas.microsoft.com/xrm/2011/Contracts/Services/IOrganizationService/Execute"
); //without the SOAPAction header, CRM will return a 500 error
}
}).done(
function(data){
$(data).find("a\\:Entity").each(function () {
// loop entered in IE but not in chrome
}
}
).fail(function(p1, p2, p3){
...
});
注意 - 如果失败的工作方式与旧的“错误”功能相同,则应该有多个参数可以允许失败功能接受,第二个和第三个为您提供有关错误的更多详细信息。
除了捕获失败之外,我还记得chrome和异步模式的问题,因此您也可以尝试在dataType标志之后将async标志设置为false。像这样:
$.ajax({
type: "POST",
dataType: 'xml',
async: false,
.... etc
我读过关于chrome的唯一其他问题是jsonp的问题,但是你在这里使用xml,这显然不是问题。