jQuery封装jsonp

对于经常用jQuery的开发者来说,能注意到jQuery封装的$.ajax中有一个dataType属性,如果将该属性设置成dataType:“jsonp”,就能实现JSONP跨域了。
如下是封装的方法:
html页面代码

<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <title></title>
  <script src="jquery-2.1.1.min.js" type="text/javascript" charset="utf-8"></script>
  <script src="ajax3.js" type="text/javascript" charset="utf-8"></script>
  <script type="text/javascript">
   $(function(){
    
    $('#btn').click(function(){
     ajax({
      type:'get',
      url:'http://tom.com/jsonp.php',
      dataType:'jsonp',
      jsonp:'cb',
      jsonpCallback:"haha",
      data:{username:'张无忌',password:'1234'},
      success:function(data){
       console.log(data);
      }
     });
    })
    
   })
  </script>
 </head>
 <body>
  <input type="button" name="btn" id="btn" value="点击测试" />
 </body>
</html>

js代码:

function ajax(obj){
 var defaults={
  type:'get',
  async:true,
  url:'#',
  dataType:'text',
  jsonp:"callback",
  data:{},
  success:function(data){console.log(data);}
 }; 
 for(var k in obj){
  defaults[k]=obj[k];
 }
 if(defaults.dataType=='jsonp'){
  ajax3Jsonp(defaults);
 }else{
  ajax3Json(defaults);
 }
}
function ajax3Jsonp(defaults){
 // var cbName='jQuery12334342342_35435435435';
 //expando: "jQuery" + (m + Math.random()).replace(/\D/g, ""),
 var cbName='jQuery'+('2.1.1'+Math.random()).replace(/\D/g,"")+'_'+(new Date().getTime());
 if(defaults.jsonpCallback){
  cbName=defaults.jsonpCallback;
 }
 // 这里就是回调函数,调用方式, 服务器响应内容来调用 
 // 向window对象中添加一个方法, 方法的名称 是cbName
 window[cbName]=function(data){
  //console.log('=============');
  defaults.success(data);
 }
 var param='';
 for(var attr in defaults.data){
  param+=attr+'='+defaults.data[attr]+'&';
 }
 if(param){
  param=param.substring(0,param.length-1);
  param='&'+param;
 }
 // 动态 的创建script标签
 var script=document.createElement('script');
 // "http://tom.com/data.php?callback=jQuery211039499647145023986_1564708609916^&_=1564708609917"
 script.src=defaults.url+'?'+defaults.jsonp+'='+cbName+param;
 var head=document.getElementsByTagName('head')[0];
 head.appendChild(script);
}
function ajax3Json(defaults){
 // 创建xhr对象
 var xhr=null;
 if(window.XMLHttpRequest){
  xhr=new XMLHttpRequest();
 }else{
  xhr=new ActiveXObject("Microsoft");
 }
 var param='';
 // 重点: 
 for(var attr in  defaults.data){
  param+=attr+'='+defaults.data[attr]+'&';// username=张三&password=123&
 }
 if(param){
  param=param.substring(0,param.length-1);
  // alert(param);
 }
 // 处理get请求参数  并且 处理中文乱码的问题
 if(defaults.type=='get'){
  defaults.url+='?'+encodeURI(param);
 }
 // 准备发送  设置 发送的参数
 xhr.open(defaults.type,defaults.url,defaults.async);
 var data=null;
 if(defaults.type=='post'){
  data=param;
  xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
 }
 // 执行发送请求
 xhr.send(data);
 // 回调函数
 xhr.onreadystatechange=function(){
  if(xhr.readyState==4){
   if(xhr.status==200){
    var data=xhr.responseText;
    if(defaults.dataType=='json'){
     data=JSON.parse(data); // 转换为 字符串json对象
    }
    defaults.success(data);
   }
  }
 }
}

php代码:

<?php
$arr=array("name"=>"sd","pwd"=>"135");
 $cb=$_GET['cb'];
 echo $cb.'('.json_encode($arr).')';
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值