jsonp详解

2018-10-07  本文已影响0人  西瓜古古丫

title: jsonp详解
tags:
categories:


ajax不允许跨域获取数据
说明,假定后端语言是 PHP

script标签

jsonp的原理:script标签具有跨域性,可以利用Script标签的src属性发送跨域请求,获取相应数据

<script src="域名/域名下的php文件名?callbackName=fnName"></script>
<script>
    // 回调函数
    function fnName(data){
        console.log(data);
    }
</script>

后端返回的是js代码,是函数调用

<?php $fnName = $_GET['callbackName'] 
echo $fnName.'(hello world)';
?>

jQuery-jsonp

type必须是get

$.ajax({
    url: "域名/域名下的php文件名",
    dataType: "jsonp",
    jsonp: "callbackName",  // 约定等号左边的key,服务器根据该名称获取回调函数名称
    jsonpCallback: "fnName", // 约定等号右边的value,标识回调函数名称
    success: function(){
        // todo
    },
    error: function(){
        // todo
    }
})

模仿封装jQuery-ajax

function myAjax(options) {
  // 默认值
  var defaults = {
      jsonp: "callback",
      jsopCallback: "jQuery"+ ('v3.1.1'+ Math.random()).replace(/\D/g,'')+"_"+new Date().getTime();
  };
  // window是全局对象,[]中的值可以是变量,也可以是字符串
  window[defaults.jsonpCallback] = function(data){
      defaults.success(data);
  };
  // 处理业务参数,把data数据转换为查询字符串
  var param = '';
  if(defaults.data){
      for(var key in defaults.data){
          param += key+"="+defaults.data[key]+"&";
      }
  }
  
  // 使用设置参数覆盖默认配置
  for(var key in options){
      defaults[key] = options[key];
  };
  // 处理跨域请求
  var script = document.createElement("script");
  script.src = defaults.url+"?"+ param + defaults.jsonp+"="+defaults.jsonpCallback;
  var head = document.querySelector("head");
  head.appendChild(script);
}
上一篇下一篇

猜你喜欢

热点阅读