prototype的Ajax介绍
ajax流程
ajax流程
Ajax全称为Asynchronous JavaScript and XML,即异步JavaScript和XML。
它是一种大多数时候使用JavaScript和XML技术异步获取数据的方法。
Ajax的主要目的是,通过异步数据交换,使Web应用程序不需要重新加载页面,从而实现更快,更动态的用户体验。
Ajax流程的基本步骤如下:
1. 用户在浏览器端发送HTTP请求。
2. 这个HTTP请求会发送一些参数,这些参数告诉服务器需要获取哪些数据。
3. 服务器收到请求后,会解析它,并且返回一个响应。
4. 响应包含XML数据或者JSON数据。
XML是可扩展的标记语言,JSON是JavaScript 对象记号,是一种轻量级的数据交换格式
5. 通过JavaScript,浏览器会处理这个响应。
6. 然后,通过使用DOM,JavaScript会更新当前页面,展示刚刚获取的数据。
而在具体实现的过程中,Ajax流程通常可以被拆分成两个高层次的部分:
通常,在Ajax流程中,浏览器需要执行以下原语:
1. 创建一个XMLHttpRequest对象。
2. 配置请求(比如,请求后的操作)。
3. 发送请求并且获取响应。
4. 处理响应。
通过Ajax,我们可以在不刷新整个页面的情况下获得更好的用户体验,加快数据的传输速度,提高页面的性能,从而使Web应用程序更具高效性和易用性。
ASP Prototype框架概述
ASP Prototype框架概述Prototype框架是一个基于客户端的Ajax框架,其实质就是将客户端常用的Aj ax代码,如创建XMLHttpRequest对象这些重复性代码,使用面向对象的方式进行封装,封装成一个js文件。
Prototype框架使用过程,只需要调用相应的对象,而不必关系其具体的实现细节。
从这方面说,Prototype是一个基础的JavaScript应用框架,Prototype的目的是为了更方便的开发JavaScript的应用,使用它可以更加方便简单的使用JavaScript 编程,开发出面向对象的JavaScript程序,Prototype框架是JavaScript代码的自然扩展,更容易被人接受。
但是,Prototype是最受欢迎的AJAX框架之一。
比较著名的网站2006年的调查结果显示,Prototype同框架规模庞大的Yahoo! User Interface,Goog le Web Toolkit,and Atlas.等相比较起来,其排名竟然遥遥领先,这不能不令人感到惊异。
答案很简单:Prototype使用起来就像是对于JavaScript语言的自然扩展。
尝试过Prototype框架后,笔者几乎坚信Prototype框架应该被纳入JavaScript语言。
Prototype中包含了一个功能强大好用的Ajax框架,Prototype是一个基础性的框架,很多更高层次的框架都以它为基础,例如scriptaculous效果库。
Prototype框架以面向对象的方式封装JavaScript代码,其封装文件为prototype. js。
使用prototype.js可以大大简化客户端代码的开发工作。
prototype.js引入了类的概念,用其编写的类可以定义一个initialize的初始化函数,在创建类实例的时候会首先调用这个初始化函数。
正如其名字,prototype.js的核心还是prototype ,虽然提供了很多可复用的代码,但没有从根本上解决JavaScript的开发和维护问题。
JSP Ajax Ajax框架概述
JSP Ajax Ajax框架概述在使用JavaScript、XML、DOM等技术编写Ajax页面时,我们需要考虑很多问题,如针对不同的浏览器,需要使用不同的方式创建XMLHttpRequest对象,以达到在所有的浏览器都能够浏览演示。
编写一个Ajax案例,如果还是采用以前的A jax设计方法,不可以避免的要产生大量的重复性代码,如每个Ajax页面都需要创建XMLHttpRequest对象,对XML文件的处理方式等。
编写Ajax页面的大量时间浪费在这些重复性的代码上,显然有点不划算。
这些情况对一个优秀的程序员来说,根本不是问题。
我们可以把这些重复性的代码,多次需要调用的代码,以面向对象的方式封装到一个文件里面,如创建XMLHttpReq uest对象。
把重复性、关键性代码封装起来,能够达到代码重复重用的目的,能够很好的维护程序和调试程序。
把重复性代码封装起来,做出独立的文件,这里文件的扩展名为.js。
利用这些封装JavaScript文件可以形成自己的代码库,进而形成属于自己的框架。
创建属于自己的Ajax代码库,会花费大量的时间,并且还需要时刻注意代码库的Bug并进行修正。
对于个人来说,还不如使用一些现成的Ajax框架,毕竟这些框架是经过优秀程序员创建和大量的用户测试。
从Ajax诞生以来,人们就发现使用Ajax框架可以带来极大的方便,节省了大量的时间和精力。
于是,大量的Ajax框架诞生了,Ajax框架很多,几乎每月都要产生一些新的框架。
有些框架基于客户端,有些基于服务器端;有些专门为特定语言设计,如Java。
另外还有一些与语言无关。
其中绝大部分都是开源的,但也有少数是专用的。
经过Ajax框架的发展,一些框架已经逐渐被淘汰,一些框架被保留了下来。
Ajax框架由于代码库封装代码的不同,可以分为基于浏览器的Ajax框架和基于服务器端的Ajax框架。
基于服务器端框架可以划分两种形式,分别为HTML/JS Generation(HTML/JS生成)和远程交互。
Vue--axios:vue中的ajax异步请求(发送和请求数据)、vue-resourc。。。
Vue--axios:vue中的ajax异步请求(发送和请求数据)、vue-resourc。
跨域原理:⼀.使⽤axios发送get请求1 <!DOCTYPE html>2 <html lang="en">3 <head>4 <meta charset="UTF-8">5 <meta name="viewport" content="width=device-width, initial-scale=1.0">6 <meta http-equiv="X-UA-Compatible" content="ie=edge">7 <title>Document</title>8 <script src="../vue2.4.4.js"></script>9 <script src="../axios.js"></script>1011 </head>1213 <body>14 <!-- 定义⼀个vue的管理区块,(MVVM中的View) -->15 <div id="app">16 <button @click="getApiData">点击得到数据</button>17 {{name}}18 </div>1920 </body>2122 <script>2324// 实例化vue对象(MVVM中的View Model)25new Vue({26// vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析27 el:'#app',28 data:{29// 数据(MVVM中的Model)30 name:""31 },32 methods:{33 getApiData:function() {34//设置请求路径35var url = "http://157.122.54.189:9093/api/getprodlist";36// 发送请求:将数据返回到⼀个回到函数中37 _this= this;38// 并且响应成功以后会执⾏then⽅法中的回调函数39 axios.get(url).then(function(result) {40// result是所有的返回回来的数据41// 包括了响应报⽂⾏42// 响应报⽂头43// 响应报⽂体44 console.log(result.data.message[0]);45 _ = result.data.message[0].name;46 });47 }48 }49 })50 </script>51 </html>⼆.使⽤axios发送post请求1 <!DOCTYPE html>2 <html lang="en">3 <head>4 <meta charset="UTF-8">5 <meta name="viewport" content="width=device-width, initial-scale=1.0">6 <meta http-equiv="X-UA-Compatible" content="ie=edge">7 <title>Document</title>8 <script src="../vue2.4.4.js"></script>9 <script src="../axios.js"></script>1011 </head>1213 <body>14 <!-- 定义⼀个vue的管理区块,(MVVM中的View) -->15 <div id="app">16 <button @click="postApiData">点击提交数据</button>17 </div>1819 </body>2021 <script>2223// 实例化vue对象(MVVM中的View Model)24new Vue({25// vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析26 el:'#app',27 data:{28// 数据(MVVM中的Model)29 },30 methods:{31 postApiData:function() {32var url = "http://157.122.54.189:9093/api/addproduct";33// post有两个参数34//参数1:请求的路径35//参数2:提交的参数36//提交参数的两种形态:37// 1.可以直接传⼊字符串 name=张三&age=1938// 2.可以以对象的形式传⼊{name:"三",age:19}39 axios.post(url,{name:"拖油瓶前来报道"}).then(function(res) {40var resData = res.data;41if(resData.status == "0") { //0表⽰成功,1表⽰失败42 alert(resData.message);43 }else{44 alert(resData.message);45 }46 });4748 }49 }50 })51 </script>52 </html>三.使⽤axios发送post或get请求细节处理1 <!DOCTYPE html>2 <html lang="en">3 <head>4 <meta charset="UTF-8">5 <meta name="viewport" content="width=device-width, initial-scale=1.0">6 <meta http-equiv="X-UA-Compatible" content="ie=edge">7 <title>Document</title>8 <script src="../vue2.4.4.js"></script>9 <script src="../axios.js"></script>1011 </head>1213 <body>14 <!-- 定义⼀个vue的管理区块,(MVVM中的View) -->15 <div id="app">16 <button @click="getApiData">点击得到数据</button>17 <button @click="postApiData">点击提交数据</button>18 {{name}}1920 </div>2122 </body>2324 <script>25//细节处理⼀:可以给axios的ajax请求设置统⼀的主机和端⼝号26 axios.defaults.baseURL = "http://157.122.54.189:9093/";27//细节处理⼆: 可以将axios这个对象添加到Vue的原型对象中,将来在使⽤的时候就只需要使⽤this.对象名就可以了28 Vue.prototype.$http = axios;293031// 实例化vue对象(MVVM中的View Model)32new Vue({33// vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析34 el:'#app',35 data:{36// 数据(MVVM中的Model)37 name:""38 },39 methods:{40 getApiData:function() {41//设置请求路径42var url = "api/getprodlist";43// 发送请求:将数据返回到⼀个回到函数中44 _this= this;45// 并且响应成功以后会执⾏then⽅法中的回调函数46this.$http.get(url).then(function(result) {47// result是所有的返回回来的数据48// 包括了响应报⽂⾏49// 响应报⽂头50// 响应报⽂体51 _ = result.data.message[0].name;52 }).catch(function(){53 alert("出错了");54 });55 },5657 postApiData:function() {58var url = "api/addproduct";59// post有两个参数60//参数1:请求的路径61//参数2:提交的参数62//提交参数的两种形态:63// 1.可以直接传⼊字符串 name=张三&age=1964// 2.可以以对象的形式传⼊{name:"三",age:19}65this.$http.post(url,{name:"拖油瓶前来报道3 "}).then(function(res) { 66var resData = res.data;67if(resData.status == "0") { //0表⽰成功,1表⽰失败68 alert(resData.message);69 }else{70 alert(resData.message);71 }72 }).catch(function(){73 alert("出错了");74 }); ;7576 }77 }78 })79 </script>80 </html>四.使⽤axios完成品牌管理1 <!DOCTYPE html>2 <html lang="en">34 <head>5 <meta charset="UTF-8">6 <meta name="viewport" content="width=device-width, initial-scale=1.0">7 <meta http-equiv="X-UA-Compatible" content="ie=edge">8 <title>Document</title>9 <style>10 #app {11 width: 600px;12 margin: 10px auto;13 }1415 .tb {16 border-collapse: collapse;17 width: 100%;18 }1920 .tb th {21 background-color: #0094ff;22 color: white;23 }2425 .tb td,26 .tb th {27 padding: 5px;28 border: 1px solid black;29 text-align: center;30 }3132 .add {33 padding: 5px;34 border: 1px solid black;35 margin-bottom: 10px;36 }37 </style>38 <script src="../vue2.4.4.js"></script>39 <script src="../axios.js"></script>40 </head>4142 <body>43 <div id="app">44 <div class="add">45品牌名称: <input v-model="name" type="text">46 <button @click="add">添加</button>47 </div>48 <div class="add">品牌名称:<input type="text"></div>49 <div>50 <table class="tb">51 <tr>52 <th>编号</th>53 <th>品牌名称</th>54 <th>创⽴时间</th>55 <th>操作</th>56 </tr>57 <tr v-if="list.length <= 0">58 <td colspan="4">没有品牌数据</td>59 </tr>60 <!--加⼊: key="index" 时候必须把所有参数写完整 -->61 <tr v-for="(item,key,index) in list" :key="index">62 <td>{{item.id}}</td>63 <td>{{}}</td>64 <td>{{item.ctime}}</td>65 <td><a href="#" @click="del(item.id)">删除</a></td>66 </tr>67 </table>68 </div>6970 </div>71 </body>7273 </html>7475 <script>76// 1 将所有的主机名和端⼝⼀起设置77 axios.defaults.baseURL = "http://157.122.54.189:9093";78// 2 将axios添加到Vue的原型对象中79 Vue.prototype.$http = axios;8081var vm = new Vue({82 el: "#app",83 data: {84 name: '',85 list: [] // 数据应该来源于服务器提供的api86 },87 mounted:function() { //钩⼦函数88this.getList();89 },90 methods: {91// 得到所有的列表数据,这个⽅法应该等页⾯加载完成以后直接被调⽤的92 getList:function() {93var url = "/api/getprodlist";94// 改变this的指向95 _this = this;96this.$http.get(url).then(function(result){97var res = result.data;98if(res.status == 0) {99//将数据赋值给list100 _this.list = res.message;101 }else{102 alert("出错了");103 }104 }).catch(function(){105 alert("出错了");106 });107 },108// 得到⽂本框中的值,并且将值通过api提交到服务器109 add:function() {110var url = "/api/addproduct";111 _this = this;112// 得到name属性对应的值113this.$http.post(url,{"name":}).then(function(result){114var res = result.data;115if(res.status == "0") {116 alert(res.message);117 _this.getList();118 }else{119 alert(res.message);120 }121 }).catch(function() {122 alert("出错了");123 });124 },125 del:function(id){126//格局id删除数据127var url = "/api/delproduct/"+id;128// 发送异步请求129 _this = this;130this.$http.get(url).then(function(result){131var res = result.data;132if(res.status == "0") {133 alert(res.message);134//更新数据135 _this.getList();136 }else{137 alert(res.message);138 }139140 }).catch(function(){141 alert("出错了");142 });143 }144 }145 });146147 </script>五.使⽤vue-resource发送异步请求(包含get和post请求)两个js⽂件⼀定要按照顺序加载1 <!DOCTYPE html>2 <html lang="en">3 <head>4 <meta charset="UTF-8">5 <meta name="viewport" content="width=device-width, initial-scale=1.0">6 <meta http-equiv="X-UA-Compatible" content="ie=edge">7 <title>Document</title>8 <script src="../vue2.4.4.js"></script>9 <script src="../vue-resource.js"></script>1011 </head>1213 <body>14 <!-- 定义⼀个vue的管理区块,(MVVM中的View) -->15 <div id="app">16 {{name}}17 </div>1819 </body>2021 <script>2223// 实例化vue对象(MVVM中的View Model)24new Vue({25// vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析26 el:'#app',27 data:{28// 数据(MVVM中的Model)29 name:""30 },31 methods:{3233 },34 created:function() {35// 发送请求到服务器加载数据36//vue-resource发送get请求37/* this.$http.get("http://157.122.54.189:9093/api/getprodlist").then(function(result){38 //得到响应的内容39 var res = result.body;40 = res.message[0].name;41 });42*/43//vue-resource发送post请求44this.$http.post("http://157.122.54.189:9093/api/addproduct",{"name":"⼩明"}).then(function(result){ 45var res = result.body;46 alert(res.message);47 });48 }49 })50 </script>51 </html>六.使⽤vue-resource来实现跨域1 <!DOCTYPE html>2 <html lang="en">3 <head>4 <meta charset="UTF-8">5 <meta name="viewport" content="width=device-width, initial-scale=1.0">6 <meta http-equiv="X-UA-Compatible" content="ie=edge">7 <title>Document</title>89 <script src="../vue2.4.4.js"></script>10 <script src="../vue-resource.js"></script>11 </head>1213 <body>14 <!-- 定义⼀个vue的管理区块,(MVVM中的View) -->15 <div id="app">1617 </div>1819 </body>2021 <script>2223// 实例化vue对象(MVVM中的View Model)24new Vue({25// vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析26 el:'#app',27 data:{28// 数据(MVVM中的Model)29 },30 mounted:function() {31var url = "http://157.122.54.189:9093/jsonp";32//在vue-resources中会⾃动在路径上加⼊callback的函数名,得到的结果就是result33this.$http.jsonp(url).then(function(result){34var res = JSON.parse(JSON.parse(result.body));35 console.log(res.message);36 });37 }38 })39 </script>40 </html>。
Ajax技术简介及GWT技术介绍 ppt课件
Ajax技术简介及GWT技术 介绍
GWT-Ext是一个基于 GWT和ExtJs开发的 Web界面组件库。组件 包括:具有排序、分页 和过滤功能的Grid,支 持拖放操作的Tree,能 够灵活配置的 ComboBoxes、Tab Panels、Menus & amp; Toolbars、 Dialogs、Forms等等。
交互; • 使用XMLHttpRequest与服务器进行异步通信; • 使用JavaScript绑当前开发web应用的非常热门的技术,也 是Web 2.0的一个重要的组成部分。然而如果用传统 的方式Javascript进行Ajax开发的话,就会使得应用 程序非常难以进行调试,从而降低了生产效率。 Google最近推出的GWT有望为我们解决这个难题, GWT是一个开发Ajax应用的框架,它使程序员用Java 同时开发客户端和服务器端的代码。GWT的编译器会 把用于开发客户端的Java代码转化成Javascript和 Html,而程序员不用关心这一转换过程。这样程序员 就可以在自己喜欢的Java IDE里面开发自己的Ajax应 用程序。
• 两套 Java 类库
Ajax技术简介及GWT技术 介绍
• HostMode(宿主模式):未编译前,在GWT 提供的Host Mode的浏览器中查看。可以用于 调试GWT程序,会打出异常位置。
• WebMode:编译后,在浏览器中查看。
• Ajax的核心是JavaScript对象XmlHttpRequest。 XmlHttpRequest处理所有服务器通信的对象,是一 种支持异步请求的技术。
• XmlHttpRequest可以使用JavaScript向服务器提出请 求并处理响应,而不阻塞用户。
Ajax技术简介及GWT技术 介绍
axios的理解和使用axios.create(对axios请求进行二次封装)拦截器取消请。。。
axios的理解和使⽤axios.create(对axios请求进⾏⼆次封装)拦截器取消请。
axios 的理解和使⽤ axios.create(对axios请求进⾏⼆次封装) 拦截器取消请求(axios.CancelToken)原⽂链接:⽬录axios是什么1. 前端最流⾏的 ajax请求库2. react/vue官⽅推荐使⽤axios发ajax请求3. ⽂档axios特点1. 基于promise的异步ajax请求库2. 浏览器端/node端都可以使⽤3. ⽀持请求/响应拦截器4. ⽀持请求取消5. 请求/响应数据转换6. 批量发送多个请求axios常⽤语法nam valueaxios(config)通⽤/最本质的发任意类型请求的⽅式axios(url[,config])可以只指定url发get请求axios.request(config)等同于axios(config)axios.get(url[,config])发get请求axios.delete(url[,config])发delete请求axios.put(url[,data,config])发put请求nam valueaxios.defaults.xxx请求⾮默认全局配置e()添加请求拦截器e()添加响应拦截器axios.create([config])创建⼀个新的axios(他没有下⾯的功能)axios.Cancel()⽤于创建取消请求的错误对象axios.CancelToken()⽤于创建取消请求的token对象axios.isCancel()是否是⼀个取消请求的错误axios.all(promise)⽤于批量执⾏多个异步请求axios安装npm install axios1vue项⽬使⽤在main.jsimport axios from 'axios'Vue.prototype.$ajax = axios12html 直接导⼊就⾏了<script src="https:///axios/0.19.0/axios.js"></script>1axios简单使⽤默认get请求// 配置默认基本路径axios.defaults.baseURL = 'http://localhost:3000'// 默认get请求axios({url:"/posts",params:{id:1}}).then(res=>{console.log(res)},err=>{console.log(err)})post// post请求axios.post("/posts",{id:1}).then(res=>{},err=>{console.log(err)})// 或axios({url:"/posts",method:'post'data:{id:1}}).then(res=>{console.log(res)},err=>{console.log(err)})putaxios.put("/posts/4",{"title": "json-server---1", "author": "typicode",}).then(res=>{console.log(res)},err=>{console.log(err)})// 或axios({url:"/posts",method:'put 'data:{"title": "json-server---1", "author": "typicode",}}).then(res=>{console.log(res)},err=>{console.log(err)})deleteaxios.delete("/posts/4",{"title": "json-server---1", "author": "typicode",}).then(res=>{console.log(res)},err=>{console.log(err)})// 或axios({url:"/posts",method:'delete'data:{id:1}}).then(res=>{console.log(res)},err=>{console.log(err)})axios难点语法axios.create(config) 对axios请求进⾏⼆次封装1. 根据指定配置创建⼀个新的 axios ,也就是每个axios 都有⾃⼰的配置2. 新的 axios 只是没有取消请求和批量请求的⽅法,其它所有语法都是⼀致的3. 为什么要这种语法?1. 需求,项⽬中有部分接⼝需要的配置与另⼀部分接⼝的配置不太⼀样2. 解决:创建2个新的 axios ,每个都有⾃⼰的配置,分别对应不同要求的接⼝请求中简单使⽤const instance = axios.create({baseURL:"http://localhost:3000"})// 使⽤instance发请求instance({url:"/posts"})// 或instance.get("/posts")同时请求多个端⼝号const instance = axios.create({baseURL:"http://localhost:3000"})const instance2 = axios.create({baseURL:"http://localhost:4000"})// 同时请求端⼝号 3000 4000// 使⽤instance发请求instance({url:"/posts"})// 使⽤instance2发请求instance2({url:"/posts"})axios的处理链流程拦截器拦截器简单使⽤// 添加请求拦截器e(config=>{// config 请求配置console.log("请求拦截器")return config},err=>{return Promise.reject(err)})// 添加响应拦截器e(res=>{// res 响应结果console.log("响应拦截器")return Promise.reject(err)})console.log("开始请求")axios.get("http://localhost:3000/posts") .then(res=>{console.log("res:",res)console.log("请求结束")})多个拦截器请求拦截器后添加先执⾏// 添加请求拦截器e(config=>{ console.log("请求拦截器")return config},err=>{return Promise.reject(err)})e(config=>{ console.log("请求拦截器--------2")return config},err=>{return Promise.reject(err)})e(config=>{ console.log("请求拦截器--------3")return config},err=>{return Promise.reject(err)})// 添加响应拦截器e(res=>{ console.log("响应拦截器")return res},err=>{return Promise.reject(err)})e(res=>{ console.log("响应拦截器---------2")return res},err=>{return Promise.reject(err)})e(res=>{ console.log("响应拦截器----------3")return res},err=>{return Promise.reject(err)})console.log("开始请求")axios.get("http://localhost:3000/posts") .then(res=>{console.log("res:",res)console.log("请求结束")})配置 cancelToken 对象缓存⽤于取消请求的 cancel 函数在后⾯特定时机调⽤ cancel 函数取消请求在错误回调中判断如果 error 是cancel ,做相应处理12342. 实现功能node运⾏server.js安装node和express (npm install express)var http = require("http");var express = require("express")// var server = http.createServer();var app = express()// node跨域设置app.all("*",function(req,res,next){//设置允许跨域的域名,*代表允许任意域名跨域res.header("Access-Control-Allow-Origin","*");//允许的header类型res.header("Access-Control-Allow-Headers","content-type");//跨域允许的请求⽅式res.header("Access-Control-Allow-Methods","DELETE,PUT,POST,GET,OPTIONS"); if (req.method.toLowerCase() == 'options')res.send(200); //让options尝试请求快速结束elsenext();})app.get('/',function(res,req){console.log("获取客户端请求",res);// 延迟响应⽅便测试取消接⼝setTimeout(function(){req.end("延迟响应⽅便测试取消接⼝"); //响应客户数据},5000)})app.listen(4000,function(){console.log("服务器启动成功,可以通过 http://127.0.0.1:4000 进⾏访问")})在cmd窗⼝node server.js1调⽤接⼝测试axios.isCancel(err) //判断错误是否是取消请求导致的<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><script src="https:///axios/0.19.0/axios.js"></script></head><body>// axios({// url:"http://localhost:4000",// cancelToken:new axios.CancelToken(function(c){// cancel = c// })// })// 或axios.get("http://localhost:4000",{cancelToken:new axios.CancelToken(function(c){// c ⽤于取消当前请求的函数cancel = c})}).then(res=>{console.log("res:",res)cancel = null //请求完成,清空cancel},err=>{cancel = nullif( === 'Cancel'){ //是取消请求导致的errer console.log("取消请求导致error:",err)}else{console.log("err:",err)}// 或// axios.isCancel(err) //判断错误是否是取消请求导致的});setTimeout(function(){if(typeof(cancel) === 'function'){cancel('强制取消了请求')}else{console.log("没有可取消的请求")}},2000)</script></body></html>正常请求取消接⼝在请求拦截器⾥⾯统⼀添加取消请求e(res=>{res['cancelToken'] = new axios.CancelToken(function(c){cancel = c})return res},err=>{return Promise.reject(err)})在响应拦截器⾥⾯统⼀添加处理取消请求e(res=>{return res},err=>{if(axios.isCancel(err)){// 中断promise链接return new Promise(()=>{})}else{return Promise.reject(err)}})代码简化实现上⼀个接⼝还未响应下⼀个接⼝开始请求,把上⼀个接⼝取消<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><script src="https:///axios/0.19.0/axios.js"></script></head><body><script>let cancel;e(config=>{// 实现上⼀个接⼝还未响应下⼀个接⼝开始请求,把上⼀个接⼝取消if(typeof(cancel) === 'function'){cancel('强制取消了请求')}config['cancelToken'] = new axios.CancelToken(function(c){cancel = c})return config},err=>{return Promise.reject(err)})e(res=>{cancel = nullreturn res},err=>{cancel = nullif(axios.isCancel(err)){console.log("取消上⼀个请求")// 中断promise链接return new Promise(()=>{})}else{// 把错误继续向下传递return Promise.reject(err)}})function request(){axios.get("http://localhost:4000").then(res=>{console.log("res:",res)},err=>{console.log("err:",err)});}request()request()</script></body></html>。
Ajax框架概述
Ajax框架概述在编写Ajax页面时,有时会出现一些重复性代码。
这时可以把这些重复性的代码,即多次需要调用的代码,以面向对象的方式封装到一个文件里面,如创建XM LHttpRequest对象的代码。
这样能够达到代码重复重用的目的,能够很好的维护程序和调试程序。
重复性代码被封装成独立文件,其文件扩展名为.js。
利用封装Java Script文件可以形成自己的代码库,进而形成属于自己的框架。
创建属于自己的Ajax代码库(框架),会花费大量的时间,并且还需要时刻注意代码库的Bug并进行修正。
对于个人来说,还不如使用一些现成的Ajax框架,毕竟这些框架是经过优秀程序员创建和大量的用户测试。
从Ajax诞生以来,人们就发现使用Ajax框架可以带来极大的方便,节省了Aj ax程序员大量的时间和精力。
Ajax框架很多,主要可以分为两种类型,基于客户端和基于服务器端。
其中,大部分都开源,但也有少数专用。
本节中不可能每个框架都进行介绍,只对现在比较流行的框架进行介绍,并且对框架也不去进行深入的介绍。
Ajax框架由于代码库封装代码的不同,可以分为基于浏览器的Ajax框架和基于服务器端的Ajax框架。
基于服务器端框架可以划分两种形式,分别为HTML/JS Generation(HTML/JS生成)和远程交互。
第一种形式是通过服务器端生成HTML和JS代码在传递给浏览器端进行直接运行。
第二种形式是利用JavaScript调用服务器端函数(例如调用.NET函数)并返回给JavaScript 的回调句柄,或者请求服务器数据信息,例如Session信息,数据库查询等。
常用的Ajax框架,有Dojo、prototype、DWR、Buffalo、openrico、qooxdoo、YUL、、和Atlas等。
如下是对一些框架的简单描述:(1)Dojo是一个各个方面相当完善的JS库,包括了JS本身的语言扩展,以及各个方面的工具类库,和比较完善的UI组件库,也被广泛应用在很多项目中,他的UI组件的特点是通过给HTML标记增加tag的方式进行扩展,而不是通过写J S来生成,Dojo的API模仿Java类库的组织方式。
ajax datatype解读
ajax datatype解读(最新版)目录1.AJAX 简介2.AJAX 的 datatype 参数3.XMLHttpRequest 对象4.datatype 与响应数据的关系5.常用的 datatype 值6.实际应用示例正文AJAX,全称 Asynchronous JavaScript and XML,即异步 JavaScript 和 XML,是一种在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容的技术。
在 AJAX 中,datatype 参数是一个关键的概念,它用于指定服务器返回的数据类型。
AJAX 的 datatype 参数是在发送请求时设置的,它告诉服务器期望接收的数据类型。
datatype 参数的值会影响到服务器响应数据的处理方式,以及 XMLHttpRequest 对象的解析方式。
XMLHttpRequest 对象是 AJAX 的核心,它用于与服务器进行通信并接收响应数据。
当服务器返回数据时,XMLHttpRequest 对象会根据datatype 参数的值来解析响应数据,并把它转换为对应的 JavaScript 数据类型。
常用的 datatype 值有以下几种:1."xml":返回 XML 格式的数据,并把响应数据解析为 XML 文档。
2."json":返回 JSON 格式的数据,并把响应数据解析为 JavaScript对象。
3."html":返回 HTML 格式的数据,并把响应数据解析为 HTML 文档。
4."text":返回纯文本格式的数据,并把响应数据解析为字符串。
实际应用中,我们可以根据需要设置 datatype 参数,以便更好地处理服务器返回的数据。
例如,如果我们期望接收 JSON 格式的数据,并想把它解析为 JavaScript 对象,那么我们可以将 datatype 设置为"json"。
prototype的Ajax介绍
prototype的Ajax介绍(中文版)原文:/learn/introduction-to-ajaxPrototype框架提供了非常容易和有意思的方法处理Ajax的调用,同时它也是浏览器安全的。
除了简单的请求外,这个模块(指prototype里的Ajax)也能很聪明的处理从服务器返回的javascript代码,并且提供了一个辅助的类不停的轮循。
Ajax的功能包含在了全局的Ajax对象里面。
用于Ajax请求的transport是xmlHttpRequest,它是从用户角度的对不同浏览器进行安全的抽象的结果。
真正的请求是通过创建Ajax. Request对象的实例实现的。
new Ajax.Request('/some_url',{ method: 'get' });第一个参数是请求的地址,第二个是可选的哈希值。
方法选项指定要使用的HTTP请求方法,默认是POST。
记住,由于安全的原因(也就是防止跨站脚本攻击)Ajax请求只能被用在与包含这个Ajax 请求页面相同的协议、主机与端口上。
有些浏览器会允许任意的URL,但是你能不依靠这个。
Ajax响应回调Ajax请求默认是异步的,这也就意味着你必须要有回调函数能够处理返回的数据。
回调方法在发起请求的时候传给可选的哈希。
new Ajax.Request('/some_url',{method: 'get',onSuccess: function(transport){var response = transport.responseText || "no response text";alert("Success! \n\n" + response);},onFailure: function(){ alert('Something went wrong...') } });这里两个回调函数传给了这个哈希值,分别表示成功与失败的警告。
ajax的使用场景
ajax的使用场景Ajax的使用场景Ajax(Asynchronous JavaScript and XML)是一种用于创建快速、动态网页的技术。
它允许在不刷新整个页面的情况下更新部分页面内容,从而提高了用户体验和网站性能。
Ajax已经成为现代Web开发的标配,下面将按类划分介绍一些Ajax的使用场景。
1.表单验证表单验证是Web开发中非常重要的一环。
使用Ajax可以在不刷新页面的情况下立即验证表单的有效性。
例如,在用户输入电子邮件地址时,可以使用Ajax验证该地址是否有效。
如果地址无效,用户将立即得到反馈,而不必等待整个表单提交后再得到反馈。
这样可以提高用户满意度和网站性能。
2.搜索自动完成搜索自动完成是一种非常流行的Web功能。
它可以让用户更快地找到他们想要的信息。
使用Ajax可以实现搜索自动完成功能。
例如,在用户输入搜索词时,可以使用Ajax从服务器获取相关的搜索建议,并显示在下拉菜单中。
这样用户就可以选择他们想要的建议,而不必输入完整的搜索词。
3.无限滚动无限滚动是一种让用户无需点击按钮或链接即可浏览大量内容的功能。
使用Ajax可以实现无限滚动功能。
例如,在用户滚动页面时,可以使用Ajax从服务器获取更多的内容,并将其添加到页面末尾。
这样用户就可以不断地滚动页面,浏览更多的内容。
4.局部刷新局部刷新是一种在不刷新整个页面的情况下更新部分页面内容的功能。
使用Ajax可以实现局部刷新功能。
例如,在用户点击某个链接时,可以使用Ajax从服务器获取相关内容,并将其显示在页面中。
这样用户就可以在不离开当前页面的情况下获取更多的信息。
5.实时通信实时通信是一种让用户实时获取信息的功能。
使用Ajax可以实现实时通信功能。
例如,在用户与其他用户进行聊天时,可以使用Ajax从服务器获取其他用户发送的消息,并将其实时显示在聊天窗口中。
这样用户就可以实时交流,而不必等待消息的发送和接收。
总结以上是一些常见的Ajax使用场景。
JSP Ajax Prototype框架简介
JSP Ajax Prototype框架简介Prototype框架是一个基于客户端的Ajax框架,其实质就是将客户端常用的Aj ax代码,如创建XMLHttpRequest对象这些重复性代码,使用面向对象的方式进行封装,封装成一个js文件。
Prototype框架使用过程,只需要调用相应的对象,而不必关系其具体的实现细节。
从这方面说,Prototype是一个基础的JavaScript应用框架,Prototype的目的是为了更方便的开发JavaScript的应用,使用它可以更加方便简单的使用JavaScript 编程,开发面向对象的JavaScript程序,Prototype框架是JavaScript代码的自然扩展,更容易被人接受。
但是,Prototype是最受欢迎的AJAX框架之一。
比较著名的网站2006年的调查结果显示,Prototype同框架规模庞大的Yahoo! User Interface,Goog le Web Toolkit,and Atlas.等相比较起来,其排名竟然遥遥领先,这不能不令人感到惊异。
答案很简单:Prototype使用起来就像是对于JavaScript语言的自然扩展。
尝试过Prototype框架后,笔者几乎坚信Prototype框架应该被纳入JavaScript语言。
Prototype中包含了一个功能强大好用的Ajax框架,Prototype是一个基础性的框架,很多更高层次的框架都以它为基础,例如scriptaculous效果库。
Prototype框架以面向对象的方式封装JavaScript代码,其封装文件为prototype. js。
使用prototype.js可以大大简化客户端代码的开发工作。
prototype.js引入了类的概念,用其编写的类可以定义一个initialize的初始化函数,在创建类实例的时候会首先调用这个初始化函数。
正如其名字,prototype.js的核心还是prototype,虽然提供了很多可复用的代码,但没有从根本上解决JavaScript的开发和维护问题。
封装ajax请求方法
封装ajax请求方法Ajax(AsynchronousJavaScriptandXML)是由Netscape开发,在2005年普及,表达`Ajax`的英文全称是Asynchronous JavaScript and XML。
它是一种创建交互式网页应用的技术,可以使用Ajax来创建丰富的交互式网页,从而使网页的用户体验更加流畅。
Ajax技术实际上是利用浏览器发送网络请求,接收服务器传递过来的数据、更新页面的一种技术组合,是一种与服务器进行异步交互的技术。
比如,可以在不重新加载整个页面的情况下更新页面的部分内容,这一技术就是Ajax技术。
既然Ajax已经得到了如此广泛的应用,但是同时也带来了一些问题,比如每一次请求都需要写很多代码,开发团队之间还需要多次进行交流来定义请求接口,针对数据处理、错误处理等等,这样就失去了Ajax本身的意义,同时也会增加工作量。
为了解决这些问题,我们可以封装Ajax请求,将所有的Ajax 请求封装为一个对象,对外暴露一些基本的方法,以方便其他开发团队调用,避免重复造轮子,减少交流量,提高开发效率。
首先,我们可以从这个封装请求对象中暴露一些基本的参数,比如请求方法、数据类型、发送数据等等,以便我们在发送请求的时候更加方便,同时对对象进行完善,使其具备属性、方法和事件。
它的属性可以包含URL、返回的数据类型、提交的数据类型等等。
例如,URL的属性可以用来让用户设置请求的URL,返回的数据类型可以用来控制服务器返回的数据格式,提交的数据类型可以用来指定发送到服务器的数据类型。
其次,我们可以把封装请求对象中的方法分为四种:添加请求头、添加请求参数、发送请求和接收请求。
添加请求头可以用来设置请求头,添加请求参数可以用来添加请求参数,发送请求可以用来发送请求,接收请求可以用来接收请求。
最后,为了更加方便的调用,我们可以为封装的AJAX请求添加一些事件,比如,处理请求前的事件、发送请求前的事件、接收请求后的事件和处理请求后的事件。
Prototype
具有显式的 toArray 方法的对象(就像许多 Prototype 对象一样),直接调用 toArray 方 法进行转换 。
Prototype函数 函数
Prototype函数 函数
$H() 函数把一些对象转换成一个可枚举的和 联合数组类似的 Hash 对象 ,在调用函数后, 参数对象和返回对象是两个独立的个体.
引用Prototype 引用
怎么使用Prototype? 下载地址:将prototype.js文件 放入你的项目中 在页面中引用 <script src=‘prototype.js’></script>
Prototype类库 类库
这个类库带有很多预定义的对象和实用函数
总结
实用函数的用法 Ajax的应用 学习资料: 1.prototype.js 官方api文档 /api/ 2.开始学习prototype.js /learn 3.prototype.js讨论板 /group/Prototypejs/topics 4.phphot写的prototype.js教程 /phphot/archive/2007/10/10/1818938.aspx 5.prototype.js开发应用手册 /thread-2812502-1-1.html 6. 一个ajax的讨论论坛 /forum-13-1.html 7.一个ajax框架介绍的网站 /resources/
Prototype开发技术入门 开发技术入门
讲解内容
认识Prototype Prototype的特点 如何使用Prototype Prototype实用函数的用法 Prototype和JQuery的异同
认识Prototype 认识
1.
2.
prototype.js是由Sam Stephenson写的一个 javascript类库。这个构思奇妙,而且兼容标准的类 库,能帮助你轻松建立有高度互动的web2.0特性的 富客户端页面。 Prototype是一个非常优雅的JS库,它定义了JS的面 向对象扩展,DOM操作API,事件等等,以 prototype为核心,形成了一个外围的各种各样的JS 扩展库。
Ajax的使用和函数编写
Ajax的使用和函数编写什么是Ajax(缩写:Asynchronous JavaScript and Xm)异步的,在不刷新刷新整体网页内容的情况下,能自动更新部分网页内容的技术!∙要说Ajax就不得不说,异步传输和同步传输。
o异步是值:发送方发出数据后,不等接收方发回响应,接着发送下一个数据包的通讯方式。
o同步是指:发送方发出数据后,等待接收方发回响应以后才发下一个数据包的通讯方式。
∙也可以理解为:o异步传输:你传吧,我去做我的事了,传输完了告诉我一声。
o同步传输:你现在传输,我要看着你传输完成,才去做别的事。
Ajax的核心是javascript对象XmlHttpRequest。
Ajax的缺陷:Ajax并不是完美的技术,也存在缺陷:∙AJAX大量使用了Javascript和AJAX引擎,而这个取决于浏览器的支持。
IE5.0及以上、Mozilla1.0、NetScape7及以上版本才支持,Mozilla虽然也支持AJAX,但是提供XMLHttpRequest的方式不一样。
所以,使用AJAX的程序必须测试针对各个浏览器的兼容性。
∙AJAX更新页面内容的时候并没有刷新整个页面,因此,网页的后退功能是失效的;有的用户还经常搞不清楚现在的数据是旧的还是已经更新过的。
这个就需要在明显位置提醒用户“数据已更新”。
XMLHttpRequest对象属性:∙onreadystatechange:状态改变的事件触发器。
∙readyState:对象状态:o0=未初始化o1=读取中o2=已读取o3=交互中o4=完成∙responseText:服务器进程返回数据的文本版本。
∙responseXML:服务器进程返回数据的兼容DOM的Xml文档对象。
∙status:服务器返回的状态码,如404=“文件未找到”,200=“成功”。
statusText:服务器返回的状态文本信息。
Ajax函数的编写:function ajax(url, fnSucc, fnFaild){//1.创建Ajax对象if(window.XMLHttpRequest){varoAjax=new XMLHttpRequest();}else{varoAjax=new ActiveXObject("Microsoft.XMLHTTP");}//2.连接服务器(打开和服务器的连接)oAjax.open('GET', url, true);//3.发送oAjax.send();//4.接收oAjax.onreadystatechange=function (){if(oAjax.readyState==4){if(oAjax.status==200){//alert('成功了:'+oAjax.responseText);fnSucc(oAjax.responseText);}else{//alert('失败了');if(fnFaild){fnFaild(); }}}};}。
JSP Ajax Prototype库介绍
JSP Ajax Prototype库介绍prototype.js是一个由Sam Stephenson写的JavaScript包。
是Prototype框架的惟一文件。
该文件的产生,承担了创造胖客户端,高交互性WEB应用程序的重担,轻松加入Web 2.0特性。
也可以把prototype.js文件看成一个Prototype库,里面提供了大量的通用方法和JavaScript对象。
1.通用方法Prototype库里面包含了许多预定义的对象和通用性方法。
编写这些方法的明显的目的就是为了减少开发时大量的重复编码和惯用法。
在Portotype库里面常用的通用方法分别为$()、$F()、$A()、$H()、$R()和Try.these()方法。
使用$()方法$()方法是在DOM中使用过于频繁的document.getElementById()方法的一个便利的简写,就像这个DOM方法一样,这个方法返回参数传入的id的那个元素。
比起DOM中的方法,这个更胜一筹。
可以传入多个id作为参数然后$()返回一个带有身,这样,在建立其它能传两种类型的参数的函数时非常有用。
●使用$F()函数$F()函数是另一个“快捷键”,它能用于返回任何表单输入控件的值,比如text box,drop-down list。
这个方法也能用元素id或元素本身作为参数。
该方法使用示$A()函数能把它接收到的单个的参数转换成一个Array对象。
该方法结合被本类库扩展了的Array类,能方便的把任何的可枚举列表转换成或拷贝到一个Array 对象。
一个推荐的用法就是把DOM Node Lists转换成一个普通的Array对象,从而更有效率的进行遍历,请看下面的例子。
$R()是new ObjectRange(lowBound,upperBound,excludeBounds)的缩写,表示产该方法使得实现,当想调用不同的方法直到其中的一个成功正常的这种需求变得非常容易,他把一系列的方法作为参数并且按顺序的一个一个的执行这些方法直到其中的一个成功执行,返回成功执行的那个方法的返回值。
prototype使用文档
prototype.js开发笔记--------------------------------------------------------------------------------Table of Contents1. Programming Guide1.1. Prototype是什么?1.2. 关联文章1.3. 通用性方法1.3.1. 使用$()方法1.3.2. 使用$F()方法1.3.3. 使用$A()方法1.3.4. 使用$H()方法1.3.5. 使用$R()方法1.3.6. 使用Try.these()方法1.4. Ajax 对象1.4.1. 使用Ajax.Request类1.4.2. 使用Ajax.Updater 类2. prototype.js参考2.1. JavaScript 类的扩展2.2. 对Object 类的扩展2.3. 对Number 类的扩展2.4. 对Function 类的扩展2.5. 对String 类的扩展2.6. 对document DOM 对象的扩展2.7. 对Event 对象的扩展2.8. 在prototype.js中定义的新对象和类2.9. PeriodicalExecuter 对象2.10. Prototype 对象2.11. Class 对象2.12. Ajax 对象2.13. Ajax.Base 类2.14. Ajax.Request 类2.15. options 参数对象2.16. Ajax.Updater 类2.17. Ajax.PeriodicalUpdater 类2.18. Element 对象2.19. Abstract 对象2.20. Abstract.Insertion 类2.21. Insertion 对象2.22. Insertion.Before 类2.23. Insertion.Top 类2.24. Insertion.Bottom 类2.25. Insertion.After 类2.26. Field 对象2.27. Form 对象2.28. Form.Element 对象2.29. Form.Element.Serializers 对象2.30. Abstract.TimedObserver 类2.31. Form.Element.Observer 类2.32. Form.Observer 类2.33. Abstract.EventObserver 类2.34. Form.Element.EventObserver 类2.35. Form.EventObserver 类2.36. Position 对象(预备文档)覆盖版本1.3.1Chapter 1. Programming Guide1.1. Prototype是什么?或许你还没有用过它,prototype.js 是一个由Sam Stephenson写的JavaScript 包。
Prototype提供的Ajax功能在ThinkPHP框架中的应用研究
Prototype提供的Ajax功能在ThinkPHP框架中的应用研究作者:张洪波杨新泉来源:《硅谷》2011年第07期摘要:研究web开发中Prototype目前最为广泛的Ajax功能,在ThinkPHP框架中的应用。
以合作管理系统为例,展示Prototype中的Ajax功能在ThinkPHP的应用。
关键词: ThinkPHP;Prototype;异步模式中图分类号:TP文献标识码:A文章编号:1671-7597(2011)0410086-010 引言随着技术的进步和用户需求的扩大,Ajax的出现,实现了对服务器发送异步请求的能力,这给易用性带来了无法言尽的影响。
传统的Ajax开发需要编写大量的JavaScript脚本,而Prototype框架可以大大简化JavaScript代码的编写工作。
ThinkPHP是一个快速、兼容且简单的轻量级国产PHP开发框架,遵循Apache2开源协议,从Struts结构移植过来并做了改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式[1],已越来越多地受到认可。
鉴于ThinkPHP、Prototype目前的广泛应用,本文通过一个合作管理系统为例,详细介绍两者的完美结合。
1 Prototype的Ajax辅助类原理Prototype中的Ajax类是一个已定义好的功能模块,封装了实现Ajax功能所需的技巧性代码,使我们可以更简单的创建动态的网页。
下面我们通过Ajax的原理图简略的学习一下。
图1Prototype的Ajax原理图从上图中可以看到,Prototype的Ajax功能仍然是使用xmlHttpRequest进行异步数据传输,只是提供了一层封装,屏蔽了不同浏览器的不一致性。
我们将通过创建Ajax.Request对象,传入相应的参数。
缺省情况下,Ajax请求是异步的,Prototype提供回调函数来处理服务器返回的数据。
2 Prototype的Ajax类在ThinkPHP的应用下面以某合作管理系统中的合作公告模块为例,介绍Ajax功能的应用。
ajax post方法
ajax post方法Ajax Post方法详解Ajax(Asynchronous JavaScript and XML)是一种在Web应用中实现异步交互的技术,通过在不重新加载整个页面的情况下,与服务器进行数据交互,实现动态更新页面内容。
其中,Ajax的Post方法是常用的一种数据提交方式,本文将对Ajax Post方法进行详细的讲解。
一、什么是Ajax Post方法Ajax Post方法是通过HTTP协议向服务器提交数据的一种方法。
相比于Get方法,Post方法可以向服务器发送更多的数据,且安全性更高。
在前端开发中,我们可以使用Ajax的Post方法将用户输入的数据发送给服务器进行处理,然后再将处理结果返回给页面,实现实时的数据更新。
二、Ajax Post方法的使用步骤1. 创建XMLHttpRequest对象:在使用Ajax Post方法之前,首先需要创建XMLHttpRequest对象,该对象用于与服务器进行通信。
2. 设置请求参数:通过XMLHttpRequest对象的open()方法设置请求的URL、请求的方式(Post)、是否异步等参数。
3. 设置请求头:通过XMLHttpRequest对象的setRequestHeader()方法设置请求头,常见的请求头包括Content-Type、Cookie等。
4. 发送请求:通过XMLHttpRequest对象的send()方法发送请求,可以将需要提交的数据作为参数传入send()方法。
5. 处理服务器响应:通过XMLHttpRequest对象的onreadystatechange事件监听服务器响应的状态,当服务器响应完成时,可以通过XMLHttpRequest对象的responseText属性获取服务器返回的数据。
三、Ajax Post方法的优势1. 实现异步交互:使用Ajax Post方法可以实现异步交互,提升用户体验,避免页面的刷新和重载。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
prototype的Ajax介绍/dxxhh/archive/2008/05/04/888839.htmlprototype的Ajax介绍[翻译完成]原文:/learn/introduction-to-ajax]翻译: 站长]Prototype框架提供了非常容易和有意思的方法处理Ajax的调用,同时它也是浏览器安全的。
除了简单的请求外,这个模块(指prototype里的Ajax)也能很聪明的处理从服务器返回的javascript代码,并且提供了一个辅助的类不停的轮循。
Ajax的功能包含在了全局的Ajax对象里面。
用于Ajax请求的transport是xmlHttpRequest,它是从用户角度的对不同浏览器进行安全的抽象的结果。
真正的请求是通过创建Ajax. Request对象的实例实现的。
复制内容到剪贴板代码: new Ajax.Request('/some_url',{ method:'get' });第一个参数是请求的地址,第二个是可选的哈希值。
方法选项指定要使用的HTTP请求方法,默认是POST。
记住,由于安全的原因(也就是防止跨站脚本攻击)Ajax请求只能被用在与包含这个Ajax 请求页面相同的协议、主机与端口上。
有些浏览器会允许任意的URL,但是你能不依靠这个。
Ajax响应回调Ajax请求默认是异步的,这也就意味着你必须要有回调函数能够处理返回的数据。
回调方法在发起请求的时候传给可选的哈希。
复制内容到剪贴板代码:new Ajax.Request('/some_url',{method:'get',onSuccess: function(transport){var response = transport.responseText || "no response text";alert("Success! \n\n" + response);},onFailure: function(){ alert('Something went wrong...') }});这里两个回调函数传给了这个哈希值,分别表示成功与失败的警告。
onSuccess和onFailure根据返回的状态相应的被调用。
第一个参数是原生的xmlHttpRequest对象,可以分别使用它的responseText和responseXML属性。
你可以把两个回调都定义,也可以是一个或者没有,这全由你来定。
其它的可以用的回调函数还有:onUninitialized,onLoading,onLoaded,onInteractive,onComplete andonException.他们都与xmlHttpRequest的传输的某一个状态有关系,除了在分发其它回调时出现异常后引起的onException外。
还有可以得到的就是onXXX的回调。
这里XXX是HTTP的返回状态,象200或者404。
需要注意的是,如果用这种方法,你的onSuccess和onFailure就不会被调用了。
因为onXXX 有更高的优先级,因为这样做的话,表示你知道你在做什么。
而onUninitialized、onLoading、onLoaded和onInteractive这些回调函数并没有完全的被所有的浏览器实现出来。
通过我们避免使用它们。
参数与HTTP方法你可以将请求参数象一个参数属性一样传递。
复制内容到剪贴板代码:new Ajax.Request('/some_url', {method: 'get',parameters: {company: 'example', limit: 12}});那么参数会以company=example&limit=12的形式发出。
你可以使用GET/POST中的任一种。
但是需要注意的是GET的请求不应该导到致数据发生变化。
浏览器很少会缓存POST请求,但是它往往会缓存GET请求。
参数属性的一个重要的应用是用Ajax请求发送一个FORM的内容,Prototype已经给了你一个帮助的方法,叫做Form.serialize:复制内容到剪贴板代码:new Ajax.Request('/some_url', {parameters: $('id_of_form_element').serialize(true)});如果你需要发送自定义的HTTP请求头,你可以用requestHeaders项来实现。
只要作为一个哈希或者用一个扁平的数组传入名字—值对就可以了。
如:['X-Custom-1','value','X-Custom-2', 'other value'].如果由于某种原因,你必须POST一个自定义的POST体(没有参数来自于参数项)的请求,有一个postBody项就是为了这个目的设的。
要注意的时,如果你使用postBody,那么你传进来的所有的参数都不会被发送,因为postBody有更高的优先级。
这样做的时候,你应该是清醒的。
对javascript返回值求值有时应用程序发送javascript代码作为响应。
如果这个返回的Contenty-Type与Javascript的MIME的类型是一样的,那么Prototype将会自动eval()返回的代码。
你如果没有需要的话,就不用显式的处理这个响应。
还有可能就是这个响应是一个X-JSON的头,那他的内容就会被解析,保存成立个对象并发送给这些回调函数,当成第二个参数:复制内容到剪贴板代码:new Ajax.Request('/some_url', { method:'get',onSuccess: function(transport, json){alert(json ? Object.inspect(json) : "no JSON object");}});可以用这个函数来取比较重要的数据,以避免解析XML返回的损耗。
JSON比XML 要更快(当然也更轻)。
全局响应者这里有一个对象在每次Ajax请求时都会被调用:Ajax.Responders。
你可以用他来注册回调函数在任何一个Ajax.Request状态发生时被触发:复制内容到剪贴板代码:Ajax.Responders.register({onCreate: function(){alert('a request has been initialized!');},onComplete: function(){alert('a request completed');}});每个与xmlHttpRequest的传输状态匹配的回调都可以放在这里,再带上一个onCreate。
象这样的全局的跟踪请求在不少方面是很有用的:你可以把它们记录下来以用于调试或者抛出一个异常处理,来通过用户可能的连接问题。
用Ajax.Updater来动态更新你的页面开发者经常想通过Ajax请求来接收HTML的片段来更新文档的部分内容。
通过Ajax.Request的onComplete回调是相当容易的,但是如果是用Ajax.Update就会变得更加容易。
假设你的HTML文档中有以下代码:复制内容到剪贴板代码:<h2>Our fantastic products</h2><div id="products">(fetching product list ...)</div>'products'容器是空的,你想把Ajax的响应的HTML返回值放到这里。
没有问题:复制内容到剪贴板代码:new Ajax.Updater('products', '/some_url', { method: 'get' });这就是全部,没有别的其它工作。
变量与Ajax.Request是一样的。
除了第一个位置上多了一个接收元素。
Prototype会通过Element.update()来神奇的把响应更新到容器。
如果你的HTML里还有内含的一些脚本,默认情况下会被过滤掉,为了让你的脚本被执行,你必须在evalScripts选项上传入真值。
那如果有错误发生,服务器返回一个错误信息而不是HTML,那会怎么样?一般来讲,你不会想插入错误到用户需要内容的地方。
幸运的时,prototype提供了一个方法的解决办法:你现在在第一个参数里传入以这种形式{ success:'products', failure:'errors' }表示两个不同的容器的哈希值,而不只是原来那一个。
那么成功的话,内容就会被放在success 的容器上,错误就会被放在failure容器上。
通过使用这些特性,你的界面就会变得更加用户友好。
你也可能不想覆盖当前容器中的内容,而是想把新的HTML加在最前或者最后面。
很好,你完全可以这样做。
只要把要插入的对象当成是插入参数传递给Ajax就可以了:复制内容到剪贴板代码:new Ajax.Updater('products', '/some_url', {method: 'get',insertion: Insertion.Top});Ajax.Updater就会使用给定的对象在容器('products')元素里对返回的HTML执行插入。
漂亮的手法!用Ajax.PeriodicalUpdater自动执行请求你发现Ajax.Updater很酷,但是你还想定时的执行他从服务器取数据?Prototype框架也有这个东西。
这个东西就是Ajax.PeriodicalUpdater,它基本上就是定时的运行Ajax. Updater。
复制内容到剪贴板代码:new Ajax.PeriodicalUpdater('products', '/some_url',{method: 'get',insertion: Insertion.Top,frequency: 1,decay: 2});两个新的参数是频率与衰退。
频率就是请求产生的间隔,用秒表示。
这里它是1秒,表示Ajax每分钟请求一次。
默认的频率是2秒。
我们的用户可能会对应用有这么好的响应程序感到非常高兴,但是我们的服务器可能性会承受非常大的压力,如果用户一直长时间开着浏览器的话。