隨筆-9  評論-168  文章-266  trackbacks-0


          1.JSONP(JSON with Padding-填充json數據也就是常用的json跨域方式):利用script標簽,通過特定的src地址的調用,來執行一個客戶端的js函數,在 服務器端生成相對的數據(json格式)并以參數的形式傳遞給這個客戶端的js函數并執行這個函數,前提是需要服務器端的數據輸出支持。       

          2.為什么使用JSONP:由于 JSON 只是一種含有簡單括號結構的純文本,因此許多通道都可以交換 JSON 消息。因為同源策略的限制,我們不能在與外部服務器進行通信的時候使用 XMLHttpRequest。而JSONP是一種可以繞過同源策略的方法,即通過使用 JSON 與 <script> 標記相結合的方法,從服務端直接返回可執行的JavaScript函數調用或者JavaScript對象。       

          3.誰在使用JSONP:dojo、JQuery、Youtube GData API 、Google Social Graph API 、Digg API 、GeoNames webservice、豆瓣API、Del.icio.us JSON API等。

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


          和 AJAX 一樣,JSONP 實際上也是早已存在,只是說法相對比較新穎(貌似也出來很久了)。自 1.2 版本起,JQuery加入了對 JSONP 的支持(http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback)。我們可以很容易的利用 $.getJSON() 方法(或者其它基于 $.ajax() 的方法),來跨域加載 JSON 數據。我參考官網,寫了個JQ測試的例子:

          a.html

          <html>
          <head>
            <script src=">
          </head>
          <body>
          <script type="text/javascript">
          function do_jsonp() {
              $.getJSON("
              function(data) {
                  $('#result').val('My name is: ' + data.nick);
              });
          }
          </script>
          <a href="javascript :do_jsonp();">Click me</a><br />
          <textarea id="result" cols="50" rows="3"></textarea>
          </body>
          </html>

          profile2.php

          <?php
          $callback = isset($_GET['callback']) ? $_GET['callback'] : '';
          $json = '';

          //php數組
          $arr = array(
               'name' => 'lava',
               'nick' => '比目魚',
               'contact' => array(
                'MSN' => 'lavaguo#msn.com',
                   'email' => 'guo.feng#zol.com.cn',
                   'website' => 'http://www.zol.com.cn',
               )
           );

          $arr = gb2312ToUtf8($arr);//中文需要轉UTF-8
          $json = json_encode($arr);//轉成json數組
          if (!empty($callback)) {
              $json = $callback . '(' . $json . ')';//注意這里的格式,調試時這里費了點時間
          }
          echo $json;

          function gb2312ToUtf8(&$input)
          {
              if (!is_array($input)) {
                  $input = iconv('GB2312', 'UTF-8', $input);
              } else {
                  foreach ($input as $k=>$v) {
                      gb2312ToUtf8(&$input["$k"]);
                  }
              }
              return $input;
          }

          ?>

          你可能注意到上面的例子中,url 被寫成了http://active.zol.com.cn/guofeng/profile2.php?callback=?,需要說明的是,這個問號會被 jQuery 自動替換為回調函數的函數名(如果是一個匿名函數,JQuery 會自動生成一個帶時間戳的函數名)。

          總結下JSONP原理:

          首先在客戶端注冊一個callback, 然后把callback的名字傳給服務器。

          此時,服務器先生成 json 數據。 

          然后以 javascript 語法的方式,生成一個function , function 名字就是傳遞上來的參數 jsonp.

          最后將 json 數據直接以入參的方式,放置到 function 中,這樣就生成了一段 js 語法的文檔,返回給客戶端。

          客戶端瀏覽器,解析script標簽,并執行返回的 javascript 文檔,此時數據作為參數,傳入到了客戶端預先定義好的 callback 函數里.(動態執行回調函數)

                      轉自:http://blog.zol.com.cn/859/article_858048.html

          posted on 2009-11-25 15:36 紫蝶∏飛揚↗ 閱讀(1226) 評論(0)  編輯  收藏 所屬分類: JQuery
          主站蜘蛛池模板: 洱源县| 江孜县| 济阳县| 汉沽区| 库伦旗| 得荣县| 玉山县| 崇义县| 若羌县| 化隆| 右玉县| 枞阳县| 永吉县| 新巴尔虎左旗| 雷山县| 大邑县| 毕节市| 镇康县| 田东县| 徐闻县| 焦作市| 铁岭县| 石楼县| 石阡县| 上蔡县| 新巴尔虎右旗| 于都县| 西乡县| 莆田市| 沽源县| 辉县市| 观塘区| 洞头县| 德保县| 安新县| 五河县| 蓝山县| 勐海县| 永胜县| 叶城县| 特克斯县|