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 同源: 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有 ...
随机推荐
- Unity 5.4版本 Application.systemLanguage 失效
最近在上线双语版本(一个包支持中文.英文二种语言)时,遇到一个坑点 if (ToolUtils.isAndroid()) { if (Application.systemLanguage == Sys ...
- 分享一个整理Mac储存空间的软件,有效清理xcode的垃圾
苹果的电脑还是比windows的要好,我这台用了3年时间,作为编程工作天天用,现在愣是一点儿也没有卡顿,如果换作是windows的电脑,我敢保证肯定是卡成狗,相信做编程的你肯定少补了一台mac. ma ...
- Elasticsearch集群优化
版本配置: ES版本:6.2.4 OS内存64G. 一.参数配置: ES jvm内存31G. vi /etc/sysctl.conf vm.swappiness = 1 elasticsearch.y ...
- SpringBoot(十二):springboot2.0.2写测试用例
导入maven依赖: <dependency> <groupId>junit</groupId> <artifactId>junit</artif ...
- window下zookeeper的下载启动和报错等问题
在使用dubbo等需要用到zookeeper,之前window下本地部署,启动一直有问题,后面折腾了下才部署成功,此次记录下来. 将zookeeper下载之后,解压到指定目录即可,无需安装.例如:解压 ...
- java中random()函数用法介绍
Random() 创建一个新的随机数生成器. 代码如下 复制代码 Random(long seed) 使用单个 long 种子创建一个新的随机数生成器. 我们可以在构造Random对象的时候指定种子 ...
- 中文分词工具thulac4j发布
1. 介绍 thulac4j是THULAC的Java 8工程化实现,具有分词速度快.准.强的特点:支持 自定义词典 繁体转简体 停用词过滤 若想在项目中使用thulac4j,可添加依赖: <de ...
- zsh+on-my-zsh配置教程指南(程序员必备)
本文以CentOS 7/Mac 为例,介绍zsh的配置使用教程. 准备 查看当前环境shell echo $SHELL <!-- more --> 查看系统自带哪些shell cat /e ...
- blender show normals
https://blenderartists.org/forum/showthread.php?193096-Blender-2-5-how-to-show-normals-in-viewport
- Xshell Plus
https://xshell.woytu.com 一个在线生成Xshell Plus 等软件的注册码的网址: https://xshell.spppx.org/