jsonp確實和ajax沒有半毛錢關係,只算是一種機制跨域數據獲取方案或者協議。
只是說不少庫(好比jquery)裏面對jsonp和ajax作了同樣的封裝,看起來就好像jsonp是ajax的一部分同樣,這好像會形成誤解。php
ajax是使用js內置的對象進行網絡請求獲取數據前端
jsonp是使用script當中的src來獲取數據jquery
一個域名訪問另一個域名ajax
一、如下是形成跨域的一些狀況,只有目錄路徑不一樣纔是同源地址json
一個域名地址須要訪問另一個域名地址的數據segmentfault
-->說白了是爲了數據的安全跨域
出於安全性考慮,瀏覽器不容許ajax跨域獲取數據瀏覽器
瀏覽器爲了保證數據的安全,不容許直接請求使用別的域名數據。瀏覽器作了一個攔截。其實數據已經響應到了瀏覽器。瀏覽器沒有把它給咱們,不會隨意注入你的瀏覽器。例如黑客會經過重定向把一些你不想打開的網頁在你的瀏覽器中打開安全
-->瀏覽器服務器
需求:當用戶當請求一個地址要拿到裏面的數據展現在本身的域名當中
現實:拿不到數據顯示在本身的域名當中
緣由:當你訪問地址的時候,實際上數據已經從別的域名拿過來了(能夠從network上的接收包查看),可是瀏覽器爲了保障不被信用的數據注入本地,進行了攔截。
一、在瀏覽器安裝插件(本身百度)
二、經過src實現跨域方案
講第二種方法以前先了解一下基本概念:
使用src內容請求是不會存在跨域問題,在服務器端,返回js語句是能夠直接運行。
服務器或者說後臺(php)不存在跨域問題,當遇到跨域問題時經過PHP文件(自身文件)進行訪問。
因此經過第二種方式解決跨域,必須先後臺的合做才能私行(前臺傳callback參數,後臺服務器接收callback並返回數據)。步驟:
0.在前端定義一個function.
function fn(res) {
alert(res);
}
1.經過<script src=> 向服務器發送一個請求。 在發送請求過程中。把function的名稱作爲參數傳給服務器。
<script src="get.php?callback=fn"></script>
2.服務器接收callback值。
$fn = $_GET['callback'];
3.在返回時,在接收參數這後面拼接一個括號。
若是想要傳遞數據,就把數據放到括號當中。
echo $fn.'("xmg123")';
4.就會執行前端定義的function
fn("hello");
jsonp不是使用xhr對象發送請求,而是建立一個script標籤,標籤的src屬性設置成要請求的URL。當標籤插入dom時瀏覽器就會自動請求這個URL,並把結果當作js代碼執行。這樣作的優勢是跨域,缺點是隻能使用get,並且不能設置header。由於請求徹底不受js控制
jsonp的限制是來源於src的限制,src是不可能作到post請求的
有一篇討論帖能夠解答 https://segmentfault.com/q/1010000004884037