封装JSONP 函数,方便请求发送
封装JSONP 函数,方便请求发送
封装jsonp的代码和封装Ajax的代码非常的相似!可以参照食用偶!
<button id="btn">点击我发送请求!</button>
<script>
function fn2 (data, succ) {
console.log('客户端的函数fn被调用了!')
console.log(data, succ)
}
</script>
<script type="text/javascript">
const btn = document.getElementById('btn');
btn.onclick = function () {
jsonp({
// 请求地址!
url: 'http://localhost:3001/better?callback=fn2'
})
}
function jsonp(options) {
// 1 动态的创建一个script标签
const script = document.createElement('script');
// 为script标签添加src属性
script.src = options.url;
// 将script标签追加到页面当中!
document.body.appendChild(script);
// 给script标签添加onload事件, 当script标签被加载完成的时候删除标签!
script.onload = function () {
document.body.removeChild(script );
}
}
</script>
封装代码优化!
1第一个优化的地方就是处理返回服务器端返回的函数fn2【现在我们希望fn2函数和jsonp函数进行关联!怎么做?!】把外部函数变成参数函数!再把参数函数变成一个全局函数!
<button id="btn">点击我发送请求!</button>
<button id="btn2">点击我发送请求!</button>
<script type="text/javascript">
const btn = document.getElementById('btn');
btn.onclick = function () {
jsonp({
// 请求地址!
url: 'http://localhost:3001/better',
success: function (data, succ) {
console.log(123);
console.log(data, succ)
}
})
}
const btn2 = document.getElementById('btn2');
btn2.onclick = function () {
jsonp({
// 请求地址!
url: 'http://localhost:3001/better',
success: function (data, succ) {
console.log(234234234);
console.log(data, succ)
}
})
}
function jsonp(options) {
// 1 动态的创建一个script标签
const script = document.createElement('script');
// myjsonp后面生成随机数字!
let fnName = 'myJsonp' + Math.random().toString().replace('.', '');
// 他已经不是一个全局函数了!
// 我们要想办法让它变成一个全局函数!
// 第二个地方就是现在的函数已经变成了一个匿名函数了,所以名字变成了一个亟待解决的问题!
window[fnName] = options.success;
// 为script标签添加src属性
script.src = options.url + '?callback=' + fnName;
// 将script标签追加到页面当中!
document.body.appendChild(script);
// 给script标签添加onload事件, 当script标签被加载完成的时候删除标签!
script.onload = function () {
document.body.removeChild(script );
}
}
</script>
jsonp代码的最终优化【如果要求传入更多的callback函数应该怎么做呢?!】
<button id="btn">点击我发送请求!</button>
<button id="btn2">点击我发送请求!</button>
<script type="text/javascript">
const btn = document.getElementById('btn');
btn.onclick = function () {
jsonp({
// 请求地址!
url: 'http://localhost:3001/better',
data: {
name: 'lvchengxin',
age: 20
},
success: function (data, succ) {
console.log(123);
console.log(data, succ)
}
})
}
const btn2 = document.getElementById('btn2');
btn2.onclick = function () {
jsonp({
// 请求地址!
url: 'http://localhost:3001/better',
success: function (data, succ) {
console.log(234234234);
console.log(data, succ)
}
})
}
function jsonp(options) {
// 1 动态的创建一个script标签
const script = document.createElement('script');
// 拼接字符串的变量
let params = '';
for (let attr in options.data) {
params += '&' + attr + '=' + options.data[attr];
}
// myjsonp后面生成随机数字!
let fnName = 'myJsonp' + Math.random().toString().replace('.', '');
// 他已经不是一个全局函数了!
// 我们要想办法让它变成一个全局函数!
// 第二个地方就是现在的函数已经变成了一个匿名函数了,所以名字变成了一个亟待解决的问题!
window[fnName] = options.success;
// 为script标签添加src属性
script.src = options.url + '?callback=' + fnName + params;
// 将script标签追加到页面当中!
document.body.appendChild(script);
// 给script标签添加onload事件, 当script标签被加载完成的时候删除标签!
script.onload = function () {
document.body.removeChild(script);
}
}
</script>
服务器端代码的优化
app.get('/better', (req, res) => {
// 接收客户端传递过来的函数名称
// const fnName = req.query.callback;
// 将函数名称对应的函数调用代码返回给客户端!
// const data = JSON.stringify([{name: "lvhang"},{test: "如果你能看到这条消息,说明你已经解决了同源的问题!你用的或许是jsonph or CROS但是,这已经不重要了!"}]);
// const result = fnName + '(' + data + ')';
// setTimeout( () => {
// }, 1000)
// res.send(result)
// 在jsonp的内部就是干的上面的事情!
res.jsonp({name: 'lvchengxin', age: 20})
})
封装JSONP 函数,方便请求发送的更多相关文章
- 原生JavaScript封装的jsonp跨域请求
原生JavaScript封装的jsonp跨域请求 <!DOCTYPE html> <html lang="en"> <head> <met ...
- jsonp跨域请求响应结果处理函数(python)
接口测试跨域请求接口用的jsonp,需要将回调函数里的json字符串提取出来. jsonp跨域请求的响应结果格式: callback_functionname(json字符串). #coding:ut ...
- 封装 jsonp请求数据的方法
什么是jsonp : Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网站)那获取资料,即跨域读取数据. 为什么我们从不 ...
- 封装jsonp
1.写一个类封装jsonp: jsonp(url, params, success, funName) 参数url:请求地址 参数params:请求数据,可以是json对象,或形如&q ...
- .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器
1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.We ...
- 轻松搞定Ajax(分享下自己封装ajax函数,其实Ajax使用很简单,难是难在你得到数据后来怎样去使用这些数据)
hey,guys!今天我们一起讨论下ajax吧!此文只适合有一定ajax基础,但还是模糊状态的同志,当然高手也可以略过~~~ 一.概念 Ajax(Asynchronous Javascript + X ...
- 使用promise手动封装ajax函数
最近在做一个单页应用,node和浏览器仅通过json传输数据,因为是只有自己用等于是锻炼一下自己,所以也不用考虑seo的问题,node端我已经写好了,但是浏览器端想要用ajax原生太麻烦,用封装的函数 ...
- 轻松搞定JSONP跨域请求
一.同源策略 要理解跨域,先要了解一下"同源策略".所谓同源是指,域名,协议,端口相同.所谓"同源策略",简单的说就是基于安全考虑,当前域不能访问其他域的东西. ...
- 一个http请求发送到后端的详细过程
我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切. 首先http是一个应用层的协议,在这个层的协议,只是一种通讯 ...
随机推荐
- UWP 实现Tab导航首页
先看效果: 这个是用Pivot来实现 1.自定义Pivot的样式,使用Blend工具生成模板,将HeaderTemplate的布局都隐藏 1 <Style x:Key="PivotSt ...
- burpsuite 2020.12.1最新版蓝色版,下载安装破解
最新版Burpsuite下载破解安装 安装包链接:https://cloud.189.cn/t/qUVzYbuAJzqm(访问码:mw12) 1.首先,我们解压,可以看到解压后的文件夹里有如下文件 2 ...
- winform判断程序是否运行,且只能运行一个实例
前言 判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种. 目前使用的是第一种方法. 方法1:线程互斥 static class Program { private static S ...
- python初学者-从小到大排序
x=input("x=") y=input("y=") z=input("z=") if x>y: x,y=y,x if x>z ...
- mysql中order by优化的那些事儿
为了测试方便和直观,我们需要先创建一张测试表并插入一些数据: CREATE TABLE `shop` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记 ...
- linux学习之--虚拟机安装linux【centerOS】
计划把学习中的软件安装使用记录下来,以下是使用VMware 按照 Linux 使用桥接网络虚拟机和windows中都有不同的ip地址
- Mysql 实战关于date,datetime,timestamp类型使用
最近在做一个项目 项目中 不同的小伙伴同时在不同的业务模块中用到了date,datetime,timestamp这三个类型 特别是datetime,timestamp这两个 如果不能理解到位 其实很 ...
- Java中几种常见的循环
多重if_else: package com.dengchaoqun.ht; public class Double_For02 { /** * * 打印乘法表 */ public static vo ...
- RocketMQ 简介
本文根据阿里云 RocketMQ产品文档整理 地址:https://help.aliyun.com/document_detail/29532.html?userCode=qtldtin2 简介 Ro ...
- linux hosts_access
linux hosts_access 概要 tcp连接的访问控制功能,通过libwrap提供,即编译到代码里的访问控制功能 可以通过ldd 命令查看程序是否链接了libwrap库 主要根据程序名称,以 ...