Web中jsonp跨域,百度搜索小demo

因为浏览器的同源策略,不同网站之间不能跨域访问,因此产生了跨域问题
补充:同源策略(Same-Origin Policy)。所谓同源是指,域名,协议,端口相同。不同源的客户端脚本(javascript、ActionScript)在没明确授权的情况下,不能读写对方的资源。
古人有云:上有政策,下有对策,产生了跨域问题,以下是解决跨域的几中方式

  1. Flash(不做讨论)

  2. 服务器代理中转
    跨域产生的原因是由于浏览器的同源策略,于是就有了服务器代理中转的方式来解决跨域问题。在这里插入图片描述
    A、C不在同一个服务器中,但网站A想要请求服务器C中的数据,由于同源策略,直接访问显然是不现实的,我们可以通过向本地的后台B发送请求,通过本地服务器B向服务器C请求数据,因为同源策略属于浏览器的限制,服务器端没有限制。B请求返回的数据再发送给网站A 如此便可以解决跨域访问的问题.

  3. Jsonp
    我在这里详细的解释下Jsonp解决跨域问题。
    首先,我们需要了解的是 用src获取数据时不收同源策略的影响。因此用script标签,引入 js文件时则不受跨域的影响(还有 img,iframe中src都具有跨域的能力。
    因此,通过这个特性,我们把数据放在服务器上,通过script标签的src属性获取数据,但是该属性无法判断是否返回了数据,于是我们做一步回调函数的处理。
    补充:数据类型为json格式,因为js可以很容易的就处理json格式的数据。这也是为什么要叫 jsonp 的原因

实例:

    <script src="./data.txt"></script>
    <script>
        function callback(data){
            console.log(data)  //{name:"xg"}
        }
    </script>

后台代码:

    callback({"name":"xg"})

下面是我仿写的百度联想词的小demo

html代码:

    <div class="wrapper">
        <input type="text">
        <ul>
        </ul>
    </div>

js代码:

  <script>
        var oInput = document.getElementsByTagName("input")[0];
        var oUl = document.getElementsByTagName("ul")[0];
        oInput.oninput = function (){
            var value = this.value;
            var oScript = document.createElement("script");
            oScript.src = "https://www.baidu.com/sugrec?prod=pc&wd="+value+"&cb=doJson" //wd为当前词的值 cb为回调函数的名称
            document.body.appendChild(oScript);
            document.body.removeChild(oScript);
        }
        function doJson(data){
            var datas = data.g;
            var str = "";
            datas.forEach(ele => {
                str +=  "<li><a href='https://www.baidu.com/s?wd=" + ele.q + "'>"+ele.q+"</a></li>"
                console.log(ele.q)
            });
            oUl.innerHTML = str;
            
        }
    </script>
  1. document.domain(针对基础域名相同的情况)
    bj.58.com
    tj.58.com
document.domain = '58.com'
document.domain = '58.com'

设置他的domain 即可跨域访问

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值