[javascript] 关于jsonp跨域的二三事

news/2024/10/23 5:50:28

出于浏览器同源政策的影响, 如果服务器不允许跨域, 客户端与服务器不同源, 请求就会失败, 提示如下

但是有些标签是例外的, 比如说图片的url, script标签的 url

而作为web脚本语言的javascript, 本质上其实是字符串

不信你可以在script内部  console.log("</script>") 试试, 这个打印会被默认成script的结束

而script请求到的内容填充到浏览器script标签后, 会立即执行里面的内容, jsonp就是利用这个机制, 让服务端返回一个函数的调用, 实现浏览器对获取的数据的处理

 

web代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>测试</title>
</head><body><button>获取数据</button><ul></ul><script>const btn = document.querySelector('button')const ul = document.querySelector('ul')function render_data(data) {console.log(data)const lis = []data.forEach(d => {const li = document.createElement('li')li.textContent = d.namelis.push(li)})ul.innerHTML = ''ul.append(...lis)del_script('req1')}function del_script(id) {const script = document.querySelector(`script[data-id=${id}]`)script.remove()}btn.addEventListener('click', () => {const url = 'http://127.0.0.1:5000/get_data?cb=render_data'const script = document.createElement('script')script.setAttribute('src', url)script.setAttribute('data-id', 'req1')document.body.appendChild(script)})</script></body></html>

代码解析

点击按钮动态生成并插入script, 传入回调函数

服务器收到之后, 直接返回一个函数的调用, 参数为服务器查询到的数据(此处为模拟数据)

客户端渲染script结果后, 立即执行函数, 页面就能看到内容了

 

服务器代码 语言python

from flask import Flask, requestapp = Flask(__name__)@app.route('/get_data', methods=["GET"])
def get_data():cb = request.args.get('cb')lis = [{"id": 1, "name": "张三"},{"id": 2, "name": "李四"},{"id": 3, "name": "王五"},{"id": 4, "name": "赵六"},{"id": 5, "name": "小七"},]return f'{cb}({lis})'if __name__ == '__main__':app.run(debug=True)

 

最终可以得到页面结果

页面也无任何跨域报错

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/72170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode 1857. 有向图中最大颜色值

1.题目基本信息 1.1.题目描述 给你一个 有向图 ,它含有 n 个节点和 m 条边。节点编号从 0 到 n – 1 。 给你一个字符串 colors ,其中 colors[i] 是小写英文字母,表示图中第 i 个节点的 颜色 (下标从 0 开始)。同时给你一个二维数组 edges ,其中 edges[j] = [a_j, b_j] 表…

修改网站模板?公司网站修改文字?

要修改公司网站的模板或文字,你可以按照以下步骤操作:访问网站后台:登录到你的网站管理后台,通常是在域名后面加上 /admin 或 /wp-admin 等路径。选择页面编辑:在后台管理界面找到需要修改的文字或模板所在的页面。编辑页面内容:如果是修改文字,直接在页面编辑器中找到相…

公司网站网页修改?网站模板主页修改?

网站网页修改确定修改需求:明确需要修改的内容,如文本、图片等。 备份现有文件:在修改前备份当前网页文件,以防万一。 编辑HTML/CSS:打开需要修改的HTML文件。 根据需求修改文本、图片路径等。测试修改效果:在本地或测试服务器上预览修改后的网页,确保一切正常。 上线发…

公司网站如何修改内容?怎样修改公司网站内容?

修改公司网站的内容通常涉及以下几个步骤:登录后台管理系统:使用管理员账号登录到网站的后台管理系统。这通常是通过网站的一个特定URL进入,例如 http://yourwebsite.com/admin。导航至内容管理:在后台管理系统中找到“内容管理”或类似名称的部分。这里通常可以编辑网页上…

后台修改网站名称?后台网站底部修改?

要修改网站的名称,通常需要根据你使用的平台或框架进行不同的操作。以下是一些常见情况下的步骤: 1. 使用CMS系统(如WordPress)登录后台:首先登录到你的网站后台。 进入设置:在WordPress中,导航至“设置” > “常规”。修改站点标题:找到“站点标题”或“网站标题”…

IOCDI

​IOC springboot自动创建对象,并存起来Inversion of Control控制反转对象的创建权限交给Spring,并把创建好的对象存到容器里(其实就是一个map集合)DI Dependency Injection自动注入放到IOC容器中的对象实际就是给属性自动赋值Bean对象存到IOC容器里的对象都叫Spring Bean对象…

php模板网站怎么修改?网站模板二次修改程序?

要对PHP模板网站进行二次开发或修改,你可以遵循以下步骤来进行:熟悉模板结构首先,详细阅读模板提供的文档。 理解模板文件夹结构,通常包括HTML/CSS/JS文件以及PHP后端逻辑。备份现有代码在任何修改之前,确保完整备份当前网站的所有文件和数据库。 这一步对于防止意外丢失数…

网站后台管理如何修改?网站后台修改自己信息?

网站后台管理和修改个人信息通常涉及以下几个步骤。具体实现会根据不同的后台管理系统和技术栈有所不同,但基本流程相似。以下是一个通用的指导: 1. 登录后台管理系统访问后台管理界面:通常通过特定的URL访问,如 http://yourwebsite.com/admin。 输入登录凭证:使用管理员账…