php跨域发送请求原理以及同步异步问题
<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跨域发送请求原理以及同步异步问题的更多相关文章
- 使用jsonp跨域发送请求
如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型. 使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面. ...
- 跨域post请求实现方案小结--转
[名词解释] 跨域:https://developer.mozilla.org/en-US/docs/JavaScript/Same_origin_policy_for_JavaScript 同源策略 ...
- Ajax跨域:Jsonp原理解析
推荐先看下这篇文章:JS跨域(ajax跨域.iframe跨域)解决方法及原理详解(jsonp) JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重 ...
- JS跨域方法及原理
JS跨域分析判断 JS跨域:在不同域之间,JS进行数据传输或通信.比如ajax向不同的域请求数据.JS获取iframe中的页面中的值(iframe内外不同域) 只要协议.端口.域名有一个不同则 ...
- 使用$.getJSON实现跨域ajax请求
jQuery中常用getJSON来调用并获取远程的JSON字符串,将其转换为JSON对象,如果成功,则执行回调函数.原型如下: jQuery.getJSON( url, [data], [callba ...
- Java跨域以及实现原理
最近研究了一下跨域,没接触之前我的印象就是配合单点登录的一种方式,后来在网上看到资料才知道不仅仅是这一种,用法很多,具体的可以去网上搜索. 一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访 ...
- JQuery实现Ajax跨域访问--Jsonp原理
JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...
- 【笔记】vue-cli 开发环境中跨域连接后台api(vue-resource 跨域post 请求)
在vue-cli 项目中很多人会用到mock 数据(模拟数据),但是我觉得如果在真实的数据库交互中开发会更有安全感一些,所以查了一下百度很多人推荐的就是: 跨域! 跨域是什么概念?不同的主机名,同主机 ...
- 004. 前端跨域资源请求: JSONP/CORS/反向代理
1.什么是跨域资源请求? https://www.cnblogs.com/niuli1987/p/10252214.html 同源: 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有 ...
随机推荐
- Win server 2012 +IIS8.0下安装SSL证书
SSL证书的申请: 成功在景安申请证书后,会得到一个有密码的压缩包文件,输入证书密码后解压得到五个文件:for Apache.for IIS.for Ngnix.for Other Server,这个 ...
- 微软 microsoft calendar control 11.0 控件下载
微软 microsoft calendar control 11.0 控件下载 https://files.cnblogs.com/files/mqingqing123/csccal2.rar
- [Python设计模式] 第13章 造小人——建造者模式
github地址:https://github.com/cheesezh/python_design_patterns 题目1 用程序模拟一个画小人的过程,要求小人要有头,身子,左手,右手,左脚,右脚 ...
- HashTable代码解析
HashTable继承关系如下: HashTable是一个线程安全的[键-值对]存储结构.其存储结构和HashMap相同,参考这里. 1. HashTable定义了一个类型为Entry<K,V& ...
- Python调试打印错误信息
try: ..... except Exception, e: print 'repr(e):\t', repr(e)
- mysql数据类型转换
--CAST(xxx AS 类型) --CONVERT(xxx,类型) --#浮点型转化为int --i='3.35' --cast(i as signed) --cast(sum(money/100 ...
- ABC卡
如今在银行,P2P等各种贷款业务机构,普遍使用信用评分,对客户实行打分制,以期对客户有一个优质与否的评判.但是不是所有人都知道信用评分卡还分A,B,C卡三类!所以,如果你只知道ABC是Gary的ABC ...
- easyUI 异步加载树
$(function () { var selected = $('#depttree').tree('getSelected'); $('#depttree').tree({ checkbox: f ...
- 详解 JVM Garbage First(G1) 垃圾收集器(转载)
前言 Garbage First(G1)是垃圾收集领域的最新成果,同时也是HotSpot在JVM上力推的垃圾收集器,并赋予取代CMS的使命.如果使用Java 8/9,那么有很大可能希望对G1收集器进行 ...
- system generator学习笔记【01】
作者:桂. 时间:2018-05-18 18:26:50 链接:http://www.cnblogs.com/xingshansi/p/9045914.html 前言 学习使用system gene ...