JSONP 跨域共享信息 |
本文标签:JSONP,跨域 由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com 的服务器沟通,而 HTML 的 <script> 元素是一个例外 。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP 。用 JSONP 抓到的资料并不是 JSON,而是任意的 JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析 。 下面是我在一个项目中的应用: 描述:域名dev.uc.everychina.com 要获得域名 dev.members.everychina.com下的数据 dev.members.everychina.com的服务器端代码: 复制代码 代码如下: class JsController extends CController { public function actionIndex() { $callback = isset($_GET[callback]) ? $_GET[callback] : ; $result = array(); $userinfo = Intf_Client_Uc_User::instance()->getLoginUser(); $cid = Everychina_Member::instance()->getCid($userinfo[uid]); //公司展厅评分 $room_score = Ec_RoomScore::getInstance(); //获得展厅老的评分 $update_status = true; //重新评分 if(isset($_GET[action]) && $_GET[action]==update) { $score_res = $room_score->getScoreInfo($cid); $room_score->updateScoreResult($cid,$score_res); $update_status = true; } $result[status] = $update_status; $res = $room_score->getScoreResult($cid); $result[score] = $room_score->getScoreResultView($res[score]); if ($callback) { $js = json_encode($result); echo "$callback( ($js) );"; } } 域名 dev.uc.everychina.com 下,前端调用(html) 复制代码 代码如下: <a id="update_score" href="#" onclick="ajaxUpdateScore();return false;">update score</a> <div id="member_score"></div> javascript 复制代码 代码如下: function ajaxUpdateScore(){ if(document.getElementById("member_score_script")) { var score_script = document.getElementById("member_score_script"); document.body.removeChild(score_script); } var score_script = document.createElement("script"); score_script.id = "member_score_script"; score_script.src = http://dev.members.everychina.com/index.php?r=js/index&callback=show_score&t=+new Date().getTime(); document.body.appendChild(score_script); } function show_score(json) { if(json.status == true) { var html = <p>level:+json.score.level+</p>; html += <p>msg:+json.score.msg+</p>; html += <p>score:+json.score.score+</p>; $("#member_score").html(html); } } |