关于jsonp跨域

  • 一.来源:因为Ajax直接请求普通文件存在跨域无权限访问的问题,

  • 二.jsonp定义:JSONP(JSON with Padding)是数据格式JSON的一种“使用模式”,可以让网页从别的网域要数据。另一个解决这个问题的新方法是跨来源资源共享

  • 三.同源策略:它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。当一个浏览器的两个tab页中分别打开来 百度和谷歌的页面当一个百度浏览器执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和百度同源的脚本才会被执行。

  • 四.jsonp原理:
    用我自己理解的就是:
    1.script标签可以引入其他网站的文件
    2.文件的后缀对计算机是没有意义的,只是给人们识别功能用的

  • 五.写法实现思路:
    1.动态创建script标签,写入src属性
    2.定义一个全局的回调函数(callback)

    注意:面对非标准格式的跨域数据,需要自己重新写jsonp

  • 六.下面Demo实现从百度或者360搜索跨域拿数据

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Demo</title>
<script src="jsonp.js"></script>
<script>
window.onload = function(){
  var oText = document.getElementById("txt1");
  //百度
  var url = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su";
  //360,需要时去掉注释
  //var url = "https://sug.so.360.cn/suggest";

  oText.onkeyup = function(){
      jsonp({
        url:url,
        data:{
           wd:this.value,
           word:this.value,
        },
           //callback--->360
           //cb--->百度
        //cbName:"callback",
        cbName:"cb",
        success:function (json){
           var oUl = document.getElementById("ul1");
           oUl.innerHTML = "";
           for(var i = 0; i < json.s.length; i++){
              var oLi = document.createElement("li");
              oLi.innerHTML = json.s[i];
              oUl.appendChild(oLi);
           }
        },
        error:function (){
           alert("超时");   
        },
        timeout:1000
     });    
  };
};
</script>
</head>
<body>
<input id="txt1" type="text" value=""/>
<ul id="ul1"></ul>
</body>
</html>

/**
* Created by chaney on 2016/12/28.
*/
function jsonp(options) {
  options = options || {};
  if (!options.url) return;
  options.data = options.data || {};
  options.cbName = options.cbName || "cb";
  options.timeout = options.timeout || 0;

  var fnName = ("jsonp_" + Math.random()).replace(".", "");

  var arr = [];
  options.data[options.cbName] = fnName;
  for (var name in options.data) {
     arr.push(name + "=" + encodeURIComponent(options.data[name]));
  }
  var str = arr.join("&");

  //2 全局函数
  window[fnName] = function (json) {

     options.success && options.success(json);
     window[fnName] = null;
     oHead.removeChild(oS);
     clearTimeout(timer);
  };

  //1 创建script
  var oS = document.createElement("script");
  oS.src = options.url + "?" + str;
  var oHead = document.getElementsByTagName("head")[0];
  oHead.appendChild(oS);

  if (options.timeout) {
     var timer = setTimeout(function () {
        options.error && options.error();
        window[fnName] = function () { };
        oHead.removeChild(oS);
     }, options.timeout);
  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值