【JavaScript】通过封装自己的JSONP解决浏览器的跨域问题(Ajax跨域)

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/82701029 ...
版权声明:本文为博主原创文章,未经博主允许不得转载。更多学习资料请访问我爱科技论坛:www.52tech.tech https://blog.csdn.net/m0_37981569/article/details/82701029
问题引出:要发送Ajax请求,就必须使用HTTP请求?什么是跨域问题?

什么是跨域问题:如果两个页面中的协议、域名、端口、子域名任意有一项不同,两者之间所进行的访问行动就是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。

如何解决呢?

1. 使用创建DOM元素的方式创建img对象, audio, video, link 这几个对象都支持跨域请求,。
var img = new Image();
    img.src = 'http://192.168.1.105:8080?name=zhangsan&age=18';

类似于上面的这种呢?还有其他一些类似的标签,实际上是可以向服务器发送请求的,但是不能拿到返回值

 

2.  使用link标签, 但是也不能拿到服务器的请求, 然后再试试script这个标签来试试看???

<link rel="stylesheet" href="">

link标签只能支持css的格式,其他格式的内容浏览器是显示不出来的

 

3. 使用script标签来实现跨域, 也能满足发送数据的要求, 接受数据呢?来测试一下。

 var script = document.createElement('script');
    script.src = 'http://192.168.1.105:8080?name=zhangsan&age=18';
    document.body.appendChild(script);          // 开始正式发送请求

经测试,还是真可以的,而且在客户端也成功接受到了数据,这说明我们终于找对了路!

 

4. 解决没有加载完成就输出的问题( 这样就会等待到script标签加载完成之后执行)

 // 在返回数据到客户端之前,先进行字符串拼接
    let json = JSON.stringify({
        id: 1,
        name: 'zhangsan',
        age: 18,
        gender: 'Male'
    });

    let jsonStr = 'var data = ' + json;

上面的是我们服务器的数据, 我们直接通过字符串拼接json,然后发给浏览器。

console.log(data)

直接输出,我们发现报错了,找不到这个变量???

原因是因为,浏览器自上而下执行代码,如果DOM元素没有加载完毕就输出,坑定会报错的 

 

5.解决没有加载完成就输出的问题( 这样就会等待到script标签加载完成之后执行)
script.addEventListener('load', function () {
        console.log(data);
    });

直接绑定个事件不就行了,测试以后还真是可以。

但是,缺点是: 这种方式需要服务器端定义一个全局变量, 从而会污染全局变量, 不太推荐…………

 

 6. 上面的思路逻辑和代码优化, 由于脚本执行过后才可以拿到数据, 上面的代码可以优化吗?
var script = document.createElement('script');
    script.src = 'http://192.168.1.105:8080?name=zhangsan&age=18';
    document.body.appendChild(script);

    function callback(data) {
        console.log(data)
    }

    实现原理: 服务器端实际上是返回了一个callback函数的调用, 类似于callback(jsondata), 因此当且仅当服务器断点数据返回来以后, 下面的这个函数就相当于是自动调用了, 就会直接得到服务器端传回来的数据信息, 从而打印输出数据。

服务器端就是这样的:

    let jsonFunc = `callback(${json})`;

7. 代码的继续优化, 可以直接在请求中, 我要自己定义一个函数呢?函数名我要自己指定的方法, 可以直接写在url请求中。

 var script1 = document.createElement('script');
    var url =  'http://192.168.1.105:8080?name=zhangsan&age=19&callback=callback1';
    script1.src = url;
    document.body.appendChild(script1);
    function callback1(data) {
        console.log(data);
    }

服务器端进行参数解析,换成用户自己定义的函数名字不就行了?

 let callback = urlObj.query.callback;

let jsonFunc = ''+callback+'' + '('+ json + ')';

到此,浏览器的跨域问题已经基本全部解决。

相关文章
|
19天前
|
JavaScript
浏览器插件crx文件--JS混淆与解密
浏览器插件crx文件--JS混淆与解密
20 0
|
1月前
|
JavaScript 前端开发 容器
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
21 0
|
19天前
|
JavaScript 前端开发 安全
JavaScript与浏览器的执行平台有何不同?
【4月更文挑战第22天】JavaScript与浏览器的执行平台有何不同?
21 2
|
10天前
|
JSON JavaScript 前端开发
【JavaScript技术专栏】JavaScript的跨域通信方法
【4月更文挑战第30天】本文探讨了JavaScript中的跨域通信方法,包括:同源策略和跨域通信的概念,以及JSONP、CORS、WebSockets、`window.postMessage()`、代理服务器和WebAssembly的使用。这些技术各有优劣,适用于不同的场景,是Web开发者解决跨域问题的关键工具。随着Web技术的演进,跨域通信的解决方案也将不断更新。
|
19天前
|
存储 移动开发 JavaScript
JavaScript和浏览器
【4月更文挑战第22天】JavaScript和浏览器
21 4
|
4天前
|
移动开发 JavaScript 前端开发
javascript监听浏览器离开、进入行为
javascript监听浏览器离开、进入行为
10 0
|
7天前
|
JavaScript 前端开发 开发者
JavaScript基础入门之浏览器控制台调试输出
本文章是对小白学习js的初级教程,也是我对自己学习经验的一种总结,文章大多采用使用案例加讲解,带动学习的方式.因为我们的天性总是喜欢有及时反馈的事物,但是学习是一个慢长的事情,而有结果的回应,才会更好的促进自己去学习,主要是对于javascript学习中的输出,有个大体上的了解,同时通过教学能够更好的使用浏览器来方便我们去学习和运行代码,也是对自己进行笔记整理,对抓住信息关键点的一种提高.
|
10天前
|
XML 前端开发 JavaScript
【JavaScript技术专栏】JavaScript网络请求与Ajax技术
【4月更文挑战第30天】Ajax是Web开发中实现动态数据更新的关键技术,允许不刷新页面即从服务器获取数据。它结合了HTML/CSS、DOM、XML/JSON和JavaScript。`XMLHttpRequest`是传统的Ajax实现方式,而`fetch` API是现代、简洁的替代选项。Ajax应用实例展示了如何使用fetch在搜索框输入时异步获取并显示结果,提升了用户体验。掌握这些技术对前端开发者至关重要。
|
19天前
|
JSON 前端开发 JavaScript
JavaScript原生实现AJAX技术详解
【4月更文挑战第22天】本文详细介绍了使用原生JavaScript实现AJAX技术,包括基本原理和步骤。AJAX借助`XMLHttpRequest`对象实现异步通信,允许网页在不刷新情况下与服务器交换数据。文中提供示例展示了如何创建请求、设置回调函数、处理响应数据以及设置请求头和发送不同类型的数据。此外,还讨论了跨域问题及其解决方案,如CORS和JSONP。掌握这些基础知识对前端开发者至关重要,尽管现代框架提供了更高级的抽象。
|
19天前
|
JavaScript 前端开发 安全
JavaScript中跨域资源共享(CORS):原理和解决方案
【4月更文挑战第22天】本文介绍了JavaScript中跨域资源共享(CORS)的原理和解决方案。CORS借助HTTP头部字段允许跨域请求,核心是Access-Control-Allow-Origin响应头。解决方案包括:服务器端设置响应头(如使用Express.js的cors中间件)、使用代理服务器或JSONP。现代Web开发推荐使用CORS,因为它更安全、灵活,而JSONP已逐渐被淘汰。理解并正确实施CORS能提升Web应用性能和安全性。