首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

原生js实现jsonp 跨域

JSONP(JSON with Padding)是一种通过<script>标签实现跨域请求的技术。由于浏览器的同源策略限制,通常情况下,JavaScript只能请求与其自身来源相同的资源。JSONP通过动态创建<script>标签,利用其不受同源策略限制的特性,实现跨域数据交互。

基础概念

JSONP 的工作原理是利用 <script> 标签的 src 属性没有跨域限制的特点,服务器返回的数据会被包裹在一个函数调用中,这个函数名通常由客户端指定并通过 URL 参数传递给服务器。

优势

  1. 兼容性好:JSONP兼容所有浏览器,包括一些较老的浏览器。
  2. 实现简单:只需服务器端配合返回特定格式的数据即可。

类型

JSONP主要分为两种类型:

  • 简单JSONP:客户端定义一个回调函数,服务器返回的数据直接调用这个函数。
  • 动态JSONP:客户端动态创建<script>标签,并设置其src属性为跨域请求的URL。

应用场景

  • 跨域获取数据:当需要从其他域名获取数据时,可以使用JSONP。
  • 第三方API集成:很多第三方服务提供的API支持JSONP,以便在不同域名下使用。

实现示例

以下是一个简单的原生JavaScript实现JSONP的例子:

代码语言:txt
复制
function jsonp(url, callbackName, callback) {
    // 创建一个全局回调函数
    window[callbackName] = function(data) {
        callback(data);
        // 清理工作:删除script标签和全局回调函数
        document.body.removeChild(script);
        delete window[callbackName];
    };

    // 创建script标签
    var script = document.createElement('script');
    script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName;
    document.body.appendChild(script);
}

// 使用示例
jsonp('http://example.com/api/data', 'myCallback', function(data) {
    console.log('Received data:', data);
});

可能遇到的问题及解决方法

问题1:回调函数未定义

  • 原因:服务器返回的数据中没有正确调用客户端指定的回调函数。
  • 解决方法:检查服务器端代码,确保返回的数据格式正确,如myCallback({"data": "value"})

问题2:安全问题

  • 原因:JSONP容易受到XSS攻击,因为它允许执行跨域的JavaScript代码。
  • 解决方法:尽量只在可信的网站上使用JSONP,并考虑使用CORS作为更安全的替代方案。

问题3:错误处理

  • 原因:如果请求失败(例如,URL错误或服务器无响应),JSONP不会有任何错误提示。
  • 解决方法:可以通过设置一个超时机制来处理请求失败的情况,例如使用setTimeout并在超时后删除script标签和回调函数。
代码语言:txt
复制
function jsonp(url, callbackName, callback) {
    var script = document.createElement('script');
    var timeoutId;

    function cleanup() {
        if (script.parentNode) script.parentNode.removeChild(script);
        window[callbackName] = undefined;
        clearTimeout(timeoutId);
    }

    window[callbackName] = function(data) {
        cleanup();
        callback(data);
    };

    script.src = url + (url.indexOf('?') >= 0 ? '&' : '?') + 'callback=' + callbackName;
    document.body.appendChild(script);

    timeoutId = setTimeout(function() {
        cleanup();
        console.error('JSONP request timed out');
    }, 5000); // 设置超时时间为5秒
}

通过以上方法,可以在一定程度上解决JSONP实现过程中可能遇到的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

原生JS封装Ajax插件(同域&&jsonp跨域)

前言 抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉挺可行的。。。...jsonp跨域发送请求 首先,跨域是神马情况呢?...JSONP(JSON with Padding) 是一种跨域请求方式。...但是jsonp跨域只支持get请求。 JSONP由两部分组成:回调函数和数据,回调函数一般是由网页端控制,作为参数发往服务器端,服务器端把该函数和数据拼成字符串返回。...jsonp跨域主要需要考虑三个问题: 因为 script 标签的 src 属性只在第一次设置的时候起作用,导致 script 标签没法重用,所以每次完成操作之后要移除; JSONP这种请求方式中,参数依旧需要编码

3K21
  • JsonP------实现跨域请求

    JsonP技术 介绍 JsonP 跨域 同源策略 非同源限制以下行为 常见的跨域场景 跨域的解决方案 JsonP的优缺点 Json的使用 搭建应用场景 JsonP实现手动跨域 jsonDemo1的...jsp页面(发送跨域请求) jsonDemo2的controller JsonUtils工具类(需要添加相关坐标jackson-databind) 实现自动跨域(SpringMVC对JsonP的支持)...,子域不同 不允许 http://www.domain1.com/a.js http://www.domain2.com/b.js 不同域名 不允许 跨域的解决方案 1) 通过 jsonp 跨域...跨域 6) 跨域资源共享(CORS) 7) nginx 代理跨域 8) nodejs 中间件代理跨域 9) WebSocket 协议跨域 JsonP的优缺点 JSONP 的优点是:它不像...实现手动跨域 手动实现跨域的要求 1. ajax的请求方式必须是get 2. ajax的dataType必须是jsonp 3.

    1.2K10

    jsonp跨域实现的几种方式

    使用jquery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript也可以实现跨域调用js。...jsonp快速入门: 【原创】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例 关于jquery.ajax的jsonp方法是用以及其error回调函数不能正确执行,请参考园长dudu...的文章: jquery ajax中使用jsonp的限制 jQuery插件jQuery-JSONP使用注意 其他有关jsonp的文章: 利用iframe实现ajax 跨域通信的解决方案...最关键的来了,现在开始写完整的智能提示并配合鼠标和键盘对候选词的操作(源码里的index.html页面),实现如下功能: 即时监控字母键和数字键,按下就发ajax请求(也可以设置延迟发请求,源码里有);...($("#auto").is(":visible")) { $("#auto").hide(); } } }); 最后实现效果展示

    3.4K20

    详析JSONP跨域

    JSONP的详析流程: 1 什么是JSONP 2 JSONP的原理与实现流程 2.1 JSONP跨域流程 2.2 相关提示 3 JSONP的实例 - 辅助理解JSONP流程 3.1 JSONP跨域实例...- 前端的JS代码 3.2 JSONP跨域实例 - 后台的PHP代码 3.3 代码的注意事项 4 利用JSONP实现百度搜索的关键词获取 4.1 功能需求与效果 4.2 提供的接口(API)说明 4.3...我们这次,就通过JSONP跨域,去申请百度的这个PHP文件,实现“相关搜索关键词”(如下图)的功能。 ?...跨域的优点 1 JSONP能够比较简单的实现跨域功能,并且在请求完毕后可以通过调用[回调]函数的方式获取服务端的数据; 2 JSONP的兼容性非常好,在低端的浏览器中都可以正常运行,不需要XMLHttpRequest...注意事项 JSONP既能够解决子域的跨域问题,也能够解决不同域的跨域问题。但是不能够在A域中使用JSONP的方式访问B域中的JS文件(请不要陷入这个误区) HTML5学堂 小编-利利&堡堡 耗时10h

    1.9K91

    跨域jsonp的原理

    在学习jsonp之前首先要明白以下几点: 首先确定为什么要用jsonp,因为要跨域请求数据,那为什么会发生跨域呢, 因为浏览器的同源策略,那什么是同源策略呢浏览器从A网站向B网站请求资源,必须同时满足三点才可以...,协议相同,域名相同,端口相同,任何一点不同都会产生跨域,产生跨域后,浏览器就会阻止数据返回。...人们为了满足在不同的域名间传递数据,发明了jsonp技术: 在学习jsonp之前,大家可以思考一下,一张网页中哪些标签是可以跨域请求资源的,我们知道,在页面上有三种资源是可以与页面本身不同源的。...标签可以链接到不同源的js脚本,来到达跨域目的。...这样就完成了跨域数据交换。jsonp的含义是:json with padding,而在json数据外包裹它的那个函数; 附上封装的jsop的代码: ?

    1.3K40

    jsonp跨域原理解析

    (域名不同) 突破同源策略限制: 现在知道了同源策略,那我们就来看下jsonp是如何突破同源策略的限制实现跨域的 首先,不知道大家有没有注意,不管是我们的script标签的src还是img标签的src,...说到这里jsonp的实现原理就浮出水面了。 jsonp就是使用同源策略这一“漏洞”,实现的跨域请求(这也是jsonp跨域只能用get请求的原因所在)。...ok,知道这两点之后,我们开始具体使用jsonp进行跨域请求。...JSONP跨域实现: 根据上边所说的,我们要用过利用srcipt标签的src属性来实现,那么我们如何做呢,我们来看一段简单的代码,为了方便,我这里使用jQuery: $('#btn').click(function...如下: 这样下来,就完成了实现jsonp的跨域。 总结: 需要注意的是,callback参数定义的方法是需要前后端定义好的,具体什么名字,商讨好就可以了。

    54330

    AJAX跨域请求JSONP 原

    JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP...由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求...3、如何使用JSONP? 下边这一DEMO实际上是JSONP的简单表现形式,在客户端声明回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的数据并动态执行回调函数。...> 一、原生js实现方法  <!...($result)"; 但是JAONP只支持GET方式 四、 Access-Control-Allow-Origin是HTML5中定义的一种解决资源跨域的策略。

    91720

    JSONP、CORS解决跨域问题

    一、为什么会有跨域问题? 是因为浏览器的同源策略是对ajax请求进行阻拦了,但是不是所有的请求都给做跨域,对href属性都不拦截。...二、解决跨域问题的两种方式 JSONP CORS 三、JSONP 先简单来说一下JSONP,具体详细详见上面JSONP JSONP是json用来跨域的一个东西。...原理是通过script标签的跨域特性来绕过同源策略。(创建一个回调函数,然后在远程服务上调用这个函数并且将json数据形式作为参数传递,完成回调)。...四、CORS跨域 随着技术的发展,现在的浏览器可以主动支持设置从而允许跨域请求,即:跨域资源共享(CORS,Cross-Origin Resource Sharing),其本质是设置响应头,使得浏览器允许跨域请求...CORS:可以发任意请求 六、基于CORS实现ajax请求 1、支持跨域,简单请求 服务器设置响应头:Access-Control-Allow-Origin = '域名' 或 '*' 客户端 1 <!

    1.6K20
    领券