• <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. Android定制:修改开机启动画面

    转自:https://blog.csdn.net/godiors_163/article/details/72529210 引言 Android系统在按下开机键之后就会进入启动流程,这个过程本身需要一 ...

  2. [web 前端] mobx教程(一)-mobx简介

    opy from : https://blog.csdn.net/smk108/article/details/84777649 Mobx是通过函数响应式编程使状态管理变得简单和可扩展的状态管理库.M ...

  3. idea的debug模式启动运行慢

    今天发现idea的debug模式启动运行特别慢,查找原因是因为在多个方法上打了断点导致,关闭断点问题解决. 关闭断点方法为: 

  4. Scala编程基础

    Scala与Java的关系... 4 安装Scala. 4 Scala解释器的使用... 4 声明变量... 5 数据类型与操作符... 5 函数调用与apply()函数... 5 if表达式... ...

  5. Docker查看运行中容器并进入容器

    一.简述 Docker查看运行中容器并进入容器. 二.方法 $ sudo docker ps $ sudo docker exec -it 775c7c9ee1e1 /bin/bash 将黄色文字替换 ...

  6. react diff 原理

    (1) 把树形结构按照层级分解,只比较同级元素.(2) 列表结构的每个单元添加唯一的 key 属性,方便比较.(3) React 只会匹配相同 class 的 component(这里面的 class ...

  7. [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存

    sql server 统计出来的内存,不管是这个,还是dbcc memorystatus,和进程管理器中内存差距很大,差不多有70G的差异. 具体原因不止,可能是内存泄漏,目前只能通过重启服务解决   ...

  8. Linux中rz和sz命令用法详解

    http://www.111cn.net/sys/linux/67810.htm 在linux中rz 和 sz 命令允许开发板与主机通过串口进行传递文件了,下面我们就来简单的介绍一下rz 和 sz 命 ...

  9. Linux shell去除字符串中所有空格

    Linux shell去除字符串中所有空格 echo $VAR | sed 's/ //g'

  10. pip 安装出现超时问题的解决

    pip 安装出现超时问题的解决 我们在用默认的pip源进行安装python库时,会出现超时问题下载不了,如下图显示所示: 那么我们应该如何解决呢? 方法: 在自己电脑的  C:\Users\yanji ...