首页 文章 精选 留言 我的

精选列表

搜索[javascript引擎],共10000篇文章
优秀的个人博客,低调大师

web前端javaScript 之 【Ajax】

Ajax是干什么的,为什么要学这个技术: 我们在上网浏览网站的时候,经常会看到下拉加载的的功能。例如百度图片、淘宝列表等等……,这种我们每次下滑,就自动加载更多的信息。这种信息不用每次刷新页面,而就会自动加载出来;那么我们前端,像这种不必刷新页面也能获取新的数据的技术,我们就需要使用ajax来实现。而ajax也是目前Web开发人员必须要掌握一种技术。简单来讲,ajax就是提交并且接收了服务器的数据,从而可以获取新的数据,来渲染页面的更新 Ajax技术核心是XMLHttpRequest对象(简称XHR),帮助记忆,可以想象是“小黄人”的拼音简称。这是由微软首先引入的一个特性,其他浏览器提供商也都是后来慢慢相同的实现这个技术。也是在2005年低,2006年初,Ajax技术才慢慢的红遍了技术圈。IE5是第一款引入的XHR对象的浏览器,目前我们只讲解适合于IE7之后的版本,之前的不做讲解。 ---用法:--- 一、创建一个ajax对象 首先我们需要构造出一个新的XMLHttpRequest var xhr = new XMLHttpRequest() 二、配置这个对象open(发送方式, 地址, 是否异步); 构造完之后,我们需要创建一个请求发送我们的数据,因为向服务器发送了请求,我们才能得到想要的数据。创建我们需要一个固定的方法open()。 open()它有三个参数,第一个是请求的方式(五种方式 :get/post/put/delete/head),第二个是请求的地址URL,第三个是个布尔值(true/false)代表是否异步。 比如我们向一个后端接口/villin.php发一个get请求,大部分的请求都是异步加载,我们我们就可以这样写。 var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); 三、发送请求 这就创造出了一个简单的请求数据,那么接下来我们要把这个数据发送给数据库,方法send(null); var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); xhr.send(null) send()方法按照中文意思理解,就是发送,它接收一个参数,作为请求主体发送的数据。如果不需要通过请求主体发送数据,就传入一个null,也可以不传,但是对于某些浏览器来说,是必须要传的,所以我们规范一点,写上null。 四、监听响应 这时,后端服务器接收到了我们发送的数据,就会返回我们想要的数据。 XHR的技术价值就是可以实时监听数据的变化,实时返回新的数据,那么怎么监听?他自身携带了一个属性,叫onreadystatechange,从字面意思理解,就是实时监听改变。所以我们监听之后要做的事件,都需要写在onreadystatechange函数当中。 onreadystatechange会监听一个叫readyState的值,这个值很重要,它会反映出当前响应过程的活动阶段,用0~4来表示: 0表示XHR刚创建出来,还没有初始化,没调用open()。1表示已经调用open()方法,但还没有调用send()。2表示已经调用send()方法,但还没有接收到数据。3表示服务器已经接收到了部分响应数据。4表示服务器已经接收到了全部响应数据,可以在客户端使用了。 所以当readyState返回4的时候,说明数据返回成功,我们就可以拿到相应的数据了。 var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); xhr.onreadystatechange = function () { if (this.readyState !== 4) { return; }else{ //成功返回数据,在这里获取数据 } } xhr.send(null) // 要成功发送请求头信息,onreadystatechange一定要在open()之后,send()之前监听。 此时说明服务器已经接收到了全部响应(但响应未必是返回成功的数据)。那么服务器会把响应数据返回给浏览器,浏览器也就返回相应的状态码status,表示数据异常或成功。常见的状态码如下: 2开头,代表响应成功,如200。3开头,代表重定向,如302页面暂时重定向,304表示请求的资源并没有被修改,可以使用浏览器中缓存的版本。4开头,请求有错误,如400。5开头,服务器报错,如500。 所以我们要使用返回来的数据,先判断是否返回正常,一般是>=200并且<300。返回成功后,数据会被放置在一个叫responseText当中,我们直接打印出responseText就可以提取出内部的文本。 var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); xhr.onreadystatechange = function () { if (this.readyState !== 4) { return; }else{ //成功返回数据,在这里获取数据 if(this.status >= 200 && this.status < 300) { console.log('请求成功') console.log(this.responseText) // 此刻拿到后端的数据,打印出responseText }else{ console.log('请求出错') } } } xhr.send(null) // 要成功发送请求头信息,onreadystatechange一定要在open()之后,send()之前监听。 ---超时设定:timeout--- 最初,IE8为XHR提供了超时属性timeout,表示请求在等待多少毫秒之后就终止。再给timeout设置超时设定后,在规定时间没有接收到请求,那么就会触发timeout,进而调用ontimeout程序,如下: var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); xhr.onreadystatechange = function () { if (this.readyState !== 4) { return; }else{ try{ //成功返回数据,在这里获取数据 if(this.status >= 200 && this.status < 300) { console.log('请求成功') console.log(this.responseText) // 此刻拿到后端的数据,打印出responseText }else{ console.log('请求出错') } }catch(val){ // 可以写timeout处理程序 } } } xhr.timeout = 2000; // 设置超时时间为2000mm,超出会调用ontimeout事件 xhr.ontimeout = function(){ alert('请求超时2000mm') } xhr.send(null) // 要成功发送请求头信息,onreadystatechange一定要在open()之后,send()之前监听。 ️注意:如果在超时之后再访问status就会出现错误,所以我们可以将判断封装到try...catch语句,这样就可以完美的解决超时问题 ️虽然timeout是由IE提供的,不过目前其他浏览器的兼容性,还需要大家去尝试。 ---load事件--- Firefox在实现Ajax的简化模型时,引入了load事件。它可以代替onreadystatechange事件,响应完毕后将触发onload事件,所以我们就可以省去了检查readyState属性了,不比判断readyState是否等于4的问题了。 var xhr = new XMLHttpRequest(); xhr.open('get', './villin.php', true); xhr.onload = function () { if(this.status >= 200 && this.status < 300) { console.log('请求成功') console.log(this.responseText) // 此刻拿到后端的数据,打印出responseText }else{ console.log('请求出错') } } xhr.send(null) 目前Firefox、Oprea、Chrome、Safari都支持load事件。 ---浏览器跨域--- 通过XHR实现ajax通信的主要一个主要限制,就是来自跨域的安全策略(同源策略)。默认情况下,XHR对象只能访问与包含它的页面位于同一个域中的资源,这种安全策略是为了预防某些恶意行为。 怎么解决跨域问题,其实IE与其他浏览器还各有千秋,比如IE与其他浏览器的CORS的实现,在open()方法中传入对决URL地址,如www开头的地址,我们就可以拿到绝对地址上的信息。还有一起其他跨域技术: JSONP Jsonp虽然和json长得很像,不过这两个还是没什么关系的,json是以键和值的方式存在的一种格式,Jsonp是由回调函数和数据组成的一种技术。 Jsonp是通过动态<script>元素来使用的,使用的时候可以为src指定一个跨域的URL。<script>元素有能力不受限制的从其他域中加载资源,所以可以实现跨域请求。 <script src='www.avillin.com/?callback=handleaaa'></script> // URL就是此地址,后边callback返回的就是函数,名称为handleaaa <script> function handleaaa(response){ console.log(response) } </script> 扩展:目前前端使用的vue框架中,也有自己的跨域方式,可以通过proxy来实现跨域。 更多关于ajax的知识,也欢迎一起探讨。 本文作者:avillin 邮箱:avillin@163.comv-chat:villinWechat

优秀的个人博客,低调大师

Javascript基础之-原型(prototype)

首先呢,prototype是对象里的一个内置属性,并且呢,这个属性是对于其他对象的一个引用。所以呢,思考下面的例子: var obj = { a: 2 } var myObj = Object.create(obj); console.log(myObj.a); // 2 console.log(myObj === obj); // false console.log(Object.getPrototypeOf(myObj) === obj); // true Object.getPrototypeOf(myObj).a = 4 console.log(obj.a); // 4 这里可以看到,实际上Object.create()是新建了一个对象,并且这个对象的prototype是obj的一个引用,所以呢,如果咱们直接修改prototype里面的值,原对象也就跟着变了。 很简单吧,那么如果执行如下代码的话,会发生什么呢? myObj.a = 10; 是不是认为,还跟上面那个一样的,obj.a也变成10了呢?实际上不是的,他的运行机制要比咱们想的稍微复杂一点点。 实际上要分三种情况来看: 如果在prototype链上存在这个属性,并且没有标记为只读,那么就会在本对象上新建一个新的同名属性。 如果在prototype链上存在这个属性,并且标记为只读,那么将无法修改已有属性或在本对象上新建一个同名属性,如果是严格模式的话,还会报错。 如果在prototype链上只是存在此setter,那么一定会调用此setter,并不会添加属性到对象上,更不会重新定义这个setter 很枯燥是吧,来看例子,对照着上面的情况,好好的理解一下: var obj = { a: 2, set c(num) { console.log('exec it'); } } var myObj = Object.create(obj); myObj.a = 10; console.log(obj.a); // 2 console.log(myObj.a); // 10 Object.defineProperty(obj, 'b', { value: 3, writable: false }) myObj.b = 10; console.log(myObj.b); // 3 myObj.c = 20; // "exec it" console.log(myObj.c); // undefined 假如上面的已经理解了,那么可以思考下下面的运行结果: var obj = { a: 2 } var myObj = Object.create(obj); console.log(++myObj.a); // 3 console.log(obj.a); // 2 这个在咱们实际的编码中时有发生,看代码是想把a改成3,但是由于上面第一种情况的影响,实际上是新建了一个同名属性3,并且赋值给了myObj。 上面我们谈论的都是普通对象的prototype的一些特性,接下来,咱们就要讲关于new关键字相关的一些知识点了,思考下面的例子 function Foo() {} var a = new Foo(); console.log(Object.getPrototypeOf(a) === Foo.prototype); // true var b = new Foo(); Object.getPrototypeOf(b).saySomething = function () { console.log('say something'); } a.saySomething(); // "say something" 很明显,在new的过程中呢,生成了一个新对象,并且把Foo.prototype引用到了新对象的prototype。那么因为是引用,所以通过b改变其原型上的prototype的值,Foo.prototype里也会跟着改变。 那么new的过程,是不是一定引用的是函数的prototype呢?也不一定,比如说下面的例子。 function Foo() { return { a: 3 } } var a = new Foo(); console.log(Object.getPrototypeOf(a) === Foo.prototype); // false console.log(Object.getPrototypeOf(a) === Object.prototype); // true console.log(a.a); // 3 在这个例子中,由于new的时候,返回的是一个对象,所以最后实际上a最终引用的是Foo最后返回的那个小对象,所以其prototype就是Object.prototype,而不是Foo.prototype 甚至说,Foo.prototype也是可以被改变的,不过在这时候,new出来的对象,其prototype就是被改过的那个对象。 var protoObj = { b: 10 } function Foo() {} Foo.prototype = protoObj; var a = new Foo(); console.log(Object.getPrototypeOf(a) === Foo.prototype); // true console.log(Object.getPrototypeOf(a) === protoObj); // true console.log(a.b); // 10 你看,如果prototypeObj修改了默认的Foo.prototype,所以最后,实际上形成了这么一个引用链:a.prototype => foo.prototype => protoObj=>Object.prototype。 所以说结论吧,在new的时候,实际上执行会包含这么几步, 如果有return并且返回的是一个对象的话,则直接返回return后的那个对象。 反之,则新建一个对象。 并且吧函数的prototype引用到新建对象的prototype中。 所以说,原型,可以理解为我本来对象有一个prototype,引用着其他的对象,当我这个对象的prototype引用了另一个对象的prototype,一般情况会到Object.prototype为止,这样就组成了一个原型链,原型链也就是互相引用的引用链。而这个引用链是可以根据自己的需求去改。 好了,简短的一小节就完事了,如果有不明白的,或者有疏漏的地方,或者有什么地方想和我讨论的,可以留言给我哦。 本文转载自http://www.lht.ren/article/8/

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册