jsonp跨域
作者:寸志
链接:https://www.zhihu.com/question/28890257/answer/269738446
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这是我面试的常问问题之一。顺序如下:
1.知道 jsonp 么?基础知识
答:知道,可以实现跨域请求;
答不知道:换别的话题。
2.为什么 ajax 不可以,但是 jsonp 可以实现跨域请求呢?抠技术细节
答:因为 jsonp 是通过插入一个 script 标签,利用 script 可以跨域请求来实现的。换问题3;
答:面试官傻逼,ajax 现在也可以使用 cors 来做跨域请求;换问题 2.5。
答不知道:换问题 2.5。
2.5jsonp 实现原理?抠技术细节
答:通过创建一个 script 标签,将 src 设置为目标请求,插入到 dom 中,服务器接受该请求并返回数据,数据通常被包裹在回调钩子中;
回答不知道:我自己解释 jsonp 的实现。
3.可以用 jsonp 发送 post 请求么?融汇贯通
答:显然不行,看过支持 post 请求的 script 么?
答不知道:反问,看过支持 post 请求的 script 么?
4.参考 jsonp,还有那些发送跨域请求的途径?学习能力和潜力
答:img link iframe 等元素都可以发送跨域请求呀!
答不知道:反问img link iframe 等元素是不是也可以?
5.img link iframe script 来发送跨域请求有什么优缺点?要不你面我吧
……
其实吧,jsonp 名字听上去挺高大上,实际啊就是个矮穷矬。
下附代码:
jsonp
类型: String
在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。在jQuery 1.5,,设置jsonp选项为false,阻止了jQuery从加入"?callback"字符串的URL或试图使用"=?"转换。在这种情况下,你也应该明确设置jsonpCallback设置。例如, { jsonp: false, jsonpCallback: "callbackName" };
jsonpCallback
类型: String, Function
为jsonp请求指定一个回调函数名。这个值将用来取代jQuery自动生成的随机函数名。这主要用来让jQuery生成一个独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。你也可以在想让浏览器缓存GET请求的时候,指定这个回调函数名。从jQuery 1.5开始,你也可以使用一个函数作为该参数设置,在这种情况下,该函数的返回值就是jsonpCallback的结果。