• <script async type="text/javascript" src="http://lisi.com/data.php?flag=1"></script>
    <script type="text/javascript">
    // script标签默认请求是同步的,也就是第一个标签没有得到服务器响应内容时,后续的的标签只能等待
    // 如果希望标签的请求变成异步的,可以给标签添加一个async属性
    console.log(abc);
    </script>

  • <script type="text/javascript">

/*

动态创建script标签,这种方式默认就是异步的

*/

var script = document.createElement('script');

script.src = 'http://lisi.com/data1.php?callback=abc';

var head = document.getElementsByTagName('head')[0];

head.appendChild(script);

// 这个函数由谁调用?后台返回的内容(js代码-函数调用)来调用

// 回调函数(不是自己调用,而是“别人”调用)

function abc(param){

console.log(param.username);

}

</script>

//跨域对应的文件夹

<?php
$flag=$_GET['callback'];
echo $flag.'({"username":"xiaobai","age":"18"})';//返回的内容是【函数调用】
?>

  • ajax方法既支持json也支持jsonp
    */
    function ajax(obj){
    // 默认值
    var defaults = {
    type : 'get',
    jsonp : 'callback',
    url : '#',
    data : {}
    }
    // 覆盖默认参数
    for(var key in obj){
    defaults[key] = obj[key];
    }

    if(defaults.dataType == 'jsonp'){
    // 跨域处理
    _ajax4Jsonp(defaults);
    }else{
    // ajax处理
    _ajax4Json(defaults);
    }
    }

    function _ajax4Json(obj){
    // 1、创建xhr对象
    var xhr = null;
    if(window.XMLHttpRequest){
    xhr = new XMLHttpRequest();
    }else{
    xhr = new ActiveXObject('Microsoft.XMLHTTP');
    }
    // 处理参数
    var param = '';
    // 处理对象形式的参数
    // 把{username:'lisi',age:12,gender:'male'}
    // 转成username=lisi&age=12&gender=male
    for(var key in obj.data){
    // 拼接一个参数
    param += key + '=' + encodeURIComponent(obj.data[key]) + '&'
    }
    if(param){
    // 去掉最后一个字符
    param = param.substring(0,param.length - 1);
    }
    if(obj.type == 'get'){
    // 对于get请求要把参数拼接到url中
    obj.url += '?' + param;
    }
    // 2、配置发送参数
    xhr.open(obj.type,obj.url);
    // 3、执行发送动作
    var data = null;
    if(obj.type == 'post'){
    data = param;
    // 设置请求头
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    }
    xhr.send(data);
    // 4、处理响应(指定回调函数)
    xhr.onreadystatechange = function(){
    if(xhr.status == 200 && xhr.readyState == 4){
    // 获取服务器响应数据
    var result = xhr.responseText;
    if(obj.dataType == 'json'){
    // 如果要求是json格式,那么就把json字符串转成对象
    result = JSON.parse(result);
    }
    // 调用回调函数
    obj.success(result);
    }
    }
    }

    function _ajax4Jsonp(obj){
    // 业务参数转换
    // 把{"username":"lisi","age":"12"}格式的数据转成username=lisi&age=12
    var param = '';
    for(var key in obj.data){
    param += key + '=' + obj.data[key] + '&';
    }
    // if(param){
    // param = param.substring(0,param.length - 1);
    // }

    // 生成默认的回调函数的名称
    var cbName = 'jQuery' + ('v1.11.1' + Math.random()).replace(/\D+/g,'') + '_' + (new Date().getTime());
    if(obj.jsonpCallback){
    // 如果调用方法的时候传递了回调函数的名称就把默认的覆盖掉
    cbName = obj.jsonpCallback;
    }

    // 回调函数
    window[cbName] = function(data){
    obj.success(data);
    }
    // 后台返回的内容是函数调用
    // jQuery12312312312312321_43213123123(23123);

    // 创建script标签,然后追加到head标签中
    var script = document.createElement('script');
    script.src = obj.url + '?' + param + obj.jsonp + '=' + cbName;
    var head = document.getElementsByTagName('head')[0];
    head.appendChild(script);
    }

php跨域发送请求原理以及同步异步问题的更多相关文章

  1. 使用jsonp跨域发送请求

    如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型. 使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面. ...

  2. 跨域post请求实现方案小结--转

    [名词解释] 跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript 同源策略 ...

  3. Ajax跨域:Jsonp原理解析

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

  4. JS跨域方法及原理

        JS跨域分析判断 JS跨域:在不同域之间,JS进行数据传输或通信.比如ajax向不同的域请求数据.JS获取iframe中的页面中的值(iframe内外不同域) 只要协议.端口.域名有一个不同则 ...

  5. 使用$.getJSON实现跨域ajax请求

    jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...

  6. Java跨域以及实现原理

    最近研究了一下跨域,没接触之前我的印象就是配合单点登录的一种方式,后来在网上看到资料才知道不仅仅是这一种,用法很多,具体的可以去网上搜索. 一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访 ...

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

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

  8. 【笔记】vue-cli 开发环境中跨域连接后台api(vue-resource 跨域post 请求)

    在vue-cli 项目中很多人会用到mock 数据(模拟数据),但是我觉得如果在真实的数据库交互中开发会更有安全感一些,所以查了一下百度很多人推荐的就是: 跨域! 跨域是什么概念?不同的主机名,同主机 ...

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

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

随机推荐

  1. mount: wrong fs type, bad option, bad superblock

    mount: wrong fs type, bad option, bad superblock on 125.64.41.244:/data/img,       missing codepage ...

  2. centos7下使用rpm包安装clickhouse

    clickhouse是由俄罗斯Yandex公司开发的列式存储数据库,于2016年开源,clickhouse的定位是快速的数据分析,对于处理海量数据的情况性能非常好,在网上也有很多测试的案例,在大数据的 ...

  3. 怎样在 Ubuntu 16.04 强制 APT 包管理器使用 IPv4 | Linux 中国

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/F8qG7f9YD02Pe/article/details/82879401 https://mmbi ...

  4. Win10系统的SurfacePro4的触摸笔如何使用

    初次使用需要配对,微软的触摸笔是蓝牙配对的,打开平板的蓝牙,长按触摸笔后面的按钮,触摸笔会闪烁小灯,平板会提示配对准备已就绪   点击配对之后,提示已连接   可以按下触摸笔后面的按钮,一键打开One ...

  5. grid - 隐式地命名网格区域名称

    通常可以将网格线命名成任何你想命名的名称,如果网格线名称添加-start和-end的后缀,其实也隐式的创建一个网格区域,可以用来设置网格项目的位置. 在这个示例中,行和列都具有inner-start和 ...

  6. ionic生成全尺寸icon和splash

    http://www.jianshu.com/p/eda363eb28d3 重新添加platform --no-resources可以禁止重新生成icon和splash ionic cordova p ...

  7. vue: 代码小记

    1.事件派发:子控件->父控件 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  8. sqlite3常用技巧

    数据库是一种工具,在合理的条件下使用数据库可以获得许多益处. 使用SQL语句可以完成复杂的统计,可以少写许多复杂逻辑 使用数据库无需担心内存溢出问题 原来可能需要许多文件来保存,现在只需要一个sqli ...

  9. <%: Html.DisplayNameFor与 <%: Html.DisplayFor的区别

    DisplayNameForModel只有在model定义了DisplayName时有用,简单说,DisplayNameFor是针对model里的"字段"别名,DisplayNam ...

  10. 看雪CTF第十四题

    from z3 import * dest=[] s = Solver() data = [, , , , , , , , , , , , , , , , , , , , , , , , , , , ...