<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      js便簽筆記(13)——jsonp其實很簡單【ajax跨域請求】

      前兩天被問到ajax跨域如何解決,還真被問住了,光知道有個什么jsonp,迷迷糊糊的沒有說上來。抱著有問題必須解決的態度,我看了許多資料,原來如此。。。

      為何一直知道jsonp,但一直迷迷糊糊的不明白呢?——網上那些介紹資料都寫的太復雜了!

      我是能多簡單就多簡單,爭取讓你十分鐘看完!

      1. 同源策略

      ajax之所以需要“跨域”,罪魁禍首就是瀏覽器的同源策略。即,一個頁面的ajax只能獲取這個頁面相同源或者相同域的數據。

      如何叫“同源”或者“同域”呢?——協議、域名、端口號都必須相同。例如:

      http://google.com  和  https://google.com 不同,因為協議不同;

      http://localhost:8080  和  http://localhost:1000 不同,因為端口不同;

      http://localhost:8080  和  https://google.com 不同,協議、域名、端口號都不同,根本不是一家的。

      根據同源策略,我自己做的一個網頁 http://localhost:8080/test.html 就無法通過ajax直接獲取 http://google.com 的數據。

      例如,我用ajax去訪問一個不同域的頁面,錯誤結果是這樣的:

       

      大家想想,這樣其實也有道理。如果沒有同源策略,你我都可以隨便通過ajax直接獲取其他網站的信息,這還不亂套了。。。我自己做一個搜索界面,搜索時直接用ajax從百度獲取數據,那不成了小偷了。。。

      但是跨域訪問是少不了的,mail.163.com 的網頁可能需要從 news.163.com 域下獲取新聞信息,那怎么辦?——開始咱們的跨域之旅(當然用iframe也可以實現)

      2. 從“盜鏈”說起

      互聯網的許多網站之間圖片相互盜鏈,A網站網頁的img.src直接鏈接到B網站的圖片地址,這是常有的事兒。說到“盜鏈”,大家第一想到的可能是如何去防止盜鏈,今兒咱不管那個。

      你再想想“盜鏈”和“同源策略”這兩個詞之間有什么關系?——對,矛盾!既然都“同源策略”了,怎么還能“盜鏈”呢?

      世間萬物都有矛盾,有矛盾了照樣可以和諧共處,并不一定非要你死我活。

      重點:<img>的src(獲取圖片),<link>的href(獲取css),<script>的src(獲取javascript)這三個都不符合同源策略,它們可以跨域獲取數據。因此,你可以直接從一些cdn上獲取jQuery,并且你網站上的圖片也隨時可能被別人盜用,所有最好加上水印!

      而我們今天的主角——jsonp——就是因為<script>的src不符合同源策略而來的

      3. JSONP

      例如,域名 a.com 下有一個 a.com/test.html 網頁,域名 b.com 下有一個 b.com/data.html 網頁和 b.com/alert.js 文件。

      引導第一步:簡單引用js

      編寫 b.com/alert.js 如下:

      alert(123);

      對 a.com/test.html 編寫如下代碼:

      <script type='text/javascript' src='http://b.com/alert.js'/>

      運行 a.com/test.html,結果很明顯,就是彈出 【123】 。

       

      引導第二步:引用js返回數據

      將 b.com/alert.js 修改為:

      myFn(100);

      將 a.com/test.html 修改為:

      <script>
          function myFn ( data ) {
              alert( data + 'px' );
          }
      </script>
      <script type='text/javascript' src='http://b.com/alert.js'/>

      運行 a.com/test.html,結果是彈出【 100px 】,這個應該也沒有什么疑問。

       

      引導第三步:已經跨域成功!

      第二步中,如果data——即100——是我要跨域在b.com下獲取的一個數據,那么咱們這不就是已經實現跨域請求了嗎!??!

      把這個過程再清晰的捋一遍:

      • <script>的src不符合同源策略;
      • 我通過給<script>的src賦值一個跨域的文件的網址(可能不是一個js文件),這個文件返回的字符串,瀏覽器會當作javascript來解析;
      • 而這段javascript中,就可以包含著我所需要的跨域服務器端的數據;
      • 最后,我在本頁面定義一個myFn函數用來展示數據,而這段javascript中就可以直接調用myFn函數;

       

      引導第四步:引用html格式

      <script>的src不一定僅僅指向javascript文件,可以指向任何地址。例如:

      將 a.com/test.html 修改為:

      <script>
          function myFn ( data ) {
              alert( data + 'px' );
          }
      </script>
      <script type='text/javascript' src='http://b.com/data.html'/>

      將 b.com/data.html 編寫為:(注意,data.html中就寫以下一行代碼,多了不寫)

      myFn(100); 

      運行 a.com/test.html ,結果依然是【 100px 】

      其中,“100”就是我們要跨域請求的數據。

       

      引導第五步:動態數據

      如果要請求的數據是動態的,那就要在動態頁面中編寫。

      那么我們就讓 a.com/test.html 去調用一個動態的aspx頁面:

      <script>
          function myFn ( data ) {
              alert( data + 'px' );
          }
      </script>
      <script type='text/javascript' src='http://b.com/data.aspx?callback=myFn'/>

      大家注意,我們在 src 地址中增加了“?callback=myFn”,意思是把顯示數據的函數也動態傳過去了,而第二步、第四步都是靜態的寫在被調用的文件中的。

      至于callback參數后臺如何接收,如何使用,請接著看:

      在 b.com 下增加一個 b.com/data.aspx 頁面,后臺代碼如下:

          protected void Page_Load(object sender, EventArgs e)
          {
              if (this.IsPostBack == false)
              {
                  string callback = "";
                  if (Request["callback"] != null)
                  {
                      callback = Request["callback"];
      
                      //服務器端要返回的數據
                      string data = "1024";
      
                      Response.Write(callback + "(" + data + ")");
                  }
              }
          }

      代碼很簡單,獲取callback參數,然后組成一個函數的形式返回。如果“b.com/data.aspx?callback=myFn”調用的話,那么返回的就是" myFn(1024) "。

      返回的數據變成動態的了(“1024”),前端頁面用于顯示數據的函數也編程了動態的了(“callback=myFn”),但是歸根結底,形式還是一樣的。

       

      引導第六步:調用封裝

      a.com/test.html 中,僅僅有一個<script>靜靜的躺在那里,執行一次之后,就沒有作用了。

      而實際情況是,a.com/test.html 中,可能隨著用戶的操作發生若干次的調用。怎么辦?——動態增加唄。

      function addScriptTag(src) {
          var script = document.createElement("script");
          script.setAttribute("type", "text/javascript");
          script.src = src;
          document.body.appendChild(script);
      }
      
      function myFn (data) {
          alert(data + 'px');  
      }
      
      //需要調用時:
      //addScriptTag('b.com/data.aspx?callback=myFn');

       

      4. 總結

      以上層層描述的就是JSONP,你不必去記住它的定義,看明白了上述文字,就全能理解。

      重點在于:同源策略 + <script>的src不屬于同源策略 + 通過<script>的src指向的文件返回服務器端數據。

      ok,就這些!

      -------------------------------------------------------------------------------------------------------------

      歡迎關注我的微博。

      也歡迎關注我的其他教程:

      從設計到模式深入理解javascript原型和閉包系列微軟petshop4.0源碼解讀視頻》《json2.js源碼解讀視頻

      posted @ 2014-10-30 07:06  王福朋  閱讀(13486)  評論(16)    收藏  舉報
      主站蜘蛛池模板: 国产精品无码免费播放| 国产仑乱无码内谢| 99国产精品99久久久久久| 人妻少妇久久中文字幕| 国产成人久久精品二三区| 起碰免费公开97在线视频| 无码日韩精品一区二区三区免费| 综合区一区二区三区狠狠| 国产小受被做到哭咬床单GV| 久久www免费人成一看片| 亚洲中文字幕在线二页| 人人人澡人人肉久久精品| 阳原县| 久久亚洲中文无码咪咪爱| 在国产线视频A在线视频| 国产中文字幕一区二区| 色综合久久综合中文综合网| 欧美国产综合欧美视频| 日本久久99成人网站| 四虎在线成人免费观看| 强伦姧人妻免费无码电影| 国产二区三区不卡免费| 男人的天堂va在线无码| 久久天天躁夜夜躁狠狠820175| 好爽毛片一区二区三区四| 久久久久久久久久久久中文字幕 | 亚洲国产大胸一区二区三区| 精品国产成人三级在线观看| 在线高清免费不卡全码| 国产精品中出一区二区三区| 亚洲综合精品中文字幕| 97人人添人人澡人人澡人人澡| 国产中文字幕在线精品| 日本不卡码一区二区三区| caoporn免费视频公开| 国产亚洲一本大道中文在线| 中文午夜乱理片无码| 午夜片神马影院福利| 国产精品无码素人福利不卡| 野花社区www视频日本| 91中文字幕一区在线|