jsonp库解读与分析

作者 : 开心源码 本文共1532个字,预计阅读时间需要4分钟 发布时间: 2022-05-13 共243人阅读

jsonp是一个经典的跨域处理方案,尽管现在使用的很少,但是这种经典的处理方案还是应该理解下,最近在看github中开源的jsonp库,跟着源码加上查阅资料理解了一下jsonp前后台主要的工作,借此来分享一下,有不对的地方大家可以留言指出。

前台需要传递的内容

  • 访问的服务器方法名

  • 返回json前台调用方法

服务器需要完成的内容

按照前台给的回调函数名包裹成字符串返回

解析github的jsonp项目

传递参数

使用这个库需要传递三个参数

  • url

访问的服务器函数

  • opt

    1. name:本地接受服务器返回json的函数名称的

    2. param、preffix 服务器解析请求并返回json的函数名称与接受服务器返回json的函数名称前缀

    3. timeout 等待服务器返回结果的最长时间

  • fn

你希望执行的回调函数

分析jsonp库代码

发起jsonp请求

        var target = document.getElementsByTagName('script')[0] || document.head;        script = document.createElement('script');        script.src = url;        target.parentNode.insertBefore(script, target);

代码很简单就是在本地创立script而后发起url请求

解决等待最大时间方法

if (timeout) {            timer = setTimeout(function(){                cleanup();                if (fn) fn(new Error('Timeout'));            }, timeout);        }

jsonp库在发起请求前首先执行这部分代码,当在给定的时间内这个定时器没有清楚就会执行清除函数,这里这里值得注意的是,假如有回调函数也会给回调函数抛一个错误。

清除函数

写通用工具方法,要记得写清除方法解决不再使用的元素,避免白费资源

  function cleanup(){            if (script.parentNode) script.parentNode.removeChild(script);            window[id] = noop; // 将解决服务器返回数据函数赋值为空函数            if (timer) clearTimeout(timer);        }
  • 首先清除了发起jsonp请求的script标签

  • 接着清除监听等待函数返回最大时间的定时器

  • 并将本地监听函数设置为空函数。

监听服务器返回

window[id] = function(data){            cleanup(); // 不要不记得清除            if (fn) fn(null, data);        };

在window对象上监听远端返回,这个id就是前边设置的参数组装而成的,这里要注意一下这里不能完了执行清除函数,以防资源白费

服务器解决部分

 const pathName = url.parse(req.url).pathname; // 获取访问服务器的函数名称        const queryData = qs.parse(req.url.split('?')[1]); // 获取请求参数部分        if (pathName === '/jsonp' && queryData['callback']) {            res.writeHead(200, {                'Content-Type': 'application/json;charset=utf-8' // 返回类型为json            });            var data = {                name: 'zhouyijun'            }            res.end(queryData.callback + `(${JSON.stringify(data)})`) // 返回值,要记得将json对象转换为字符串        }

这里代码比较简单就是通过url解析参数,分发给对应的解决函数,并且取出终端回调函数名称使用字符串拼接成结果返回给终端。

jsonp GitHub地址

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » jsonp库解读与分析

发表回复