搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
你好赵伟
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
有向有环图两点间路径问题
2
Air780e模块在linux设备上的RNDIS网卡使用_air780e linux 应用
3
TCP协议中的三次握手法_tcp三次握手的通信方式
4
依存分析 Dependency Parsing
5
Java Swing + MySQL 学生选课管理系统(数据库结课作业)附带源码+文档_毕业选题管理系统源码swing
6
Xshell+WinSCP在Linux上安装jdk_winscp怎么解压jdk
7
图书馆定位导航:RFID、VR与AR技术在图书馆中的应用
8
门控循环单元(GRU)及其预测和分类Python实现
9
二十三、Hadoop的HA(高可用)_hadoop中什么是ha
10
(详细)Hibernate框架的搭建,Hibernate的CRUD操作(一)_hibernate框架及环境搭建 使用hibernatetemplate完成curd 实验报告
当前位置:
article
> 正文
《JavaScript高级程序设计 第三版》学习笔记 (十二)Ajax详解_javascript高级编程 ajax
作者:你好赵伟 | 2024-07-23 19:23:57
赞
踩
javascript高级编程 ajax
一、JSON
1.使用XML在服务器和浏览器之间进行数据交换太浪费带宽,因而出现了新的数据结构JSON。JSON是包含了简单值、对象、数组的严格的JS子集,不支持变量、函数或对象实例。很多语言也有各自的JSON解析器和序列化器。
2.不能将JSON写成简单的js字面量,否则只能在js中使用,而其他语言会解析不了。JSON要求严格的地方主要有:字符串值必须用双引号;对象属性必须用双引号;同一个对象中绝不应该出现两个同名属性。
3.解析和序列化
(1)JSON.stringify可以把JSON对象转换成字符串(序列化),可以再带两个参数。如果第二个参数是字符串数组,则不在数组中的属性全部丢弃。如果第二个参数是函数,则把键和值回传给参数,经过函数处理,返回值作为键值;返回undefined,相应属性会被忽略。第三个参数是为转换完的字符串自动加入换行符和缩进符,参数表示缩进的空格数,最大10。
[javascript]
view plain
copy
//小实验
var
json={
"name"
:
"brain"
,
"sex"
:
"male"
,
"age"
:15
}
var
jsonText=JSON.stringify(json);
var
jsonText2=JSON.stringify(json,[
"name"
]);
var
jsonText3=JSON.stringify(json,
function
(key,value){
if
(key==
"sex"
){
if
(value==
"male"
){
return
0;
}
else
{
return
1;
}
}
else
if
(key==
"age"
){
return
;
}
else
{
return
value;
}
});
var
jsonText4=JSON.stringify(json,
null
,4);
console.log(jsonText);
//{"name":"brain","sex":"male","age":15}
console.log(jsonText2);
//{"name":"brain"}
console.log(jsonText3);
//{"name":"brain","sex":0}
console.log(jsonText4);
/*
{
"name": "brain",
"sex": "male",
"age": 15
}
*/
(2)使用eval会存在安全隐患,因为json中可能存在恶意代码。JSON.parse可以把字符串转换成json对象。parse可以再带一个参数。第二个参数是一个还原函数,传入key和value,返回值作为键的值放入结果对象。
[javascript]
view plain
copy
//小实验
var
jsonText=
'{"name":"brain","sex":"0","age":15}'
;
var
json1=JSON.parse(jsonText);
var
json2=JSON.parse(jsonText,
function
(key,value){
if
(key==
"sex"
){
if
(value==
"0"
){
return
"male"
;
}
else
{
return
"female"
;
}
}
else
{
return
value;
}
});
console.log(json1.sex);
//0
console.log(json2.sex);
//male
二、Ajax
1.Ajax是Asynchronous JavaScript And XML的缩写。可以理解为异步基于js的服务器通讯机制。但现在基本上没人把XML用作Ajax的数据结构,转而多使用JSON。
2.IE8+和标准浏览器,目前都支持XMLHttpRequest对象,简称XHR,用于完成Ajax整个过程。
(1)XHR.open()方法,做请求准备。可待三个参数:第一个表示请求类型,GET或POST;第二个请求地址,可以是具体的初级脚本文件,也可以是MVC中的路由地址;第三个表示是否异步发送请求(默认为true)。
(2)XHR.send()方法,发送数据。可带一个参数,即实际发送的数据体,一般为字符串。
(3)XHR.responseText属性,作为接收主体,从服务器得到的字符串。
(4)XHR.responseXML属性,从服务器得到的XML文档,前提是内容类型为“text/xml”或“application/xml”。
(5)XHR.status属性,响应的http状态,为数值。
(6)XHR.statusText属性,http状态的说明。
(7)XHR.onreadystatechange事件,只要status状态发生改变,就会触发这个事件,根据XHR.status的值确定通信是否完成。此事件必须在open前绑定,因为未调用open会改变status。
(8)XHR.abort方法,取消异步的通信。默认的XHR都是异步通讯,在通讯过程不会发生js阻塞,所以,同步通信很少使用。
(9)XHR.setRequestHeader(header,value)方法,设置http头部信息,不太常用,但必要时候很好用。
3.完整实例
[javascript]
view plain
copy
var
xhr=
new
XMLHttpRequest();
xhr.onreadystatechange=
function
(){
console.log(xhr.status+
":"
+xhr.statusText);
}
xhr.open(
"post"
,
"http://www.hostname.com"
);
xhr.send(
"?123"
);
4.load事件
(1)多数浏览器支持load事件:loadstart、progress、error、abort、load。这些事件加在一起,可以完全替代onreadystatechange。
(2)有些人使用这些load事件来异步加载js,而且用户体验更好。
三、跨域
1.跨域永远是资源共享不可回避的问题,但由于安全限制,Ajax默认是不支持跨域的。
2.IE的解决方法,提供了XDomainRequest类型实现跨域通信。用法和XHR差不多,但限制更严格,比如不能发送cookies、只能设置header的Content-Type、不能访问响应头信息、只支持get和post、只支持异步。
3.标准浏览器做法,在open的url中写入绝对地址。实验证明,现在已经不行了。
4.其他跨域技术
(1)图像ping,利用一些可以跨域的html标签的src属性,可以完成跨域。图像是动态创建img,使用这种方法,浏览器得不到任何数据,但能在URL中写入信息通过GET形式发送给服务器。通过监听load事件和error事件能知道响应是什么时候接收到的。
[javascript]
view plain
copy
//小实验
var
img=
new
Image();
img.οnlοad=
function
(){
console.log(
"loaded"
);
}
img.οnerrοr=
function
(){
console.log(
"error"
);
}
img.src=
"http://www.hostname.com"
;
(2)JSONP,JSONP是JSON的一种新方法,JSON with padding。
JSONP由两部分数据组成:回调函数和数据。典型的JSONP请求如http://hostname/json/?callback=handleResponse。而服务器回传的数据是这样的handleResponse({"name":"tom",age:25})。由于JSONP是有效的js代码,因此要利用script标签传动。
[javascript]
view plain
copy
//小实验
function
handleResponse(obj){
console.log(obj.name);
}
var
script=document.createElement(
"script"
);
script.src=
"http://hostname/json/?callback=handleResponse"
;
document.body.insertBefore(script,document.body.firstChild);
JSONP非常流行,能够直接访问响应文本,支持浏览器与服务器之间跨域双向通信。但不足是明显的:从其他域加载代码不安全;确定JSONP请求是否失败不太容易,不是所有浏览器都支持<script>标签的onerror事件。
(3)Comet,ajax是向服务器发请求,处理返回数据,通信是单向的。而Comet更加先进,能够让服务器推动信息给浏览器,实现了双向通信。
实现双向通信,一种方法是长短轮询,来伪造一个连接。第二种方式是http流,在页面整个声明周期内,使用一个http连接,服务器始终保持连接打开,周期性地向浏览器发送数据。目前的实现方法,是在服务器中写一个轮询(感觉换汤不换药,不可能像socket一样保持连接,那没有意义,也相当耗费资源)。Comet技术是通过XHR实现的,只要status变为3,就会接收状态就会改变,然后比较responseText的前后变化以获得新数据。
//服务器写法
[php]
view plain
copy
<?php
$i
=0;
while
(true){
echo
"$i;"
;
flush
();
//将cache中的数据发给浏览器
sleep(10);
$i
++
}
?>
(4)WebSockets,目标是在一个单独的持久连接上提供全双工、双向通信。WebSocket使用ws和wss(安全环境)做协议头。API和其他语言的socket没什么大区别。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/你好赵伟/article/detail/871184
推荐阅读
article
华为
OD
机试统一考试D卷C卷 - 符号运算(C++
Java
Java
Script
Python
)_...
给定一个表达式,求其分数计算结果。表达式的限制如下: 所有的输入数字皆为正整数(包括0) 仅支持四则运算(±*/)和括号...
赞
踩
article
【
JavaScript
逆向】
dy
滑块
纯算,底图还原,
captchaBo
dy
,轨迹算法,abogus...
本案例中所有内容仅供个人学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的...
赞
踩
article
【
JavaScript
逆向
】抖店
滑块
逆向
分析
_
抖音
captchabody
...
captchaBody 参数
逆向
分析
_
抖音
captchabody
抖音
captchabody
...
赞
踩
article
Chrome
ajax
302
问题_
chrome
中
js 获取
302
状态
码...
ECSHOP的后台每次删除一个商品都要报下面的错误Uncaught transport.js/parseResult()...
赞
踩
article
在
JavaScript
中实现数据加密与解密:Web
Cryptography
API
与 Cry...
本文详解了如何在
JavaScript
中使用 Web
Cryptography
API
和
CryptoJS
进行数据...
赞
踩
article
Office
.
js
是
Microsoft
Office
提供
的一套
JavaScript
API,...
此外,
Office
.
js
还
提供
了与
Office
365 服务的集成,如 OneDrive、Outlook 等,使得开...
赞
踩
article
JavaScript
split
()
方法
——如何在 JS 中将
字符串
拆分为数组_
js
split
...
通常,
字符串
string表示编程语言中的字符序列。让我们看一个使用字符序列创建的
字符串
示例,“Yes, You Can ...
赞
踩
article
【
JavaScript
】
事件
监听
:键盘
事件
_
监听
keyup
事件
...
本文章简单介绍一下,
JavaScript
里面的键盘
事件
。_
监听
keyup
事件
监听
keyup
事件
...
赞
踩
article
如何在
JavaScript
中对
字符
串
进行
索引
、拆分和操作_
js
字符
素引...
字符
串
是一个包含一个或多个
字符
的序列,可以由字母、数字或符号组成。
JavaScript
字符
串
中的每个
字符
都可以通过
索引
...
赞
踩
article
【
JavaScript
算法
】
栈
与队列:解决
括号
匹配
问题
...
在编程中,
括号
匹配
问题
是一类常见的
算法
题,通常用于验证
括号
的正确性,即检查
括号
是否成对出现且嵌套正确。
栈
(Stack)是...
赞
踩
article
vue
对象
继承
_深入
JavaScript
中
的
对象
以及
继承
原理...
javascript技术文章开发深入
JavaScript
中
的
对象
以及
继承
原理 ES6引入了一个很甜的语法糖就是 ...
赞
踩
article
ArcGIS
Maps
SDK
for
JavaScript
:
鼠标
进入面要素时改变
鼠标
指针样式,离开...
ArcGIS
Maps
SDK
for
JavaScript
鼠标
进入面要素时改变
鼠标
指针样式
ArcGIS
Maps
S...
赞
踩
article
ArcGIS
JSAPI
学习教程 -
ArcGIS
Maps
SDK for
JavaScript
...
本文详细介绍了
ArcGIS
Maps
SDKfor
JavaScript
从
4.5
到4.28版本的
引入
方法变化,包括普通Java...
赞
踩
article
ArcGIS
JSAPI
学习教程 -
ArcGIS
Maps
SDK
for
JavaScript
...
ArcGIS
JSAPI
学习教程 -
ArcGIS
Maps
SDK
for
JavaScript
不同版本4.8-4...
赞
踩
article
ArcGIS
Maps SDK
for
JS:使用
queryFeatures
方法查询 Feature...
使用
queryFeatures
方法执行属性和空间查询以获取
FeatureLayer
中符合条件的要素。_
arcgis
...
赞
踩
article
ArcGIS
Maps
SDK
for
JS(一):概述与使用_
arcgis
maps sdk fo...
本文主要内容:对
ArcGIS
Maps
SDK
for
JavaScript做了概述,以及如何使用
ArcGIS
Maps
...
赞
踩
article
ArcGIS
JSAPI 学习教程 -
ArcGIS
Maps
SDK
for
JavaScript
...
ArcGIS
JSAPI 学习教程 -
ArcGIS
Maps
SDK
for
JavaScript
- 框选显示
高亮
几...
赞
踩
article
ArcGIS
API
for
JavaScript
4.19 / 4.20 SDK 部署_arcgi...
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插...
赞
踩
article
ArcGIS
JSAPI 高级教程 -
ArcGIS
Maps
SDK for
JavaScript
...
ArcGIS
JSAPI 高级教程 -
ArcGIS
Maps
SDK for
JavaScript
- 锐化
效果
。_a...
赞
踩
article
ArcGIS
JSAPI 高级教程 -
ArcGIS
Maps
SDK for JavaScript...
ArcGIS
JSAPI 高级教程 -
ArcGIS
Maps
SDK for JavaScript - 添加
自定义
(G...
赞
踩
相关标签
华为od
c语言
c++
java
javascript
python
算法
爬虫
密码学
验证码
JavaScript 逆向
前端
开发语言
microsoft
word
数组
split
ecmascript
栈与队列