• <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. .NET分布式缓存Memcached从入门到实战

    一.课程介绍 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了数据库负载.缓存是解决这个问题的好办法.但是ASP.NET中的虽然已经可以实现对页面局部进行缓存,但还是 ...

  2. Wordpress添加分类

    网址一般不用中文,别名方便让网址更美观,如: xxx/category/new/

  3. SharePoint PowerShell 修改母版页

    前言 最近在群里帮忙回答问题,碰到这么一个尴尬的问题,有人创建了一个新母版页,然后引用了新的母版页,不知道怎么的母版页有问题了,再也进不去站点了,希望修改回旧的母版页. 看到问题,想了一下,其实两种方 ...

  4. Unity 5.4版本 Application.systemLanguage 失效

    最近在上线双语版本(一个包支持中文.英文二种语言)时,遇到一个坑点 if (ToolUtils.isAndroid()) { if (Application.systemLanguage == Sys ...

  5. fopen和fopen_s用法的比较

    open和fopen_s用法的比较 fopen 和 fopen_s           fopen用法: fp = fopen(filename,"w").         fop ...

  6. grid - 通过网格线名称设置网格项目位置

    使用网格线名称设置网格项目位置和使用网格线号码设置网格项目位置类似. 1.引用网格线名称的时候不应该带方括号 <view class="grid"> <view ...

  7. 【开源】C#信息抽取系统【招募C#队友】

    FDDC2018金融算法挑战赛02-A股上市公司公告信息抽取 更新时间 2018年7月11日 By 带着兔子去旅行 信息抽取是NLP里的一个实用内容.该工具的目标是打造一个泛用的自动信息抽取工具.使得 ...

  8. Java 基础【19】代理

    Java 代理(Proxy)模式与现实中的代理含义一致,如旅游代理.明星的经纪人. 在目标对象实现基础上,增加额外的功能操作,由此来扩展目标对象的功能. JavaWeb 中最常见的过滤器.Struts ...

  9. 每天一个linux命令(17):whereis

    1.命令简介         whereis (whereis) 命令用来定位指令的二进制程序.源代码文件和man手册页等相关文件的路径.         whereis命令只能用于程序名的搜索,而且 ...

  10. [转]PID控制算法原理

    PID控制算法是工业界使用极其广泛的一个负反馈算法,相信这个算法在做系统软件时也有用武之处,这里摘录了知乎上的一篇文章,后面学习更多后自己总结一篇 以下为原文: PID控制应该算是应用非常广泛的控制算 ...