Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >通过jsonp解决跨域的源码实现及其特点

通过jsonp解决跨域的源码实现及其特点

作者头像
用户1272076
发布于 2021-09-08 08:00:30
发布于 2021-09-08 08:00:30
70300
代码可运行
举报
文章被收录于专栏:张培跃张培跃
运行总次数:0
代码可运行

一、Jsonp的特点

1、Jsonp是解决跨域的方式之一。

2、Jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本,所以兼容性非常好。

3、Jsonp只支持get请求。

4、Jsonp在调用失败的时候不会返回各种HTTP状态码。

5、在请求完毕后通过调用callback的方式回传结果,将回调方法的权限给了调用方。所以在调用jsonp接口时,需要与被调用方协商好用于callback的参数名字,参数的值为函数名。例如cb=_jsonp1234。cb为双方约定好的参数名,_jsonp1234指定被调用方所要执行的函数名。所以调用方在调用前要保证已方拥有该函数用于接收值。

二、通过Promise封装Jsonp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*
* 实现对 Jsonp 的封装
* url:请求地址
* params:传递的参数对象
* jsonp:与服务端协商的用于存放函数名字的参数
* */
export default function jsonp({url = "", params = {}, jsonp = "cb"}) {
    return new Promise((resolve, reject) => {
        // 定义 body 用于接收数据
        let  body = null;
        // 自定义函数的名字
        const cbName = "_jsonp" + Math.random().toString(36).substr(2);
        // 将jsonp放入params
        params[jsonp] =  cbName;
        // 自定义函数,用于接收值
        window[cbName] = function (data) {
            body = data;
        }
        function _handler({type}){
            // 删除script标签
            document.body.removeChild(script);
            // 删除自定义的函数
            delete window[cbName];
            // 加载完毕并得到数据执行resolve
            console.log(1111,body)
            if(type === "load" && !body)  resolve(body);
            // 异常执行 reject
            else if(type === "error") reject("加载失败");
        }
        // 将对象转为urlencoded格式
        const urlencoded = Object.keys(params).map(v => v + "=" + params[v]).join("&");
        // 将地址url与参数进行拼接。
        url += (url.includes("?") ? "&" : "?") + urlencoded;
        // 创建 script 标签
        const script = document.createElement("script");
        script.src = url;
        // 加载完毕
        script.onload = _handler;
        // 加载异常
        script.onerror = _handler;
        // 指定类型
        script.type = 'text/javascript';
        // 脚本可用,异步执行
        script.async = true;
        // 创建好的script放入body.
        document.body.appendChild(script);
    })
}

三、前端调用

通过百度jsonp的接口进行调用测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script type="module">
    import jsonp from "./jsonp.js";
    // https://www.baidu.com/sugrec?prod=pc&wd=web前端&cb=cb
    (async () => {
        try {
            const res = await jsonp({
                url: "https://www.baidu.com/sugrec",
                params: {
                    prod: "pc",
                    wd: "web前端",// 指定关键字
                },
                jsonp: "cb"
            });
            console.log(res);
        } catch (err) {
            console.log(e)
        }
    })();
</script>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 张培跃 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JSONP练习
程序员NEO
2023/09/28
1600
前端跨域处理方案
浏览器默认存在安全访问限制:如果从当前源向另外一个源发送数据请求,默认是不允许的。
星辰大海c
2023/11/08
2510
前端高频手写面试题
then 方法返回一个新的 promise 实例,为了在 promise 状态发生变化时(resolve / reject 被调用时)再执行 then 里的函数,我们使用一个 callbacks 数组先把传给then的函数暂存起来,等状态改变时再调用。
helloworld1024
2022/12/16
1.1K0
6种解决跨域方案,今天全告诉你了
跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。
公众号 IT老哥
2020/09/16
7.2K0
jQuery中发送jsonp
jQuery中发送jsonp 第一种方式 通过$.ajax 常用参数 $.ajax({ url:''//请求地址 datatype:'jsonp'//发送jsonp请求必须指定数据类型为jsonp jsonp:'参数名'//服务器接收回调函数的参数名如callback ,cb等等默认callback jsonpCallback:'回调函数名'//默认jQuery123545_43456。。。。的随机字符串,可以自定义 success:function(){} }) 第
切图仔
2022/09/08
1.3K0
jQuery中发送jsonp
动手实现一个JSONP
JSONP的原理就不细说了,就是利用script可以跨域的特点来实现跨域,首先我们考虑一个最简单的jsonp,就是简简单单创建script标签, 添加url的功能,如下:
用户1515472
2019/07/24
4430
从零开始学 Web 之 Ajax(七)跨域
跨域这个概念来自一个叫 “同源策略” 的东西。同源策略是浏览器上为了安全考虑实施的非常重要的安全机制。
Daotin
2018/08/31
3.5K0
几种常见的手写源码实现
简单版深拷贝,列举三个例子 array object function,可以自行扩展。主要是引发大家的思考
前端迷
2020/02/02
1K0
JSONP原理及promise封装
在我们想要获取其他网站数据的时候,浏览器的同源策略(Same origin policy)会禁止此项行为,但有时不得不实现这一操作,就会涉及跨域的问题。解决跨域也就成了前端必须掌握的技能,其中JSONP就是一种解决该问题的好方法。
青梅煮码
2023/02/18
5550
前端面试高频20道手写题(二)
可以给img标签统一自定义属性data-src='default.png',当检测到图片出现在窗口之后再补充src属性,此时才会进行图片资源加载。
helloworld1024
2022/08/02
4900
头条面试官:一文彻底搞懂 JSONP
从环绕山峰的小径最高点看到的拉瓦莱多三峰山,意大利 (© AWL Images/Danita Delimont)
山月
2021/01/04
3950
头条面试官:一文彻底搞懂 JSONP
详析JSONP跨域
关于跨域这个问题也是大家工作中经常遇到的问题,之前给大家讲解了跨域的基本知识以及如何使用iframe跨域,如果想具体了解iframe跨域可以点击:深入剖析iframe跨域问题。本文主要讲解JSONP的原理,以及JSONP的实际应用。 JSONP的详析流程: 1 什么是JSONP 2 JSONP的原理与实现流程 2.1 JSONP跨域流程 2.2 相关提示 3 JSONP的实例 - 辅助理解JSONP流程 3.1 JSONP跨域实例 - 前端的JS代码 3.2 JSONP跨域实例 - 后台的PHP代码 3.3
HTML5学堂
2018/03/13
1.9K0
详析JSONP跨域
32个常考的手写面试题,值得动手练一练
https://juejin.cn/post/6963167124881670152
前端达人
2021/06/16
7990
高级前端必会手写面试题及答案1
下面来看一道比较典型的问题,通过这个问题来对比几种异步编程方法:红灯 3s 亮一次,绿灯 1s 亮一次,黄灯 2s 亮一次;如何让三个灯不断交替重复亮灯?
helloworld1024
2023/01/02
9490
【Ajax进阶】跨域和JSONP的学习
例如,下表给出了相对于http://www.test.com:80/index.html 端口号不写,默认为80.。
坚毅的小解同志的前端社区
2022/11/28
1.3K0
【Ajax进阶】跨域和JSONP的学习
手撕前端面试代码题大全
加入我们一起学习,天天进步 转载自:等不到你. https://blog.csdn.net/weixin_43758603/article/details/109895826 写在前面 最近我终于找到
coder_koala
2020/12/17
1.3K0
手撕前端面试代码题大全
那些年面挂的js手写题
arr = {a:1, b:3}, {a:2, b:3, c:4}, {a:3},求和
helloworld1024
2022/11/07
7750
js 跨域问题解决
注意点:一个IP可以注册多个不同域名的,也就是多个域名可能指向同一个IP,即使是这样,他们也不符合同源策略。
用户1349575
2022/01/26
2.1K0
vue--vue-resource实现 get, post, jsonp请求
除了 vue-resource 之外,还可以使用 axios 的第三方包实现实现数据的请求
eadela
2019/12/16
1.2K0
通过JSONP实现跨域访问
说到跨域访问就要谈到浏览器的同源策略,所谓同源指的就是协议相同、域名相同、端口号相同,三个条件必须全部匹配,否则就会收到限制,例如:
Dreamy.TZK
2020/09/07
1.9K0
相关推荐
JSONP练习
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验