絮语:按这个步骤走,你就会明白JSONP是什么鬼。

1.工程目录:


  1. ng-mywork
  2.  
  3. demo.html
  4.  
  5. test.js

2.nginx的server配置


  1. server {
  2. listen ;
  3. server_name scan_80;
  4.  
  5. root E:/ng-mywork/;
  6.  
  7. location / {
  8.  
  9. }
  10.  
  11. error_page /50x.html;
  12. location = /50x.html {
  13. root html;
  14. }
  15.  
  16. }
  17.  
  18. server {
  19. listen ;
  20. server_name scan_90;
  21.  
  22. root E:/ng-mywork/;
  23.  
  24. location / {
  25.  
  26. }
  27.  
  28. error_page /50x.html;
  29. location = /50x.html {
  30. root html;
  31. }
  32. }

配置了两个域名不同,端口不同的域。

不会配置?

请看:nginx+php的使用

   nginx的使用

3.get的xhr的异步请求


  1. //XMLHttpRequest
  2. // true:异步请求
  3. //监听onreadystatechange事件句柄
  4. //设置timeout,回调
  5. var xhr = new XMLHttpRequest();
  6. xhr.open('get', 'http://scan_90:90/test.js', true);
  7. xhr.onreadystatechange = function(){
  8. if(xhr.readyState === 4){
  9. if(xhr.status === 200){
  10. alert("请求成功!")
  11. }
  12. }
  13. }
  14. xhr.ontimeout = function(){
  15. alert("请求超时")
  16. }
  17. xhr.timeout = 1000;
  18. xhr.send(null);

谷歌下请求没问题,因为我设置对浏览器设置了跨域参数。

但是火狐确是不行的,因为是跨域。

4.get的xhr的同步请求


  1. //不能设置超时 因为系统会默认设置为0
  2. var xhr = new XMLHttpRequest();
  3. xhr.open('GET', 'http://scan_90:90/test.js', false);
  4. xhr.send(null);
  5. if(xhr.readyState === 4){
  6. if(xhr.status === 200){
  7. alert("请求成功")
  8. }

注意这里的超时注释,同步是不能设置的。

5.使用jsonp进行跨域解决不能跨域请求的问题


  1. //进行jsonp跨域请求
  2. var script = document.createElement('script');
  3. script.src = 'http://scan_90:90/test.js?callback=dothings';
  4. script.type = "text/javascript";
  5. document.body.insertBefore(script, document.body.children[0]);

请求成功了,但是好像跟我们想象的是有点区别的?因为我们常见的返回是这样的。

  1. dothings([1,2,3]);
  2.  
  3. //然后我们可以调用:
  4. function dothings(arr){
  5. //....
  6. }

那是因为这不只是前端做的,还有服务端也需要做些修改来配合返回值。

增加php文件:

  1. <?php
  2. $callback = $_GET['callback'];
  3. $data = array('1','2','3');
  4. echo $callback.'('.json_encode($data).')';
  5. ?>

改下js:

  1. var script = document.createElement('script');
  2. script.src = 'http://scan_90:80/test.php?callback=dothings';
  3. script.type = "text/javascript";
  4. document.body.insertBefore(script, document.body.children[0]);
  5.  
  6. //请求完毕后立即执行dothings
  7. function dothings(arr) {
  8. console.log(arr)
  9. }

OK,大功告成!

总结:jsonp的跨域使用的就是script可以跨域的特性(还有其他很多标签都可跨域,如img)。通过服务端跟前端的配合使得返回的js是我们定义的方法,以便可以在前端调用执行。

实例操作JSONP原理的更多相关文章

  1. 黑马vue---40、结合Node手写JSONP服务器剖析JSONP原理

    黑马vue---40.结合Node手写JSONP服务器剖析JSONP原理 一.总结 一句话总结: 服务端可以返回js代码给script标签,那么标签会执行它,并且可带json字符串作为参数,这样就成功 ...

  2. 跟vczh看实例学编译原理——一:Tinymoe的设计哲学

    自从<序>胡扯了快一个月之后,终于迎来了正片.之所以系列文章叫<看实例学编译原理>,是因为整个系列会通过带大家一步一步实现Tinymoe的过程,来介绍编译原理的一些知识点. 但 ...

  3. Ajax跨域:Jsonp原理解析

    推荐先看下这篇文章:JS跨域(ajax跨域.iframe跨域)解决方法及原理详解(jsonp) JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重 ...

  4. JQuery实现Ajax跨域访问--Jsonp原理

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...

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

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

  6. 跨域及JSONP原理

    什么是跨域:a.com 域名下的js无法操作b.com或是c.a.com域名下的对象 为什么浏览器要引入跨域问题? 跨域问题来源于浏览器的同源策略,为啥要有这个策略呢? 为了安全.假设现在有a.com ...

  7. ajax工作原理,Jsonp原理

    Ajax工作原理是 相当于在用户和服务器之间加了-个中间层(AJAX引擎),使用户操作与服务器响应异步化. 对于用户请求ajax引擎会做一些数据验证和数据处理,不是所有请求都提交给服务器,当需要从服务 ...

  8. 跨域篇--JSONP原理

    一篇文章让你明白 jsonp原理详解 什么是JSONP? 先说说JSONP是怎么产生的: 其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,着用自 ...

  9. Java JUC之Atomic系列12大类实例讲解和原理分解

    Java JUC之Atomic系列12大类实例讲解和原理分解 2013-02-21      0个评论       作者:xieyuooo 收藏    我要投稿 在java6以后我们不但接触到了Loc ...

随机推荐

  1. wepack+sass+vue 入门教程(一)

    一.安装node.js node.js是基础,必须先安装.而且最新版的node.js,已经集成了npm. 下载地址 node安装,一路按默认即可. 二.全局安装webpack npm install ...

  2. 前端css兼容性与易混淆的点

    一.常用的骨灰级清除浮动 .clearfix:after { content: "."; display: block; height:; clear: both; visibil ...

  3. 用scikit-learn进行LDA降维

    在线性判别分析LDA原理总结中,我们对LDA降维的原理做了总结,这里我们就对scikit-learn中LDA的降维使用做一个总结. 1. 对scikit-learn中LDA类概述 在scikit-le ...

  4. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  5. [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform

    eclipse maven clean install 报错 1. 修改properties-->resource-->utf-8仍然报错 2.修改项目pom.xml文件,增加: < ...

  6. so 问题来了,你现在值多少钱?

    年底了一大帮人都写着年底总结,总结一年做过的事.错过的事和做错的事.增长了多少本事,找没找到女朋友……来年做好升职加薪,要么做跳槽的准备,程序猿又开始浮躁了……. so 问题来了,你现在值多少钱? 这 ...

  7. Javascript中的valueOf与toString

    基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题,本文将详细介绍,有需要的朋友可以参考下. t ...

  8. 中国CIO最关心的八大问题(下)

    中国CIO最关心的八大问题(下) 从调研数据还可以看出,在企业级IT建设与投资上,CIO们并非是一群狂热的技术信徒,他们更多的是从企业发展阶段.信息化程度.技术成熟度.ROI等方面进行综合评估. 五. ...

  9. Linux基础介绍【第七篇】

    linux用户分类 超级用户:UID=0,root 普通用户:UID 500起,由超级用户或具有超级用户权限的用户创建的用户. 虚拟用户:UID 1-499,为了满足文件或服务启动的需要而存在,一般都 ...

  10. 针对Linux ASP.NET MVC网站中 httpHandlers配置无效的解决方案

    近期有Linux ASP.NET用户反映,在MVC网站的Web.config中添加 httpHandlers 配置用于处理自定义类型,但是在运行中并没有产生预期的效果,服务器返回了404(找不到网页) ...