六、脚本化http( XMLHttpRequest)
超文本传输协议规定web浏览器如何从web服务器获取文档和向web服务器提交表单内容,以及web服务器如何应如何响应这些请求和提交。
Web浏览器会处理大量http。通常,http并不在脚本的控制下,只是当用户单击链接,提交表单和输入url时才发生。
Ajax描述了一种主要使用脚本操纵http和web服务器进行数据交换,不会导致页面重载。避免页面重载的能力使得web应用感觉更像传统的桌面应用。Web应用可以使用Ajax技术把用户的交互数据记录到服务器中,也可以开始只显示简单页面,之后按需要加载额外的数据和页面组件来提升应用的启动时间。
Comet是使用脚本操纵http的web应用架构相关的术语。某种意义上,comet和ajax相反。在Comet中,web服务器发起通信并异步发送消息到客户端。
在Ajax中,客户端从服务器拉数据,而在Comet中,服务器向客户端推数据。
<script>元素的src属性能设置url并发起http get请求。使用<script>元素实现脚本操纵http是非常吸引人的,因为他们可以
跨域通信二不受限制于同源策略。通常,使用基于<script>的ajax传输协议时,服务器的响应采用json编码的数据格式,当执行脚本时,javascript解析器能自动将其解码。由于它使用JSON数据格式,因此这种Ajax传输协议也叫做
“JSONP”.
虽然在<iframe>和<script>传输协议之上能实现Ajax技术,但通常还有更简单的方式。一段时间以来,所有浏览器都支持
XMLHttpRequest对象,它定义了用脚本操纵HTTP的API。除了常用的GET请求,还包含实现POST,HEAD等请求的能力,同时他能用文本或Document对象的形式返回服务器的响应。虽然它名字叫XMLHttpRequest API,但并没有限制只能使用xml文档,它能获取任何类型的文本文档。
使用XMLHttpRequest
1. 指定请求
浏览器在XMLHttpRequest类上定义了他们的HTTP API。这个类的每个实例都表示一个独立的请求/响应对,并且这个对象的属性和方法允许指定请求细节和提取响应数据。
Step0:创建对象 request
使用这个HTTP API必须做的第一件事就是实例化XMLHttpRequest对象:
Var request = new XMLHttpRequest();
记住,
每个实例表示一个独立的请求响应对,如果重用已存在的XMLHttpRequest,将会终止之前这个对象之前的任何请求。
Step1:指定请求 open()
创建XMLHttpRequest对象之后,发起HTTP请求的下一步是调用XMLHttpRequest对象的open()方法去指定这个请求的两个必须部分:方法和url。
Request.open(“GET”, // 开始一个http get请求
“data.csv”); // url,请求的地址
Open()的
第一个参数是指定http方法会或动作。这个字符串不区分大小写,但通常用大写字母匹配http协议。“get”和“post”方法是得到广泛支持的。Get用于常规请求,适合于当url完全指定请求资源,当请求对服务器
没有任何副作用以及当服务器的响应是可缓存的。POST方法常用语html表单,它在请求主体中包含额外的数据(表单数据),且这些数据常存储到服务器中(
副作用)。相同url的重复post请求从服务器得到的响应可能不同,同时不应该缓存使用这个方法的缓存。
除了get和post之外,XMLHttpRequest规范也允许把delete,head,options和put作为open()的第一个参数。
Open的
第二个参数是url,它是请求的主体。这是相对于包含open()脚本的document的url。如果指定绝对url,协议,主机和端口号通常必须匹配所在文档的对应内容,
跨域的请求通常会报错。
Open的
第三个参数是布尔值,代表请求是同步还是异步,默认为true,是异步的,设为false代表同步的。设成异步的就不要给XMLHttpRequest设置readystatechange事件响应函数了,直接可以取得响应消息。但是,客户端javascript是单线程的,这样会导致阻塞,整个浏览器UI冻结,谨慎使用。
Step3:设置请求头 ,setRequestHeader()
如果有请求头的话,请求进程的下一步就是设置它,如post请求需要“Content-Type”指定请求主体的MIME类型:
Request.setRequestHeader(“Content-Type”, “text/plain”);
如果对相同的头调用setRequestHeader()多次,新值不会取代之前指定的值,相反,http请求将包含这个头的多个副本或这个头将指定多个值。
不能自己指定“Content-Length”,”Date”,”Refer”或”User-Agent”头,XMLHttpRequest将自己添加这些头防止伪造他们。类似地,XMLHttpRequest对象自动处理cookie,连接时间,字符集和编码判断,程序员无法向setRequestHeader()传递这些头:
如果请求一个受密码保护的url,把用户名和密码作为
第四个和第五个参数传递给open。
Step4: 发送请求 send()
使用XMLHttpRequest发起http请求的最后一步是指定可选的请求主体并向服务器发送它。
Request.send(null);
Get请求绝对没有主体。所以应该传递null或省略这个参数。
POST请求通常拥有主体,同时它应该匹配用setRequestHeader指定的“Content-Type”头。
顺序问题:
http请求的各部分有指定顺序,请求方法和url先到达,然后是请求头,最后是请求主体。XMLHttpRequest实现通常直到调用send()方法才开始启动网络,但顺序必须匹配,如setRequestHeader必须在open之后和send之前,否则将抛出异常。
2. 取得响应
一个完整的http响应由状态码,响应头集合和响应主体责成,这些都可以通过XMLHttpRequest对象的属性和方法获得。
1) status和statusText属性以数字和文本的形式返回http状态码。
2) 使用getResponseHeader()和getAllResponseHeaders()能查询响应头。
3) 响应主体可以从responseText属性中得到文本形式的,从responseXML属性中得到Document形式的(它实际对XHtml和xml文档都有效)。
XMLHttpRequest通常异步使用,发送请求后,send()方法立即返回,知道响应返回勤勉列出的响应方法和属性才有效。为了在响应准备就绪时得到通知,必须监听XMLHttpRequest对象上的readystatechange事件,对应readyState属性的变化。
readyState是一个整数,指定了http请求的状态,为4时代表响应完全返回。
为了监听
readystatechange事件,把事件处理函数设置为XMLHttpRequest对象的
onreadystatechange属性。
1. 响应解码
前面我们假设服务器使用像“text/plain”,”text/html”或“text/css”这样的MIME类型发送文本响应,然后我们使用
XMLHttpRequest对象的responseText属性得到它。
但是还有其他方式来处理服务器响应。如果服务器发送xml或xhtml文档作为响应,能通过
responseXml属性获得一个解析形式的xml文档。这个属性的值是一个document对象,可以使用前面介绍的技术搜索和遍历操作。
如果服务器想发送诸如对象或数组这样的结构化数据作为响应,应该传输
JSON编码(“application/json”)的字符串数据。接收它时,可以把responseText属性传递给JSON.parse()。
如果期望响应的类型是”application/javascript”或”text/javascript”,这种情况下不需要使用XMLHttpRequest对象,因为<script>本身完全可以实现加载并执行脚本。而且,
<script>可以发起跨域http请求,而XMLHttpRequest API则禁止。
Web服务器端通常使用二进制数据(如图片,文件)响应http请求,responseText属性只能用于文本。目前还没有一个统一各浏览器处理的成熟方法,可以参考:
http://stackoverflow.com/questions/4376657/is-there-any-way-to-send-binary-data-with-xmlhttprequest-object
服务器响应的正常解码是假设服务器为这个响应发送了“Content-Type”头和正确的MIME类型。
2. 编码请求主体
HTTP POST请求包括一个请求主体,它包含客户端传递给服务器的数据。
3.1 表单编码的请求
当用户提交html表单时,表单中的数据(每个表单元素的名字和值,因此也要求表单元素必须有name和value属性)编码到一个字符串中并随请求发送。默认情况下,html表单通过post方法发送给服务器,而编码后的表单数据则用作请求主体。编码方法是:对每个表单元素的名字和值执行普通的url编码(使用十六进制转移码替换特殊字符),使用等号把编码后的名字和值分开,并使用”&”分开名/值对。如:
Find=pizza&zipcode=2323&radius=1km
表单编码格式有一个正式的MIME类型:
application/x-www-form-urlencoded
当使用post方法提交这种顺序的表单数据时,必须设置“Content-Type”为这个值。
表单数据同样可以通过GET请求来提交,当知识为了执行只读查询,get请求比post请求更合适。
3.2 JSON编码的请求
Html form并不是http提交的必须类型,现在作为web交换格式的JSON已经得到普及,可以使用JSON.stringify()对请求主体编码。
3.3 Multipart/form-data请求
当html表单同时包含文件上传元素和其他元素时,浏览器不能使用普通的表单编码而必须使用称为”multipart/form-data”的特殊content-Type来用post方法提交。这种编码使用长边界字符串把请求主体分离成多个部分,对于文本数据,手动创建”multipart/form-data”请求主体是可能的,但很复杂。
XHR2定义了新的FormData api,容易实现多部分请求主体。首先,使用构造函数创建FormData对象,然后按需多次调用对象的append()方法把各部分添加到请求中,最后,把FormData对象传递给send()方法。
3. 中止请求和超时abort
可以通过调用XMLHttpRequest对象的abort()方法来取消正在进行的http请求。Abort()方法在所有的XMLHttpRequest版本和XHR2中可用,调用方法时触发abort事件。
4. 跨域http请求
作为同源策略的一部分,XMLHttpRequest对象通常仅可以发起和文档具有相同服务器的http请求。这个限制关闭了安全漏洞,但阻止了大量合适使用的跨域请求。可以在<form>和<iframe>中使用跨域url,而浏览器显示最终的跨域文档,但浏览器不允许原始脚本查找跨域文档的内容。使用XMLHttpRequest,文档内容都是通过responseText属性暴露,所以同源策略不允许XMLHttpRequest进行跨域请求。因此,<script>也取代了XMLHttpRequest成为主流Ajax传输协议。
借助<script>发送http请求:JSONP
只需设置<script>元素的src属性(加入它还没插入到document中,需要插入进去),然后浏览器会发送一个请求以下载src属性所指向的url。使用<script>元素进行Ajax传输的一个主要原因是,它不受同源策略的影响,因此可以使用它们从其他的服务器请求数据,第二个原因是包含JSON编码数据的响应体会自动解码(即执行)。
这种使用<script>元素作为Ajax传输的技术称为JSONP,若http请求所得到的响应数据时经过json编码的,则适合使用该技术。
当通过<script>元素调用数据时,响应内容必须用javascript函数名和
圆括号包裹起来,而不是发送这样一段JSON数据:
[1, 2, {“buckle”:”my shoe”}]
应该发送这样一个包裹后的JSON响应:
handleResponse(
[1, 2, {“buckle”:”my shoe”}]
)
包裹后的响应会成为<script>元素的内容,它先判断JSON编码后的数据(毕竟是一个javascript表达式),然后把它传递给handleResponse()函数。
为了可行起见,我们必须通过某种方式告诉服务,它正在从一个<script>元素调用,必须返回一个JSONP响应,而不是普通的JSON响应。这个可以通过在URL中添加一个查询参数实现,例如追“?jsonp”(或“&jsonp”)。
在实践中,支持JSONP的服务不会强制指定客户端必须实现的回调函数名称,比如handleResponse。相反,他们使用查询参数的值,
允许客户端指定一个函数名(如:?jsonp=callback)。
还可以参考:
http://www.w3cmm.com/ajax/jsonp.html
http://www.cnblogs.com/jkswjw/p/3173758.html
- 大小: 23.7 KB
- 大小: 89.7 KB
- 大小: 38.5 KB
分享到:
相关推荐
<br>Opera 9.1 3196ms 326ms 980% <br>Average improvement: 867% <br><br>下表为jQuery1.1.3与常用的一些JS库选择器的对比:<br>Browser Prototype jQuery Mootools Ext Dojo <br>IE 6 1476ms 661ms 1238ms 672ms ...
2. 布局元素:使用`<header>`、`<nav>`、`<section>`、`<article>`、`<aside>`和`<footer>`等语义化标签来组织页面内容,使页面结构清晰且利于SEO。 3. 内容展示:`<h1>`至`<h6>`用于标题,`<p>`用于段落,`<img>`...
4. 文本格式化:`<strong>`和`<em>`分别用于加粗和斜体;`<code>`用于展示代码片段;`<pre>`保留文本格式,常用于显示代码块。 5. 链接:`<a>`标签创建超链接,`href`属性定义目标URL,`target`属性指定链接打开...
2. 文本格式化标签:如`<h1>`至`<h6>`(标题)、`<p>`(段落)、`<b>`和`<i>`(粗体和斜体)、`<em>`和`<strong>`(强调和重要性)等。 3. 链接标签:`<a>`用于创建链接,可以跳转到其他页面或资源。 4. 图像标签:`...
6. **语义化**:现代HTML强调语义化,比如使用`<main>`、`<figure>`、`<figcaption>`等标签,提高内容的可读性和可访问性,有利于搜索引擎优化(SEO)和辅助技术(如屏幕阅读器)的使用。 7. **外部资源引用**:...
此外,`<div>`和`<span>`作为布局和样式控制的容器元素,它们在页面结构化中起到关键作用。 了解HTML的同时,我们不能忽视与之紧密相关的CSS。CSS用于控制网页的样式和布局,使我们能够实现颜色、字体、间距、大小...
6. **DOM(文档对象模型)**:DOM是HTML和XML文档的结构化表示,允许通过JavaScript或其他脚本语言动态操作网页内容。通过DOM,可以添加、删除或修改元素,实现交互性和动态效果。 7. **事件处理**:HTML与...
`<id>`代表照片的唯一标识,`<title>`是照片的标题,`<description>`提供了详细描述,`<date>`记录了拍摄日期,`<location>`指明了地点,而`<thumbnail>`和`<fullimage>`分别存储了缩略图和原图的URL或路径。...
2. 标签使用:如`<head>`, `<body>`, `<h1>`, `<p>`, `<a>`等,以及语义化标签如`<header>`, `<nav>`, `<section>`等。 3. 图片和链接:如何插入图片`<img>`,创建链接`<a>`。 4. 表格与列表:`<table>`,`<tr>`, `...
此外,`<section>`、`<article>`和`<header>`等语义化元素,有助于搜索引擎优化和无障碍访问。 JavaScript(简称JS)是与HTML紧密相关的脚本语言,常用于增加网页的交互性。它可以操作DOM(文档对象模型),改变...
每个`<photo>`元素内可以包含图片的文件名(`<filename>`)、大小(`<size>`)、上传日期(`<uploadDate>`)和描述(`<description>`)等信息。 为了实现这个功能,开发者通常会使用前端技术(如HTML、CSS和...
Do While ie.Busy Or ie.ReadyState <> READYSTATE_COMPLETE DoEvents Loop Set htmlDoc = ie.Document title = htmlDoc.getElementsByTagName("title")(0).innerText ``` 2. **使用XMLHttpRequest对象**: ...
3. **遍历XML节点**:在解析完XML文档后,遍历`<employee>`元素,提取数据并创建新的表格行(`<tr>`)和单元格(`<td>`)。 ```javascript let employeeList = xmlDoc.getElementsByTagName("employee"); let ...
str += "<tr><td>" + lie[0] + "</td><td>" + lie[1] + "</td><td>" + lie[2] + "</td><td>" + lie[3] + "</td><td>" + lie[4] + "</td><td><input type='button' class='shanchu' code='" + lie[0] + "' /></td></...
2. **语义化标签**:为了提高可读性和可访问性,HTML5引入了许多语义化的标签,如<header>、<nav>、<section>、<article>和<footer>等。这些标签有助于搜索引擎理解页面内容,同时对屏幕阅读器用户友好。 3. **表格...
6. **HTML5新增元素**:HTML5引入了更多语义化元素,如`<header>`、`<footer>`、`<section>`和`<article>`,提高了网页的可读性和可访问性。 **JavaScript语法** JavaScript是一种脚本语言,负责网页的动态效果和...
头部<head>包含元数据,如标题、样式表链接和脚本引用;主体<body>则包含网页的实际内容。 2. **HTML标签**:HTML标签用于定义网页元素,如<h1>到<h6>定义标题,<p>定义段落,<a>定义超链接,<img>插入图像,<ul>和...
\n\n2.3 HTML链接、图像和表格\n- `<a>`标签用于创建超链接,如`<a href="http://example.com">链接文本</a>`。\n- `<img>`标签插入图像,如`<img src="image.jpg" alt="图片描述">`。\n- `<table>`元素用于创建表格...
可以使用表格元素`<table>`,以及行`<tr>`和单元格`<td>`来组织课程信息: ```html <table id="courseTable"> <tr> <th>课程名称</th> <th>教师</th> <th>时间</th> </tr> <!-- 动态生成的课程行... --> </...