我正在查看www.healthgrades.com上的自动完成小部件,并检查了网络响应。
我认为数据是JSON,但它似乎已经通过某种编码/过滤器运行并转义,然后在jQuery标签中返回(可能是缓存破坏程序?)。
一小部分数据看起来就像你在下面看到的那样。
jQuery17207977216457948089_1379039838014([{"ItemIds":null,"LinkUrl":"/hospital-directory/texas-tx-central/scott-and-white-memorial-hospital-hgst712bc8b6450054","Text":"Scott and White Memorial Hospital","PlainText":null,"Type":"tophospital","TrackingName":null,"StateAbbreviation":null,"Data":null},{"ItemIds":null,"LinkUrl":"/hospital-directory/texas-tx-austin/st-davids-medical-center-hgst613bc8b6450431","Text":"St. David\u0027s Medical Center","PlainText":null,"Type":"tophospital","TrackingName":null,"StateAbbreviation":null,"Data":null},{"ItemIds":null,"LinkUrl":"/hospital-directory/texas-tx-southern/st-davids-georgetown-hospital-hgst182bc8b6450191","Text":"St. David\u0027s Georgetown Hospital","PlainText":null,"Type":"tophospital","TrackingName":null,"StateAbbreviation":null,"Data":null},{"ItemIds":null,"LinkUrl":"/hospital-directory/texas-tx-austin/heart-hospital-of-austin-hgstbb7ecdaa450824","Text":"Heart Hospital of Austin","PlainText":null,"Type":"tophospital","TrackingName":null,"StateAbbreviation":null,"Data":null},{"ItemIds":null,"LinkUrl":"/hospital-directory/texas-tx-austin/st-davids-north-austin-medical-center-hgst234bc8b6450809","Text":"St. David\u0027s North Austin Medical Center","PlainText":null,"Type":"tophospital","TrackingName":null,"StateAbbreviation":null,"Data":null}]);
这样做有什么好处,如果我的假设是错误的,那么这里发生了什么?
答案 0 :(得分:2)
这是jsonp请求的响应格式,它是一种技术,用于克服对ajax请求的same origin policy限制,其中ajax请求到的域不同于页面所在的域浏览器阻止加载。
在这种特殊情况下它没有多大用处,因为页面和ajax资源都在同一个域中。
答案 1 :(得分:2)
这是jQuery的JSONP
支持的一个例子。
如果您不熟悉,JSONP是“JSON with Padding。” padding 是对以JSON为参数的全局函数的调用。
开头的名称jQuery17207977216457948089_1379039838014
是jQuery在请求开始时生成的全局函数。而且,它会使用?
placeholder in the query-string创建一个请求:
jsonp
类型将查询字符串参数callback=?
附加到URL。服务器应该使用回调名称添加JSON数据以形成有效的JSONP响应。我们可以使用callback
的jsonp选项指定$.ajax()
以外的参数名称。
JSONP的主要优点是它支持跨源请求。它通过创建<script>
而非XMLHttpRequest
(类似于使用$.getScript()
)来实现此目的,因为它们不受SOP的限制。但是,它们仅限于GET
个请求;所以这是一个权衡。
而且,这是在引入CORS之前可用的跨源的选项。
顺便说一下:JSONP在技术上被JSON视为JavaScript,利用JSON的语法来自JavaScript。