同源策略的限制,使得ajax没法发出跨域请求。在许多状况下,咱们须要让ajax支持跨域。如下是其中一种解决方案(JSONP)。JSONP解决了跨域数据访问的问题。javascript
在html中,具备src属性的标签支持跨域,例如<script>、<img>。php
其中,<script>特别适合解决ajax跨域问题。首先当咱们经过src引入js文件时,便会对其中的js代码进行执行。咱们知道json是文本,js也是文本,那咱们就把json假装成js。也就是将请求地址放入到<script>标签的src中,那怎么样将json假装成js,且可以在浏览器获取json数据呢?css
答案就是经过调用方法,将json假装成调用方法的语句,其中真正的json数据做为该方法的参数,当经过script标签引入这些文本时,就至关于执行了这个方法。而在前端,咱们只须要编写对应的方法,而从服务器发过来的script脚本将会执行该方法而且传入真正的json数据。这样,就能够轻松实现跨域访问了。如下为大概流程图(丑):html
前端代码:前端
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jsonp</title> </head> <body> <script> ajax("http://localhost/province/json.php"); function ajax(url) { var script = document.createElement("script"); script.src = url + "?jsonp=callback"; document.getElementsByTagName("head")[0].append(script); }
// 编写回调函数 function callback(data) { alert(data.msg); } </script> </body> </html>
后端代码:java
<?php header("Content-Type", "application/json"); $fun = $_REQUEST["jsonp"]; // 获取调用的方法名 echo "$fun({'msg': 'jsonp'});";
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jsonp</title> </head> <body> <script src="http://cdn.bootcss.com/jquery/2.2.2/jquery.js"></script> <script> $.ajax({ url: "http://localhost/province/json.php", type: "get", data: {}, dataType: "jsonp", jsonp: "jsonp", success: function (data) { alert(data.msg); }, error: function () {//...} }); </script> </body> </html>
使用jquery提供的$.ajax能够快速实现跨域请求。首先设置dataType为"jsonp",表示使用jsonp。参数jsonp是传递将被调用函数名,服务器经过使用该属性的值来得到函数名。使用jquery后也不须要本身写调用函数了,它将由jquery自动生成,正在的json数据将经过success属性回调自定义函数进行传递。jquery