更新1:我还没有弄清楚发生了什么,但这绝对是我的项目的问题。创建一个简单的测试页面后,我能够验证 getJSON 实际上确实返回了一个 XHR 对象,就像它应该的那样。
更新2:哇,这很奇怪。经过更多测试后,我发现如果我指定“callback=?” URL 字符串中的参数 XHR 对象未正确返回。但是,如果我没有指定“callback=?”参数,XHR对象被正确返回。问题是,我正在调用 JSONP 服务,因此“callback=?”参数为必填项。
关于为什么会出现这种情况有什么想法吗?
更新 3:以下是一些独立的代码示例来说明该问题。在第一个示例中,console.log(request) 未定义。当我在第二个代码示例中硬编码回调参数时,console.log(request) 是 XHR 对象。
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
</head>
<body>
<script>
$(document).ready(function() {
var request = $.getJSON('http://localhost?callback=?', function(data) {
});
console.log(request);
});
</script>
</body>
</html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
</head>
<body>
<script>
$(document).ready(function() {
var request = $.getJSON('http://localhost?callback=callback', function(data) {
});
console.log(request);
});
</script>
</body>
</html>
更新 4: 根据下面 regilero 的评论,我转而使用 $.ajax 方法并通过数据对象传递参数。以下是请求的完整代码:
var request = $.ajax({
data: {
f: 'json',
geometry: '{x:44.203642291681845,y:-95.79085806500001}',
geometryType: 'esriGeometryPoint',
imageDisplay: '727,500,96',
layers: 'all',
mapExtent: '-179.462733065,16.116769346042226,-51.669764315000016,71.57609342040729',
returnGeometry: false,
tolerance: 10
},
dataType: 'jsonp',
success: function(data) {
console.log(data);
},
url: 'http://server.arcgisonline.com/ArcGIS/rest/services/Specialty/Soil_Survey_Map/MapServer/identify'
});
console.log(request);
如果我在配置对象中指定“dataType: 'jsonp'”,则 console.log(request) 再次未定义。但是,如果我指定“dataType: 'json'”,console.log(request) 就是 XHR 对象。
此行为与我使用 $.getJSON 快捷方式遇到的情况一致。
<小时/>原始问题
根据 stackoverflow 问题/答案:Abort Ajax requests using jQuery以及本网站和其他网站上的许多其他问题/答案,jQuery Ajax 方法应该返回 XHR 对象。
但是,当我运行以下代码时,请求是“未定义”。
var request = $.getJSON(url, function(data) {
console.log(data);
});
console.log(request);
我错过了 jQuery 的更改吗?我使用的是 1.4.4。
最佳答案
jsonp
不使用 XMLHTTPRequest。它是同源策略的一种解决方法,适用于所有 XMLHTTPRequest;它的工作原理是插入 <script>
相反,将标签添加到 DOM 中,要求服务器返回一个封装在 JS 函数中的 JSON 对象,由 callback=?
表示。参数。
由于未使用 XMLHTTPRequest,因此不会返回该类型的对象。
关于jQuery Ajax 方法不返回 XHR 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4630467/