1. 同源策略是浏览器处于安全考虑,为通信设置了“相同的域、相同的端口、相同的协议”这一限制。这让我们的ajax请求存在跨域无权限访问的问题。

  2. 同时我们发现script标签引入脚本的行为并不受同源策略的限制,但是script引入的文件会被立即执行,如果其内容不符合js语法,则会报错;

操作原理

针对以上情况,诞生了jsonp:

  1. 利用script标签的src属性来请求接口,并向接口传递一个回调函数(克服了同源问题)

  2. 接口将数据以回调函数参数的形式同回调函数一同传回;此时传回则是这样形式的一个字符串:回调函数名(数据),这样就符合js语法了(克服了script标签引入内容非js报错的问题)

实例操作

纸上得来总觉浅,绝知此事要躬行。jsonp的原理我早就倒背入流了,但是看着觉得明白,但总觉得少了点什么没抓住。所以,实际操刀试试吧。点击下载源码

下载代码后,进入some-code/jsonp-demo文件夹,该文件夹的目录为:

app.js

package.json

views

  1. 命令行进入当前目录,安装包依赖:

    npm install
  2. 安装完毕后,运行程序:

    node app.js

    如果看到命令行输出“app is listening”则表示运行成功

  3. 修改host

    因为需要模拟跨域,所以在host文件中创建俩个不同的域名,在host文件中添加以下内容:

    127.0.0.1  www.a.com www.b.com

    自此结束,在浏览器中输入http://www.a.com:3000/,如果访问成功则表示大功告成,页面中应该出现俩个按钮。

这个时候,我们打开浏览器的控制台,分别点击页面中的俩个按钮,就可以看到测试结果啦。

代码分析

  1. 入口文件:app.js

    • 设定模版引擎

      app.set('views', path.join(__dirname, 'views'));
      var swig = new swig.Swig();
      app.engine('html', swig.renderFile);
      app.set('view engine', 'html');
    • 设置路由和接口

      访问www.a.com时,渲染view/index.html页面

      app.get("/",function(req,res){
      res.render('index', {});
      })

      请求www.b.com/index.json时,返回数据,这里服务器收到jsonp的回调函数名,并把它与数据拼接在一起返回给客户端

      //模拟数据
      var data = {"brand":23}
      app.get("/index.json",function(req,res){
      //解析请求路径
      var param = urlLib.parse(req.url,true);
      var returnValue = param.query.callback+ '(' + JSON.stringify(data) +')';
      res.send(returnValue)
      })
    • 启动服务

      app.listen(3000,function(){
      console.log("app is listening")
      })
  2. 页面:view/index.html

    页面中有俩个按钮:jsonp_buttonajax_button,点击以后分别进行jsonp请求和ajax请求。

    • 绑定点击事件

      jsonp_button.onclick = function(){
      var url = "http://www.b.com:3000/index.json?callback=jsonp";
      //向页面中添加script标签,进行jsonp请求
      creatScript(url)
      } ajax_button.onclick = function(){
      //ajax请求
      var xhr = getXhr();
      xhr.open("get","http://www.b.com:3000/index.json");
      xhr.send();
      if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
      console.log(xhr.responseText);
      } else {
      console.log("Request was unsuccessful: " + xhr.status);
      }
      }
      function getXhr(){
      var xhr;
      if(window.XMLHttpRequest){
      xhr = new XMLHttpRequest()
      }else{
      xhr = new ActiveXObject("Microsoft.XMLHTTP");
      }
      return xhr;
      }

    - 动态创建script标签 ```
    function creatScript(url){
    var scriptTag = document.createElement('script');
    scriptTag.setAttribute('src', url);
    document.getElementsByTagName('head')[0].appendChild(scriptTag);
    }
    ```
    - jsonp回调函数 ```
    function jsonp(data) {
    //获取数据
    console.log(data);
    }
    ```

由上面可以得出:jsonp中所有请求数据的后续操作应写在jsonp的回调函数中,它类似于ajax 的 success操作。

最后一句话概括jsonp:jsonp就是原本应该发送json数据给客户端的服务器,不再发送json,改为发送一段调用回调函数的js代码,而原本应该返回的数据则是该函数的参数。

jsonp 演示实例 —— 基于node的更多相关文章

  1. 转:基于node的web开发框架Express入门

    JavaScript 标准参考教程(alpha) 草稿二:Node.js Express框架 GitHub TOP Express框架 来自<JavaScript 标准参考教程(alpha)&g ...

  2. NodeBB – 基于 Node.js 的开源论坛系统

    NodeBB 是一个更好的论坛平台,专门为现代网络打造.它是免费的,易于使用. NodeBB 论坛软件是基于 Node.js 开发,支持 Redis 或 MongoDB 的数据库.它利用 Web So ...

  3. e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (四) Q 反回调

    上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServ ...

  4. LIGHTX-CMS —— 基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客系统

    概述 LIGHTX-CMS 是我基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客发布系统. 项目本身可以拿来部署个人博客网站,同时我认为其也适合用以新手学习 Node ...

  5. 基于node和npm的命令行工具——tive-cli

    前端开发过程中经常会用到各种各样的脚手架工具.npm全局工具包等命令行工具,如:Vue脚手架@vue/cli.React脚手架create-react-app.node进程守卫工具pm2.本地静态服务 ...

  6. Selenium2学习-040-JavaScript弹出框(alert、confirm、prompt)操作演示实例

    弹出框是网页自动化测试常见得操作页面元素之一,常见的JavaScript弹出框有如下三种: 1.alert(message):方法用于显示带有一条指定消息和一个 OK 按钮的警告框.DemoAlert ...

  7. 基于 Node.js 平台,快速、开放、极简的 web 开发框架。

    资料地址:http://www.expressjs.com.cn/ Express 基于 Node.js 平台,快速.开放.极简的 web 开发框架. $ npm install express -- ...

  8. Pomelo:网易开源基于 Node.js 的游戏服务端框架

    Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese

  9. Fenix – 基于 Node.js 的桌面静态 Web 服务器

    Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...

随机推荐

  1. 基于ReactCSSTransitionGroup实现react-router过渡动画

      此前,我使用了react-router库来完成单页应用的路由,从而实现组件之间的切换能力.然而,默认页面的切换是非常生硬的,为了让页面切换更加缓和与舒适,通常的方案就是过渡动画. 这里我调研了2种 ...

  2. SSISDB2:使用TSQL执行Package

    在SSISDB中,能够使用TSQL脚本执行Package:每执行一次Package,SSIS都会创建一个Operation 和一个执行实例(Execution Instance),每个Executio ...

  3. 利用扩展事件进行调优和Troubleshooting PPT分享

        本篇主题是我在2015年中国数据库大会(DTCC)上的分享,扩展事件从2008版本出来到现在已经有6-7年,国内却很少有相关资料和使用,现在分享一下PPT,希望对大家有所帮助.       可 ...

  4. N个数依次入栈,出栈顺序有多少种?

    对于每一个数来说,必须进栈一次.出栈一次.我们把进栈设为状态‘1’,出栈设为状态‘0’.n个数的所有状态对应n个1和n个0组成的2n位二进制数.由于等待入栈的操作数按照1‥n的顺序排列.入栈的操作数b ...

  5. Html,Css,Dom,javascript细节总结

    最近愈发觉得基础的重要性,细节决定成败,所以希望能够将自己注意到的搜集到的一些关于前端的小细节小知识整理出来,更好的方便自己记忆回顾. 1.在构建网页Html框架时,尽量只给外层标记(即是父标记)定义 ...

  6. iOS 7 tabbar 透明的问题

    在某种特定情景中,ios的tabbar会出现完全透明的情况,出现这种情况的原因是ios7 默认的view因为IOS7默认是全延伸,也就是说controller是延伸到tabbar下面,并且在windo ...

  7. 【Java心得总结七】Java容器下——Map

    我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角 ...

  8. 微信小程序,我的英雄列表

    最近微信小程序炒得火热,就跟成都的这个房价一样.昨天我也尝试了一下,做了一个自己的英雄列表.今天将自己的制作过程记录于此. 1.下载微信开发者工具 官网链接:https://mp.weixin.qq. ...

  9. [AngularJS] AngularJS系列(5) 中级篇之动画

    目录 CSS定义 JS定义 ng动画实际帮我们在状态切换的时候 添加特定的样式 从而实现动画效果. 一般我们会通过C3来实现具体的动画. CSS定义 ng-if 图(实际上,图并不能展现出什么): H ...

  10. 无聊的人用JS实现了一个简单的打地鼠游戏

    直入正题,用JS实现一个简单的打地鼠游戏 因为功能比较简单就直接裸奔JS了,先看看效果图,或者 在线玩玩 吧 如果点击颜色比较深的那个(俗称坏老鼠),将扣分50:如果点击颜色比较浅的那个(俗称好老鼠) ...