Ajax辨析
Ajax辨析
最近在多个知识点涉及到了ajax请求,各个知识有所交错,知识体系上学的有些混乱,这里梳理一下
单纯的发送Ajax请求
方式1: ajax传统4步骤
- ajax的post请求
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function(){
if(this.readyState == 4){
if(this.status == 200){
//执行代码
}else{
//执行代码
}
}
}
xhr.open("POST", "/ajax/ajaxRequest4", true)
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
xhr.send("username="+username.value+"")
- ajax的get请求
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function(){
if(this.readyState == 4){
if(this.status == 200){
//执行代码
}else{
//执行代码
}
}
}
xhr.open("GET", "/ajax/ajaxRequest4?" + "username="+username+"", true)
xhr.send()
方式2:自己封装的ajax请求
- 封装的代码
function jQuery(selector){
if(typeof selector == "string"){
if(selector.charAt(0) == "#"){
//原先的dom对象还要留着,因为最终的实现还要用这些对象的方法去实现,我们无法完成
domObj = document.getElementById(selector.substring(1))
//但是由于封装了新方法,所以原先的dom对象就暂时不能用了(调用不了我们自定义的方法),要返回自定义的jQuery对象
return new jQuery()
}
}
if(typeof selector == "function"){
window.onload = selector
}
this.html = function(innerData){
domObj.innerHTML = innerData
}
this.click = function(fun){
domObj.onclick = fun
}
this.val = function(v){
if(v == undefined){
return domObj.value
}else{
domObj.value = v
}
}
this.change = function(fun){
domObj.onchange = fun
}
/**
* 有一些动态的数据不能写死
* 动态的信息有:
* 1. 请求的类型
* 2. 请求的地址
* 3. 是否异步
* 4. 提交的数据
*/
jQuery.ajax = function(jsonArgs) {
var method = jsonArgs.type.toUpperCase()
var xhr = new XMLHttpRequest()
//发送ajax请求,将文本框里的数据提交至后端
xhr.onreadystatechange = function () {
if (this.readyState == 4) {
if (this.status == 200) {
var jsonObj = JSON.parse(this.responseText)
jsonArgs.callBack(jsonObj)
} else {
alert("异常状态码: " + this.status)
}
}
}
if (method == "POST") {
xhr.open(method, jsonArgs.url, jsonArgs.async)
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
xhr.send(jsonArgs.data)
}
if (method == "GET") {
jsonArgs.data = "?" + jsonArgs.data
xhr.open(method, jsonArgs.url + jsonArgs.data, jsonArgs.async)
xhr.send()
}
}
}
$ = jQuery
new jQuery()
- 前端调用的代码
<!DOCTYPE html>
<html lang="en">
<head>
<title>全面测试自定义jQuery类库</title>
<meta charset="UTF-8">
</head>
<body>
<script src="/ajax/js/jQuery-1.0.0.js"></script>
<script>
$(function(){
$("#btn").click(function (){
$.ajax({
type : "POST",
data : "username=" + $("#username").val(),
async : true,
url : "/ajax/ajaxRequest10",
callBack : function(json){
$("#the-div").html(json.name)
//自定义回调函数,个性化的处理后端返回的数据
}
})
})
})
</script>
<input type="text" id="username">
<input type="button" id="btn" value="点击回显数据">
<div id="the-div"></div>
</body>
</html>
方式3:用官方jQuery封装的ajax请求
//$.ajax()的参数:一个json数据
$.ajax({
async : true, // 默认为true,可以不写
contentType : "application/json", // 一个字符串,表示从浏览器发送给服务器的参数的类型,可以不写
data : {"name" : "xun", "age" : 21, "address" : "芜湖"}, // 可以是字符串,数组,json,表示请求的参数和参数值,常用json格式
dataType : "json", // 表示期望从服务器端返回的数据格式,可选的有:xml,html,text,json
error : function(){ // 表示当请求发生错误时,执行的函数
//请求出错时,执行的代码
},
success : function(data){ // 请求成功,从服务器端返回了数据,执行success函数
//data,就是responseText,是jQuery处理之后的数据
},
url : 请求的地址,
type : "get" 或者 "post" // 请求的方式,默认为get方式,不区分大小写
})
//常用:url, data, dataType, success
为了解决Ajax跨域请求问题
方式1:jsonp底层实现原理
//本质原理:通过自定义时机执行<script>标签,请求servlet
//创建script元素
var scriptElement = document.createElement("script")
//设置script元素属性
scriptElement.type = "text/javascript"
scriptElement.src = "http://localhost:8081/b/jsonp1?fun=sayHello"
//将script对象添加到body标签中(相当于完成了script标签的加载)
document.getElementsByTagName("body")[0].appendChild(scriptElement)
//后端返回数据时参照前端函数名返回,既完成了数据的返回,又可以在前端自定义的函数里对数据进行个性化操作
//这里还依赖一个原理:response.getWriter().writer("function" + (待返回数据填充进来))
//当把这个字符串返回给浏览器,浏览器得到:function(待返回数据),会执行该函数。这为后端返回数据给前端指定函数,提供了必要支撑
方式2:官方jQuery库提供的jonp方式
$.ajax({
type : "GET",
url : "http://localhost:8081/b/jsonp1",
dataType : "jsonp" //
jsonp : "fun" //
jsonCallback : "sayHello" //
})
//dataType: "jsonp" 指定数据类型,从底层决定了,这次请求是一个类ajax请求,底层本质上不会使用XMLHttpRequest对象
//jsonp : "fun" 指定参数名,不设置的时候默认为"call back" ----> 指定第一层回调函数(主要用来作为入口,接受后端传来的json数据)
//jsonCallback : "sayHello" 指定回调函数的名字,不设置的时候,随即生成一个回调函数,且会调用success的回调函数----> 指定第二层回调函数(主要用于按照程序员需求处理后端传来的数据)
相比Ajax,为什么jsonp需要两层回调函数?
本质原因:jsonp不是ajax请求,没有用XMLHttpRequest,在真正的Ajax请求中,第一层回调函数被XMLHttpRequest.responseText替代,可以直接获取到后端传来的数据,只要显式的调用一次回调函数,将后端数据交给自定义的前端回调函数处理即可
但是在jsonp中享受不到XMLHttpRequest直接获取后端数据的便利,所以要在后端获取第一层回调函数,将后端数据传给前端,然后在该函数里,调用第二层回调函数,也就是我们自定义的函数或者是所谓的success函数,接收第一层回调函数转手后的数据,然后完成自定义操作
Ajax辨析的更多相关文章
- content-type常见类型辨析(以ajax与springmvc前后端交互为例)
博客搬家: content-type常见类型辨析(以ajax与springmvc前后端交互为例) 在http报文的首部中,有一个字段Content-type,表示请求体(entity body)中的数 ...
- JavaScript 函数节流和函数去抖应用场景辨析
概述 也是好久没更新 源码解读,看着房价蹭蹭暴涨,心里也是五味杂陈,对未来充满恐惧和迷茫 ...(敢问一句你们上岸了吗) 言归正传,今天要介绍的是 underscore 中两个重要的方法,函数节流和函 ...
- web也是区分前端与后端的,session\cookie辨析
<1>Ajax交互方式 Ext.Ajax.request( { //被用来向服务器发起请求默认的url url : "", //请求时发送后台的参数,既可以是Json对 ...
- AJAX基础知识点学�
1.AJAX(Asynchronous JavaScript and XML)即,异步JavaScript和XML 2.同步/异步差别 同步: ①每次进行整个页面的刷新 ②同步的链接在同一时间仅仅能有 ...
- AJAX基础知识点学习
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/huangyibin628/article/details/28281003 1.AJAX(Async ...
- jQuery之ajax实现篇
jQuery的ajax方法非常好用,这么好的东西,你想拥有一个属于自己的ajax么?接下来,我们来自己做一个简单的ajax吧. 实现功能 由于jq中的ajax方法是用了内置的deferred模块,是P ...
- Ajax及跨域
概念 Ajax Ajax,Asynchronous JavaScript and XML,字面意思:异步的 JavaScript 和 XML,是指一种创建交互式网页应用的网页开发技术. 用于异步地去获 ...
- 一个粗心的Bug,JSON格式不规范导致AJAX错误
一.事件回放 今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...
- ABP文档 - Javascript Api - AJAX
本节内容: AJAX操作相关问题 ABP的方式 AJAX 返回信息 处理错误 HTTP 状态码 WrapResult和DontWrapResult特性 Asp.net Mvc 控制器 Asp.net ...
随机推荐
- 1 Mybatis动态SQL
Mybatis动态SQL 1. 注解开发 我们也可以使用注解的形式来进行开发,用注解来替换掉xml. 使用注解来映射简单语句会使代码显得更加简洁,但对于稍微复杂一点的语句,Java 注解不仅力不从 ...
- 【爬虫+情感判定+Top10高频词+词云图】“谷爱凌”热门弹幕python舆情分析
一.背景介绍 最近几天,谷爱凌在冬奥会赛场上夺得一枚宝贵的金牌,为中国队贡献了自己的荣誉! 针对此热门事件,我用Python的爬虫和情感分析技术,针对小破站的弹幕数据,分析了众网友弹幕的舆论导向,下面 ...
- Python生成GIF动态图
python生成摸头GIF 本篇教程演示了如何使用python的PIL库生成GIF图片 源码已经贴在文中,自行取用 效果演示 运行代码,会让你选择要制作的图片 运行完成后,会在同路径下生成dem.gi ...
- sklearn数据集的导入及划分
鸢尾花数据集的导入及查看: ①鸢尾花数据集的导入: from sklearn.datasets import load_iris ②查看鸢尾花数据集: iris=load_iris()print(&q ...
- Linux系统sed命令常用参数实战
Linux系统sed命令常用参数实战 常用参数 -n 输出某行的文本内容,通常与p联合使用, -e 命令行模式下进行sed的动作编辑,输出编辑后的内容,源文件不会发生变化 -f 以命令中指定的scri ...
- Ubuntu 配置 .NET 使用环境
本文迁移自Panda666原博客,原发布时间:2021年3月29日. 说明 测试使用的环境 Linux版本:Ubuntu Server 20.04 LTS x64 .NET SDK版本:5.0 其他版 ...
- Android Jetpack Navigation基本使用
Android Jetpack Navigation基本使用 本篇主要介绍一下 Android Jetpack 组件 Navigation 导航组件的 基本使用 当看到 Navigation单词的时候 ...
- GitHub-SSH密钥获取
SSH密钥 需要先安装git的客户端,下载: http://git-scm.com/download/ 使用下列步骤完成密钥的添加. 检查系统是否存在密钥 运行 Git Bash, 在弹出的终端中输入 ...
- Vue回炉重造之搭建考试答卷系统
本篇章主要讲述系统搭建逻辑,有疑问的可以加微信联系我.考试系统 资源 Vue.js Element UI 第三方数据接口 业务 答题过程中,防止用户中途退出或者其他不可抗力因素阻碍答题,在每次选择都要 ...
- SAP 定义客户端
SCC4 定义客户端 点击新建条目按钮 Client(客户端) R 200 Client Name(客户端名称) O City(城市) R Logical system(逻辑系统) R ...