jsonp 解决同源机制
跨域问题
可以跨域的ajax
原理:
利用script标签src可以自带跨域。 通过创建一个script标签,并立即删除达到发送请求的效果。
因为script标签发送的请求接收的内容会到script标签内部如:
返回值为func 运行结果为:<script>func</script>
返回值为func() 运行结果为:<script>func()</script>
都会报错。因为func 会被读取为变量。 怎么样解决呢?我们可以定义一个函数的函数名为func 并且 和后端沟通他的返回值为func() 这样就可以执行func()函数了
伪代码
$('#btn').click(function () {
定义一个func函数
创建script 标签
设置script标签的src为指定的src
将script标签当在body即可
删除script标签
返回值沟通为func() 即执行函数
}
ajax封装的jsonp的方法
$.ajax({
url:'http://192.168.40.138:8000/index/',
type:'get',
dataType:'jsonp',
jsonp:'callbacks', #传函数名的变量,后端request.GET.get('callbacks') 即可接收到函数名
jsonpcallback:'func' #自己定义的函数名,可不写。ajax会随机生成
success:function (data) {
alert(data) #如定义函数名则没有回调函数,为自定义。反之则需要写
}
原理即为伪代码。 这里函数名 为随机生成
后端view代码
class index(View):
def get(self,request):
ret=request.GET.get('callbacks') #获取
return HttpResponse("%s('111')"%ret)