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 同源: 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有 ...
随机推荐
- C# 实现Remoting双向通信
本篇文章主要介绍了C# 实现Remoting双向通信,.Net Remoting 是由客户端通过Remoting,访问通道以获得服务端对象,再通过代理解析为客户端对象来实现通信的 闲来无事想玩玩双向通 ...
- Amazon Publisher Studio让产品推广更简单
Amazon联盟最近推出了Publisher Studio新功能,只要在Amazon联盟网站后台添加一段特定的代码,以后推广所有Amazon产品的时候就不需要再访问Amazon Associates网 ...
- CTR预估算法之FM, FFM, DeepFM及实践
https://blog.csdn.net/john_xyz/article/details/78933253 目录目录CTR预估综述Factorization Machines(FM)算法原理代码实 ...
- php读取ini配置文件属性
ini的内容格式如下,请根据自己的INI,格式修改下段程序. autostart = false font_size = font_color = red =================== fu ...
- 【PHP】解析PHP中的数组
目录结构: contents structure [-] 创建数组 删除数组 栈结构 常用的数组处理函数 在这篇文章中,笔者将会介绍PHP中数组的使用,以及一些注意事项.之前笔者已经说过PHP是一门弱 ...
- vue前端知识点整理
1. 说一下Vue的双向绑定数据的原理 vue 实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter, ...
- centos 环境搭建jenkins服务
1.下载jenkins war包 https://jenkins.io/download/ 选择Generic Java package (.war)下载2.下载apache tomcat 8 htt ...
- crawler_exa2
优化中... #! /usr/bin/env python # -*- coding:utf-8 -*- # Author: Tdcqma ''' v17.0920.1401 基本功能实现,漏洞标题与 ...
- Elasticsearch常用配置及性能参数[转]
cluster.name: estest 集群名称node.name: “testanya” 节点名称 node.master: false 是否主节点node.data: true 是否 ...
- vue.js购物车
vue.js https://cn.vuejs.org/v2/guide/ 简单购物车 <html> <head> <script src="https://c ...