分享一下跨域,不仅是因为现在的工作中遇到的越来越多,而且在面试中也经常被问到。

那么什么是跨域呢,我们来看官方给出的解释:浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的(所谓同源是指,域名,协议,端口均相同,只要有一个不相同即为跨域),是浏览器对javascript施加的安全限制。这里不做重点介绍,网上有很多这方面的介绍,本篇主要详解jsonp的底层实现原理。

虽然,浏览器在这方面做了限制,但是我们可以通过script标签,巧妙的避开同源策略,“偷梁换柱”,我们来看一段代码

<script>
function fn(data){
console.log(data);
}
</script>
<script>
fn("我是后端的数据");
</script>

纳尼???这不就是一个普通的不能再普通的函数调用吗?很多小伙伴一定以为我把代码贴错了吧,开什么玩笑,这不就是一个普通的不能在普通的函数调用吗?这和你说的jsonp有半毛钱关系吗?我想说不仅有关系,而且非常有关系,甚至可以说这就是jsonp的底层实现原理。疯了吧!!!别急。。。咱们接着往下看

咱来看一下百度提示中使用的的跨域,他就是用的是jsonp的形式,https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&cb=hello,(接口后面的参数我会在下面讲解)这个就是百度提示的一个接口,我们放到浏览器的地址栏打开

是不是很熟悉,这不就是一个函数调用的方式吗?他把数据当作参数给传进去了,继续往下看

<script>
function hello(data){
console.log(data);
}
</script>
<script src="https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/suwd=a&cb=hello"></script>

在浏览器中打印出来,我们发现我们已经拿到了百度给的接口的数据,终于可以长舒一口气。

但是,好像有点问题,假如我们不是想页面一加载的时候就去拿数据,而是在需要的时候再去加载数据怎么办(也就是按需加载),这时候该怎么办呢?

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
</body>
<input type="button" value="点击加载百度接口数据" id="input"/>
<script>
function hello(data){
console.log(data);
}
var oInp = document.getElementById('input');
oInp.onclick = function(){
var oScript = document.createElement('script');
oScript.src = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=a&cb=hello";
document.body.appendChild(oScript);
}
</script>
</html>

以上代码就完美的解决了这个问题,实现了按需加载,有木有很像ajax,哈哈,可以在自己的编辑器中运行一下,看一下效果。

小结:jsonp的底层实现原理,其实就是函数调用,只不过调用的方式有些特别,调用的接口是从后端传过来的。

再来看一下jquery中jsonp的用法

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
</body>
<script src="js/jquery.min.js"></script>
<script type="text/javascript">
$.ajax({
type : "get",
data : {wd:"a"},
url:"https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su",
dataType: "jsonp", //请求类型为jsonp
jsonp:"cb", //与后端约定好的函数调用的key值(也就是参数名)
jsonpCallback: "hello", //要执行的回调函数名
success : function(data) {
console.log(data);
}
})
</script>
</html>

对比一下前面我写的代码,我想你一定会有所收获!

跨域详解之jsonp,底层的实现原理的更多相关文章

  1. 跨域详解之-----Jsonp跨域

    一.通过jsonp跨域 在js中,我们直接用XMLHttpRequest请求不同域上的数据时,是不可以的.但是,在页面上引入不同域上的js脚本文件却是可以的,jsonp正是利用这个特性来实现的. 比如 ...

  2. js&jquery跨域详解jsonp,jquery并发大量请求丢失回调bug

    URL  说明 是否允许通信 http://www.a.com/a.js http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js http:/ ...

  3. ajax工作原理及jsonp跨域详解

    一.Ajax简介 ajax = 异步 JavaScript 和 XML. ajax是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.我们知道,传统的网页(不使用ajax)如果需要更新内容, ...

  4. 【nginx】nginx解决跨域详解

    使用场景:本地运行一个项目,但是要访问外域的api接口,存在跨域问题,解决方式有很多,但我尝试用nginx解决,搜索了网上文章后再加上尝试终于成功, 其中一些注意事项和大家分享一下. 一.window ...

  5. JavaScript中的跨域详解(二)

    4.AJAX 同源政策规定,AJAX请求只能发给同源的网址,否则就报错. 除了架设服务器代理(浏览器请求同源服务器,再由后者请求外部服务),有三种方法规避这个限制. JSONP WebSocket C ...

  6. js跨域详解

    跨域概念:Cross-origin resource sharing

  7. JavaScript中的跨域详解(一)

    同源策略 所谓的同源策略,指的是浏览器对不同源的脚本或者文本访问方式进行的限制. 所谓同源,就是指两个页面具有相同的协议,主机(也常说域名),端口,三个要素缺一不可. 同源政策的目的,是为了保证用户信 ...

  8. 004. 前端跨域资源请求: JSONP/CORS/反向代理

    1.什么是跨域资源请求? https://www.cnblogs.com/niuli1987/p/10252214.html 同源: 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有 ...

  9. 面试汇总——知道什么是同源策略吗?那怎么解决跨域问题?知道 JSONP 原理吗?

    本文是面试汇总分支——知道什么是同源策略吗?那怎么解决跨域问题?知道 JSONP 原理吗?. 同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能, ...

随机推荐

  1. leetcode1277 Count Square Submatrices with All Ones

    思路: 使用动态规划,dp[i][j]表示以(i, j)作为右下角的最大的全1矩阵的边长. 实现: class Solution { public: int countSquares(vector&l ...

  2. DDS工作原理及其性能分析

    DDS工作原理及其性能分析 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 系列博客说明:此系列博客属于作者在大三大四阶段所储备的关于电子电路设计等硬件方面的 ...

  3. UiPath工具取得网页上面的数据,写入到csv,Outlook邮件发送

    问题描述: 想取得网页上面的股票价格,之后写入到csv文本里面之后添加附件发送邮件. 解决方法: 利用UIPath工具来取得数据,之后写入再发送. 具体步骤: 1.打开网页,之后找到所显示的股票行情的 ...

  4. C++ 编译错误 jump to case label [-fpermissive]

    <花的微笑>--- 钢琴曲,石进 今天再用C++写代码时,出现了编译错误 jump to case label [-fpermissive] 原因:使用switch语句时,再case中定义 ...

  5. oracle导入.dmp脚本

    一.更改数据库管理员sys/system密码 1.运行到C盘根目录 2.输入:SET ORACLE_SID = 你的SID名称 3.输入:sqlplus /nolog 4.输入:connect /as ...

  6. WebElement的方法:

    这个类代表HTML页面元素 id_ #当前元素的ID tag_name #获取元素标签名的属性 text #获取该元素的文本. click() #单击(点击)元素 submit() #提交表单 cle ...

  7. go变量的定义并赋值

    变量在定义时没有明确的初始化时会赋值为_零值_. 零值是: 数值类型为 `0`, 布尔类型为 `false`, 字符串为 `""`(空字符串). package main impo ...

  8. 使用vue-cli创建vue工程

    在Windows环境下,打开命令行窗口,跳转至想创建工程的路径. 如:D:\MyWork\22_Github\rexel-cn\rexel-jarvis 创建vue工程,命令:vue create r ...

  9. Java ShellSort

    Java ShellSort /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternational ...

  10. Java Web 深入分析(7) Jetty原理解析

    1Jetty的基本架构 Jetty有一个基本的数据模型,这个模式就是handle,所有拷贝拓展的组件都被当做一个handler被添加到server中,然后由jetty统一管理. 1.1Jetty基本架 ...