Ajax和跨域问题深入解析
发布时间 - 2026-01-11 00:30:45 点击率:次什么是ajax

Ajax(Asynchronous JavaScript and XML),是一种可以向服务器请求额外的数据并且无需刷新页面的技术,ajax的出现带来了更好的用户体验.
Ajax的核心就是XMLHttpRequest(XHR)对象.XHR为向服务器发送请求和解析服务器响应提供了流畅的接口.可以使用XHR对象获取新数据,通过DOM将新数据插入到页面.虽然名字中包含XML,但是ajax通信和数据格式无关;这种技术就是可以不用刷新就从服务器获取数据,但是不一定是XML数据,也可以是json.
XMLHttpRequest对象
XHR的用法
1.创建一个XMLHttpRequest对象
2.发送请求
1).设置请求行 xhr.open()
2).POST请求需要设置请求头 xhr.setRequestHeader() POST请求头Content-Type的值: application/x-www-form-urlencoded
3).设置请求体 xhr.send() get请求传null,post根据情况
3.处理服务器响应
先判断响应状态码和异步对象是否解析完毕.
服务器返回的状态码 status
1xx:消息
2xx:成功
3xx:重定向
4xx:请求错误
5xx:服务器错误
异步对象的状态码 readystate
0:异步对象已经创建
1:异步对象初始化完成,发送请求
2:接收服务器返回的原始数据
3:数据正在解析,解析需要时间
4:数据解析完成,数据可以使用了
XML
XML的特点,出身名门,W3C制定,微软和IBM曾经共同大力推荐过的数据格式.XML 指可扩展标记语言(Extensible Markup Language),被设计用来传输和存储数据,HTML 是设计用来表示页面的.
语法规则:和HTML差不多,都是通过标记来表示的
特殊符号:比如<>要使用实体-转移字符
xml的解析需要前后台配合:
1.后台在返回的时候,在响应头中设置Content-Type的值为 application/xml
2.前台异步对象在接收后台数据时,记得按照xml的方式来接收,xhr.responseXML,并且它返回的是一个object对象,内容是#document
JSON
JSON(JavaScript Object Notation),出身草根,是 Javascript 的子集,专门负责描述数据格式.JSON本身是一个特殊格式的字符串,可以转换成js对象,是网络上用来传输数据使用最广泛的数据格式,没有之一.
语法规则:数据以 key/value 值对表示,数据由逗号分隔,大括号保存对象,中括号保存数组,名称和值都需要使用双引号包含(这个是和js的一点小区别).
js中解析/操作JSON:
1.JSON.parse(json字符串); 将一个json格式的字符串解析成js对象
2.JSON.stringify(js对象); 将一个js对象转成一个json格式的字符串
自己封装一个ajax
function pinjieData(obj) {
//obj 就相当于 {key:value,key:value}
//最终拼接成键值对的字符串 "key:value,key:value"
var finalData = "";
for(key in obj){
finalData+=key+"="+obj[key]+"&"; //key:value,key:value&
}
return finalData.slice(0,-1);//key:value,key:value
}
function ajax(obj) {
var url = obj.url;
var method = obj.method.toLowerCase();
var success = obj.success;
var finalData = pinjieData(obj.data);
//finalData最终的效果key:value,key:value
//1.创建xhr对象
var xhr = new XMLHttpRequest();
//get方法拼接地址,xhr.send(null)
if (method=='get'){
url = url + "?"+finalData;
finalData = null;
}
//2.设置请求行
xhr.open(method,url);
// 如果是post请求,要设置请求头
if (method=='post'){
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
}
//3.发送
xhr.send(finalData);
//4.监听服务器返回的数据
xhr.onreadystatechange = function () {
if (xhr.status==200 && xhr.readyState==4){
var result = null;
//获取返回的数据类型
var rType = xhr.getResponseHeader("Content-Type");
if (rType.indexOf('xml')!=-1){
result = xhr.responseXML;
}else if(rType.indexOf('json')!=-1){
// JSON.parse 的意思是 将 json格式的字符串
//比如 [{ "src":"./images/nav0.png","content":"商品分类1"}]
//转成js对象
result = JSON.parse(xhr.responseText);
}else{//当成普通的字符串去处理
result = xhr.responseText;
}
//将这里解析好的数据交给页面去渲染
success(result);
}
}
}
jQuery中使用ajaxAPI jQuery ajax
jQuery为我们提供了更便利的ajax封装使用.
$.ajax({}) 可以配置方式发起ajax请求
$.get() 以get方式发起ajax请求
$.post() 以post方式发起ajax请求
$('form').serialize() 序列化表单(格式化key=val$key=val)
参数说明
url :接口地址
type :请求方式(get/post)
timeout : 要求为Number类型的参数,设置请求超时时间(毫秒)
dataType: 应该是客户端传递给服务器一个值,告诉服务器如何进行处理:
data: 发送请求数据
beforeSend: 要求为Function类型的参数,发送请求前可以修改XMLHttpRequest对象的函数,例如添加自定义HTTP头。在beforeSend中如果返回false可以取消本次ajax请求.
success: 成功响应后调用
error: 错误响应时调用
complete: 响应完成时调用(包括成功和失败)
//ajax===get
$.ajax({
url:'',
data:'key=value&key=value',
type:'get',
success:function (result) {
console.log(result);
}
});
//ajax===post
$.ajax({
url:'',
data:'key=value&key=value',
type:'post',
success:function (result) {
console.log(result);
}
});
//$.get
$.get({
url:'',
data:'key=value&key=value',
success:function (result) {
console.log(result);
}
});
//$.post
$.post({
url:'',
data:'key=value&key=value',
success:function (result) {
console.log(result);
}
});
//在使用jQuery中ajax发送请求的时候,只需要在 dataType中写上jsonp即可实现ajax的跨域请求
dataType:'jsonp'
跨域
通过XHR实现ajax通信的一个主要限制(相同域,相同端口,相同协议),来源于跨服安全策略,默认情况下,XHR只能请求同一域的资源,这是为了防止某些恶意的行为.
CORS跨域
CORS(cross-origin resource sharing,跨域源资源共享)定义了在跨域时,浏览器和服务器应该如何沟通.CORS允许一个域上的网络应用向另一个域提交跨域 AJAX 请求。实现此功能非常简单,只需由服务器发送一个响应标头即可。
CORS支持所有类型的HTTP请求.
服务器端对于CORS的支持,主要就是通过设置Access-Control-Allow-Origin来进行的。
JSONP
JSONP由回调函数和数据组成.JSONP只支持GET请求.JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据.
JSONP通过动态<script>元素来使用,src属性知道一个跨域URL,JSONP是有效的JavaScript代码,浏览器可以跨域请求JS文件.
优点:简单易用,可以直接访问响应文本,支持在浏览器和服务器之间双向通信.
缺点:1.JSONP是从其他域加载代码执行,存在不安全风险.2.不好确定JSONP请求是否成败.
通过修改document.domain来跨子域
使用window.name来进行跨域
HTML5中新引进 window.postMessage方法来跨域传送数据
flash
iframe
服务器设置代理页面
图像Ping
通过使用标签,利用网页可以从任何网页加载图像原理.
图像Ping常用于跟踪用户点击页面或动态广告曝光次数.
2个缺点:1.只支持GET请求.2.无法访问服务器的响应文本.只能用于浏览器与服务器间的单项通信.
var img = new Image();
img.onload = img.onerror = function (){
alert("Done!");
};
img.src = "";
comet
一种更高级的ajax技术.ajax是页面向服务器请求数据的技术.comet是服务器向页面推送数据的技术.
SSE (Server-Sent Events) 服务器发送事件
Web Sockets
Web Sockets的目标是在一个单独的持久链接上提供全双工,双向通信.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Ajax
# 跨域
# ajax请求前端跨域问题原因及解决方案
# Ajax跨域问题及解决方案(jsonp
# cors)
# Ajax请求跨域问题解决方案分析
# 关于Ajax跨域问题及解决方案详析
# 详解ajax跨域问题解决方案
# Ajax请求WebService跨域问题的解决方案
# Ajax跨域问题的解决办法汇总(推荐)
# AJAX跨域问题解决方案详解
# 数据格式
# 只需
# 转成
# 的是
# 都是
# 是一个
# 这是
# 加载
# 是在
# 是一种
# 是从
# 要在
# 微软
# 带来了
# 可以直接
# 自定义
# 不支持
# 可以使用
# 易用
# 转换成
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
微信小程序 require机制详解及实例代码
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
中国移动官方网站首页入口 中国移动官网网页登录
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Linux系统运维自动化项目教程_Ansible批量管理实战
米侠浏览器网页背景异常怎么办 米侠显示修复
iOS中将个别页面强制横屏其他页面竖屏
iOS发送验证码倒计时应用
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
nodejs redis 发布订阅机制封装实现方法及实例代码
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
轻松掌握MySQL函数中的last_insert_id()
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
香港服务器选型指南:免备案配置与高效建站方案解析
高端网站建设与定制开发一站式解决方案 中企动力
北京专业网站制作设计师招聘,北京白云观官方网站?
php json中文编码为null的解决办法
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
iOS验证手机号的正则表达式
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
如何在IIS管理器中快速创建并配置网站?
Android仿QQ列表左滑删除操作
Laravel怎么清理缓存_Laravel optimize clear命令详解
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
实现点击下箭头变上箭头来回切换的两种方法【推荐】
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Laravel如何使用模型观察者?(Observer代码示例)
Mybatis 中的insertOrUpdate操作
如何在万网主机上快速搭建网站?
如何快速选择适合个人网站的云服务器配置?
,网页ppt怎么弄成自己的ppt?
网站制作免费,什么网站能看正片电影?
Win11关机界面怎么改_Win11自定义关机画面设置【工具】
Android自定义控件实现温度旋转按钮效果
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
如何打造高效商业网站?建站目的决定转化率
如何安全更换建站之星模板并保留数据?
canvas 画布在主流浏览器中的尺寸限制详细介绍
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
如何实现建站之星域名转发设置?
如何在不使用负向后查找的情况下匹配特定条件前的换行符
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
晋江文学城电脑版官网 晋江文学城网页版直接进入
昵图网官网入口 昵图网素材平台官方入口
lovemo网页版地址 lovemo官网手机登录

