JS交互 问题汇总
Asynchronous Javascript And XML js的异步请求对象
script标签的src属性
location.href
, assign replace
, window.open()
, background-image:url("")
, form表单
, 超链接 跳转到服务器程序
, img 的src属性
, video和audio 的src属性
, link的href
, iframe(了解)
req.cookies()
来获取存储的cookie信息$.ajax
、$.post
、$.getJSON
通过创建一个XMLHttpRequest
对象,来进行前后端交互。_http
来完成get
、post
和jsonp
的方式来进行前后端交互;Web容器 : 是一个用来搭建动态网站或者服务器的开源软件, 能够把指定文件夹暴露给外部访问,其他人通过域名/IP地址
能够访问到这个文件夹里面的内容。
常见的web容器:
java
.NET
PHP
wampserver(一键集成环境)
windows apache mysql php
Ajax的特点: 异步请求,局部刷新
Ajax的优点:
XMLHttpRequest
,我们的ajax对象
的 构造函数
名字;onreadystatechange
;var btn=document.getElementsByTagName("button")[0];
btn.onclick=function () {
// 1.构建异步请求对象
var ajaxObj=new XMLHttpRequest();
// 2.调用open方法 传入服务器链接地址以及请求方式等参数
// ajaxObj.open("get","url");
ajaxObj.open("get","url");
// 3.调用send发送网络请求
ajaxObj.send();
// 4.注册状态改变事件
ajaxObj.onreadystatechange=function () {
//5.在事件驱动函数里面 获取返回的数据 进行页面刷新
// console.log("请求数据啦!!!");
// console.log(ajaxObj.readyState);
if(ajaxObj.readyState===4 && ajaxObj.status==200){
// console.log("设置页面");
console.log(ajaxObj.responseText);
}else if(ajaxObj.readyState===4){
console.log("错误啦....");
}
}
}
每当ajax对象
的readyState属性值
发生变化时,都会触发onreadystatechange事件
,
readyState
我们发现触发了3次(有的同学电脑触发2次 不纠结),为4
的那一次是返回数据的状态 需要判断。
一、常见Ajax错误分析 问题:
0: (Uninitialized) the send( ) method has not yet been invoked.
1: (Loading) the send( ) method has been invoked, request in progress.
2: (Loaded) the send( ) method has completed, entire response received.
3: (Interactive) the response is being parsed.
4: (Completed) the response has been parsed, is ready for harvesting.
解析:
0 - (未初始化)还没有调用send()方法;
1 - (载入)已调用send()方法,正在发送请求;
2 -(载入完成)send()方法执行完成,已经接收到全部响应内容;
3 -(交互)正在解析响应内容;
4 -(完成)响应内容解析完成,可以在客户端调用了;
所谓的状态码就是服务器返回的状态一个标识:
404 表示资源没找到 没有发现文件、查询或URl;
200 表示响应成功;
500 表示服务器内部报错;
消息1XX:
这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应。
100 Continue
服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求
101 Switching Protocols
服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。
在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。
102 Processing
由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行
成功2XX:
这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
200 OK
请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。
201 Created
请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 '202 Accepted'。
202 Accepted
服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。
返回202状态码的响应的目的是允许服务器接受其他过程的请求(例如某个每天只执行一次的基于批处理的操作),而不必让客户端一直保持与服务器的连接直到批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,
以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成。
203 Non-Authoritative Information
服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超集。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。
204 No Content
服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。
如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。
由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。
205 Reset Content
服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。
与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。
206 Partial Content
服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。
该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。
响应必须包含如下的头部域:
Content-Range 用以指示本次响应中返回的内容的范围;如果是 Content-Type 为 multipart/byteranges 的多段下载,则每一 multipart 段中都应包含 Content-Range 域用以指示本段的内容范围。假如响应中包含 Content-Length,那么它的数值必须匹配它返回的内容范围的真实字节数。
Date
ETag 和/或 Content-Location,假如同样的请求本应该返回200响应。
Expires, Cache-Control,和/或 Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。
假如本响应请求使用了 If-Range 强缓存验证,那么本次响应不应该包含其他实体头;假如本响应的请求使用了 If-Range 弱缓存验证,那么本次响应禁止包含其他实体头;这避免了缓存的实体内容和更新了的实体头信息之间的不一致。否则,本响应就应当包含所有本应该返回200响应中应当返回的所有实体头部域。
假如 ETag 或 Last-Modified 头部不能精确匹配的话,则客户端缓存应禁止将206响应返回的内容与之前任何缓存过的内容组合在一起。
207 Multi-Status
由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。
重定向3XX:
这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Location 域中指明。
当且仅当后续的请求所使用的方法是 GET 或者 HEAD 时,用户浏览器才可以在没有用户介入的情况下自动提交所需要的后续请求。客户端应当自动监测无限循环重定向(例如:A->A,或者A->B->C->A),因为这会导致服务器和客户端大量不必要的资源消耗。按照 HTTP/1.0 版规范的建议,浏览器不应自动访问超过5次的重定向。
300 Multiple Choices
被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。
除非这是一个 HEAD 请求,否则该响应应当包括一个资源特性及地址的列表的实体,以便用户或浏览器从中选择最合适的重定向地址。这个实体的格式由 Content-Type 定义的格式所决定。浏览器可能根据响应的格式以及浏览器自身能力,自动作出最合适的选择。当然,RFC 2616规范并没有规定这样的自动选择该如何进行。
如果服务器本身已经有了首选的回馈选择,那么在 Location 中应当指明这个回馈的 URI;浏览器可能会将这个 Location 值作为自动重定向的地址。此外,除非额外指定,否则这个响应也是可缓存的。
301 Moved Permanently
被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。
新的永久性的URI 应当在响应的 Location 域中返回。除非这是一个 HEAD 请求,否则响应的实体中应当包含指向新的 URI 的超链接及简短说明。
如果这不是一个 GET 或者 HEAD 请求,因此浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。
注意:对于某些使用 HTTP/1.0 协议的浏览器,当它们发送的 POST 请求得到了一个301响应的话,接下来的重定向请求将会变成 GET 方式。
302 Move Temporarily
请求的资源临时从不同的 URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
上文有提及。
如果这不是一个 GET 或者 HEAD 请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。
注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用 GET 方式访问在 Location 中规定的 URI,而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。
303 See Other
对应当前请求的响应可以在另一个 URL 上被找到,而且客户端应当采用 GET 的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。这个新的 URI 不是原始资源的替代引用。同时,303响应禁止被缓存。当然,第二个请求(重定向)可能被缓存。
注意:许多 HTTP/1.1 版以前的浏览器不能正确理解303状态。如果需要考虑与这些浏览器之间的互动,302状态码应该可以胜任,因为大多数的浏览器处理302响应时的方式恰恰就是上述规范要求客户端处理303响应时应当做的。
304 Not Modified
如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。
该响应必须包含以下的头信息:
Date,除非这个服务器没有时钟。假如没有时钟的服务器也遵守这些规则,那么代理服务器以及客户端可以自行将 Date 字段添加到接收到的响应头中去(正如RFC 2068中规定的一样),缓存机制将会正常工作。
ETag 和/或 Content-Location,假如同样的请求本应返回200响应。
Expires, Cache-Control,和/或Vary,假如其值可能与之前相同变量的其他响应对应的值不同的话。
假如本响应请求使用了强缓存验证,那么本次响应不应该包含其他实体头;否则(例如,某个带条件的 GET 请求使用了弱缓存验证),本次响应禁止包含其他实体头
这避免了缓存了的实体内容和更新了的实体头信息之间的不一致。
假如某个304响应指明了当前某个实体没有缓存,那么缓存系统必须忽视这个响应,并且重复发送不包含限制条件的请求。
假如接收到一个要求更新某个缓存条目的304响应,那么缓存系统必须更新整个条目以反映所有在响应中被更新的字段的值。
305 Use Proxy
被请求的资源必须通过指定的代理才能被访问。Location 域中将给出指定的代理所在的 URI 信息,接收者需要重复发送一个单独的请求,通过这个代理才能访问相应资源。只有原始服务器才能建立305响应。
注意:RFC 2068中没有明确305响应是为了重定向一个单独的请求,而且只能被原始服务器建立。忽视这些限制可能导致严重的安全后果。
306 Switch Proxy
在最新版的规范中,306状态码已经不再被使用。
307 Temporary Redirect
请求的资源临时从不同的URI 响应请求。
新的临时性的URI 应当在响应的 Location 域中返回。除非这是一个HEAD 请求,否则响应的实体中应当包含指向新的URI 的超链接及简短说明。因为部分浏览器不能识别307响应,因此需要添加上述必要信息以便用户能够理解并向新的 URI 发出访问请求。
如果这不是一个GET 或者 HEAD 请求,那么浏览器禁止自动进行重定向, 除非得到用户的确认,因为请求的条件可能因此发生变化。
请求错误4XX:
这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。除非响应的是一个 HEAD 请求,否则服务器就应该返回一个解释当前错误状况的实体,以及这是临时的还是永久性的状况。这些状态码适用于任何请求方法。浏览器应当向用户显示任何包含在此类错误响应中的实体内容。
如果错误发生时客户端正在传送数据,那么使用TCP的服务器实现应当仔细确保在关闭客户端与服务器之间的连接之前,客户端已经收到了包含错误信息的数据包。如果客户端在收到错误信息后继续向服务器发送数据,服务器的TCP栈将向客户端发送一个重置数据包,以清除该客户端所有还未识别的输入缓冲,以免这些数据被服务器上的应用程序读取并干扰后者。
400 Bad Request
1、语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
2、请求参数有误。
401 Unauthorized
当前请求需要用户验证。该响应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。客户端可以重复提交一个包含恰当的 Authorization 头信息的请求。如果当前请求已经包含了 Authorization 证书,那么401响应代表着服务器验证已经拒绝了那些证书。如果401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展示响应中包含的实体信息,因为这个实体信息中可能包含了相关诊断信息。参见RFC 2617。
402 Payment Required
该状态码是为了将来可能的需求而预留的。
403 Forbidden
服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。如果这不是一个 HEAD 请求,而且服务器希望能够讲清楚为何请求不能被执行,那么就应该在实体内描述拒绝的原因。当然服务器也可以返回一个404响应,假如它不希望让客户端获得任何信息。
404 Not Found
请求失败,请求所希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。假如服务器知道情况的话,应当使用410状态码来告知旧资源因为某些内部的配置机制问题,已经永久的不可用,而且没有任何可以跳转的地址。404这个状态码被广泛应用于当服务器不想揭示到底为何请求被拒绝或者没有其他适合的响应可用的情况下。出现这个错误的最有可能的原因是服务器端没有这个页面。
405 Method Not Allowed
请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow 头信息用以表示出当前资源能够接受的请求方法的列表。
鉴于 PUT,DELETE 方法会对服务器上的资源进行写操作,因而绝大部分的网页服务器都不支持或者在默认配置下不允许上述请求方法,对于此类请求均会返回405错误。
406 Not Acceptable
请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。
除非这是一个 HEAD 请求,否则该响应就应当返回一个包含可以让用户或者浏览器从中选择最合适的实体特性以及地址列表的实体。实体的格式由 Content-Type 头中定义的媒体类型决定。浏览器可以根据格式及自身能力自行作出最佳选择。但是,规范中并没有定义任何作出此类自动选择的标准。
407 Proxy Authentication Required
与401响应类似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个 Proxy-Authenticate 用以进行身份询问。客户端可以返回一个 Proxy-Authorization 信息头用以验证。参见RFC 2617。
408 Request Timeout
请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端可以随时再次提交这一请求而无需进行任何更改。
409 Conflict
由于和被请求的资源的当前状态之间存在冲突,请求无法完成。这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突,并且会重新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。
冲突通常发生于对 PUT 请求的处理中。例如,在采用版本检查的环境下,某次 PUT 提交的对特定资源的修改请求所附带的版本信息与之前的某个(第三方)请求向冲突,那么此时服务器就应该返回一个409错误,告知用户请求无法完成。此时,响应实体中很可能会包含两个冲突版本之间的差异比较,以便用户重新提交归并以后的新版本。
410 Gone
被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。这样的状况应当被认为是永久性的。如果可能,拥有链接编辑功能的客户端应当在获得用户许可后删除所有指向这个地址的引用。如果服务器不知道或者无法确定这个状况是否是永久的,那么就应该使用404状态码。除非额外说明,否则这个响应是可缓存的。
410响应的目的主要是帮助网站管理员维护网站,通知用户该资源已经不再可用,并且服务器拥有者希望所有指向这个资源的远端连接也被删除。这类事件在限时、增值服务中很普遍。同样,410响应也被用于通知客户端在当前服务器站点上,原本属于某个个人的资源已经不再可用。当然,是否需要把所有永久不可用的资源标记为'410 Gone',以及是否需要保持此标记多长时间,完全取决于服务器拥有者。
411 Length Required
服务器拒绝在没有定义 Content-Length 头的情况下接受请求。在添加了表明请求消息体长度的有效 Content-Length 头之后,客户端可以再次提交该请求。
412 Precondition Failed
服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其希望的内容以外的资源上。
413 Request Entity Too Large
服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围。此种情况下,服务器可以关闭连接以免客户端继续发送此请求。
如果这个状况是临时的,服务器应当返回一个 Retry-After 的响应头,以告知客户端可以在多少时间以后重新尝试。
414 Request-URI Too Long
请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:
本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。
重定向URI “黑洞”,例如每次重定向把旧的 URI 作为新的 URI 的一部分,导致在若干次重定向后 URI 超长。
客户端正在尝试利用某些服务器中存在的安全漏洞攻击服务器。这类服务器使用固定长度的缓冲读取或操作请求的 URI,当 GET 后的参数超过某个数值后,可能会产生缓冲区溢出,导致任意代码被执行[1]。没有此类漏洞的服务器,应当返回414状态码。
415 Unsupported Media Type
对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。
416 Requested Range Not Satisfiable
如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码。
假如 Range 使用的是字节范围,那么这种情况就是指请求指定的所有数据范围的首字节位置都超过了当前资源的长度。服务器也应当在返回416状态码的同时,包含一个 Content-Range 实体头,用以指明当前资源的长度。这个响应也被禁止使用 multipart/byteranges 作为其 Content-Type。
417 Expectation Failed
在请求头 Expect 中指定的预期内容无法被服务器满足,或者这个服务器是一个代理服务器,它有明显的证据证明在当前路由的下一个节点上,Expect 的内容无法被满足。
418 I'm a teapot
421 Too Many Connections
There are too many connections from your internet address
从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。通常,这里的IP地址指的是从服务器上看到的客户端地址(比如用户的网关或者代理服务器地址)。在这种情况下,连接数的计算可能涉及到不止一个终端用户。
422 Unprocessable Entity
请求格式正确,但是由于含有语义错误,无法响应。(RFC 4918 WebDAV)
423 Locked
当前资源被锁定。(RFC 4918 WebDAV)
424 Failed Dependency
由于之前的某个请求发生的错误,导致当前请求失败,例如 PROPPATCH。(RFC 4918 WebDAV)
425 Too Early
状态码 425 Too Early 代表服务器不愿意冒风险来处理该请求,原因是处理该请求可能会被“重放”,从而造成潜在的重放攻击。(RFC 8470) [1]
426 Upgrade Required
客户端应当切换到TLS/1.0。(RFC 2817)
449 Retry With
由微软扩展,代表请求应当在执行完适当的操作后进行重试。
451 Unavailable For Legal Reasons
该请求因法律原因不可用。(RFC 7725)
服务器错误5,6XX:(5、6字头)
这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。除非这是一个HEAD 请求,否则服务器应当包含一个解释当前错误状态以及这个状况是临时的还是永久的解释信息实体。浏览器应当向用户展示任何在当前响应中被包含的实体。
这些状态码适用于任何响应方法。
500 Internal Server Error
服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。
501 Not Implemented
服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502 Bad Gateway
作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503 Service Unavailable
由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,那么客户端应当以处理500响应的方式处理它。
注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接。
504 Gateway Timeout
作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。
注意:某些代理服务器在DNS查询超时时会返回400或者500错误
505 HTTP Version Not Supported
服务器不支持,或者拒绝支持在请求中使用的 HTTP 版本。这暗示着服务器不能或不愿使用与客户端相同的版本。响应中应当包含一个描述了为何版本不被支持以及服务器支持哪些协议的实体。
506 Variant Also Negotiates
由《透明内容协商协议》(RFC 2295)扩展,代表服务器存在内部配置错误:被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点。
507 Insufficient Storage
服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。WebDAV (RFC 4918)
509 Bandwidth Limit Exceeded
服务器达到带宽限制。这不是一个官方的状态码,但是仍被广泛使用。
510 Not Extended
获取资源所需要的策略并没有被满足。(RFC 2774)
600 Unparseable Response Headers
源站没有返回响应头部,只返回实体内容。
HTTP状态码(英语:HTTP Status Code)是用以表示网页服务器超文本传输协议响应状态的3位数字代码。它由 RFC 2616 规范定义的,并得到 RFC 2518、RFC 2817、RFC 2295、RFC 2774 与 RFC 4918等规范扩展。所有状态码的第一个数字代表了响应的五种状态之一。所示的消息短语是典型的,但是可以提供任何可读取的替代方案。
除非另有说明,状态码是HTTP / 1.1标准(RFC 7231)的一部分。
HTTP状态码的官方注册表由互联网号码分配局(Internet Assigned Numbers Authority)维护。
微软互联网信息服务(Microsoft Internet Information Services)有时会使用额外的十进制子代码来获取更多具体信息,但是这些子代码仅出现在响应有效内容和文档中,而不是代替实际的HTTP状态代码.
原生ajax如何获取返回的数据?
每当ajax对象
的readyState属性值
发生变化时 都会触发onreadystatechange事件
,readyState
我们发现触发了3次,值为4
的那一次是返回数据的状态 需要判断。我如果服务器返回的状态码是404,readyState值
也是4,就成功拿到数据,返回的数据在ajax对象
的responseText属性
里面。
ajax中responseText与responseXML区别:
"responseText”
属性以字符串形式返回HTTP响应;“responseXML”
属性以XML形式返回HTTP响应。“responseXML”
属性返回了一份XML文档对象,可以使用W3C DOM节点树方法和属性对该XML文档对象进行检查和解析。get和post有什么区别:
get方式给服务器提交数据:
通过.open()
方法 在服务器链接地址后面通过?号
拼接参数
ajaxObj.open("get","服务器地址?键1=值1&键2=值2...")
;
post方式给服务器提交数据:
post提交的数据在.send()
方法里面
ajaxObj.send("键1=值1&键2=值2...")
;
请求: 有客户端发送用来触发一个服务器的动作。
响应: 来自服务器的应答。
HTTP请求方法:
GET 请求指定的页面信息,并返回实体主体。
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。
PUT 从客户端向服务器传送的数据取代指定的文档的内容。
DELETE 请求服务器删除指定的页面。
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 允许客户端查看服务器的性能。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
HTTP请求的构成内容
- 请求行(request line)【动词 路径 协议/版本】
- 请求头部(header)【Key: value/Content-Type/Host/User-Agent】
- 空行
- 请求数据
下面是一个POST方法的请求报文
POST /index.php HTTP/1.1 请求行 Host: localhost 请求头 User-Agent:
Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101
Firefox/10.0.2 Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5 Accept-Encoding: gzip, deflate
Connection: keep-alive Referer: http://localhost/ Content-Length:25
Content-Type:application/x-www-form-urlencoded 空行
username=aa&password=1234 请求数据
利用chrome的开发者工具来查看请求实例
HTTP响应
有请求,必有响应,下面我们来看一下HTTP的响应部分
HTTP响应的构成内容
状态行【协议版本,状态码,状态码描述】
1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。
利用chrome的开发者工具来查看响应实例
如何使用curl命令
curl
是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面。
以下是几种常用的curl的用法
直接在curl
命令后加上网址,就可以看到网页源码。
$ curl www.sina.com
保存网页
$ curl -o [文件名] www.sina.co
跳转网页
$ curl -L www.sina.com
显示http response的头信息
$ curl -i www.sina.com
服务器处理请求的流程:
服务器每次收到请求时,都会为这个请求开辟一个新的线程。
服务器会把客户端的请求数据封装到request对象中,request就是请求数据的载体!
服务器还会创建对象,这个对象与客户端连接在一起,它可以用来向客户端发送响应。
get方式给服务器提交数据:
通过.open()
方法 在服务器链接地址后面通过?号
拼接参数
ajaxObj.open("get","服务器地址?键1=值1&键2=值2...")
;
post方式给服务器提交数据:
post提交的数据在.send()
方法里面
ajaxObj.send("键1=值1&键2=值2...")
;
form表单本身具有post提交数据的能力ajax并不具备 因为form表单默认的enctype属性的默认值:
application/x-www-form-urlencoded
,这个值表示的意思就是 让当前数据具有post url编码能力提交给服务器后台,我们自己的头部并没有这个值。所以我们的ajax必须在.open()
之后.send()
之前添加修改一个头部信息:ajaxObj.setRequestHeader("Content-type","application/x-www-form-urlencoded")
;
类型:String
预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML。在 1.4 中,JSON 就会生成一个 JavaScript 对象,而 script 则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。
可用值:
“xml”: 返回 XML 文档,可用 jQuery 处理。
“html”: 返回纯文本 HTML 信息;包含的 script 标签会在插入 dom 时执行。
“script”: 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了 “cache” 参数。注意:在远程请求时(不在同一个域下),所有 POST 请求都将转为 GET 请求。(因为将使用 DOM 的 script标签来加载)
“json”: 返回 JSON 数据 。
“jsonp”: JSONP 格式。使用 JSONP 形式调用函数时,如 “myurl?callback=?” jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
“text”: 返回纯文本字符串
JavaScript Object Notation
)一种简单的数据格式,比xml更轻巧。JSON是JavaScript原生格式。https://github.com/douglascrockford/JSON-js
后,使用JSON.parse()方法将字符串解析为JOSN对象var xhr = null;
if (window.XMLHttpRequest) {
xhr = new XMLHttpRequest();
} else if (window.ActiveXObject) {
//兼容IE浏览器
xhr = new ActiveXObject("Microsoft.XMLHttp");
}
同步模式:就是后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的。
异步模式:则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务的排列顺序是不一致的、异步的。
封装过,在封装过程中,步骤比较繁琐;
jQuery.ajax([settings])
;
data = eval_r("(" + data + ")")
;返回json对象;(方法的返回值是Javabean时,在响应体中响应成json字符串格式)同源策略 指的是:协议,域名,端口相同,同源策略是一种安全协议。
跨域 指一段脚本只能读取来自同一来源的窗口和文档的属性。
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。
js原生的jsonp跨域
前端:
后端:
1. 利用callback获取提交的方法名
2. 返回一个方法名+()拼接的一个方法格式的调用
3. 并在()括号里面传入要发送给前端的发送的数据;
jq的jsonp跨域
<script>
//前端
$.ajax({
url:"跨域的地址"
//将datatype进行修改 dataTyep:"jsonp", success:function(res){ console.log(res) }
})
</script>
//后端
//动态获取方法名 $method_name=$_GET["callback"]; echo $method_name."('传输的数据')" ?>
如果想更改别的方法名的话
$.ajax({
jsonp:"修改的callback这个键的";
dataType:'jsonp' //如果想修改方法名的话 jsoncallback:“修改jq默认生成的那个函数名的”
})
header("Access-Control-Allow-Origin:*");
表示的是允许用什么域名过来跨域访问 header("Access-Control-Allow-Method:GET/POST");
表示的是允许什么方式来跨域访问 header("Access-Control-Max-Age:1000");
允许跨域访问的最大缓存时间.用来记录文本规则的代码。
\d [0-9] 数字字符
;
\D [^0-9] 非数字字符
;
\s [ \t\n\x0B\f\r] 空白字符
;
\S [^ \t\n\x0B\f\r] 非空白字符
;
\w [a-zA-Z_0-9] 单词字符
;
\W [^a-zA-Z_0-9] 非单词字符
;
原因:
优点:
4. 解决原生js的dom层叠覆盖问题。
5. 几乎可以解决原生js代码容错性差的问题。
6. 几乎没有兼容问题。
7. 更加简单的实现功能。
区别:jq主要针对的是js的DOM的封装,几乎全是方法调用。
"$()"
一层马甲,这是最直观的区别;div.text()
;——无参数的情况下是取值
;div.text("aaaa")
;——有参数的情况下是赋值
;div.html()
;——无参数的情况下是取值
;div.html("aaaa")
;——有参数的情况下是赋值
;JS
:div.value;——取值
;div.value = xxx;——赋值
;jQuery
:div.val()
;——无参数是取值,有参数是赋值
。JS
里面用来操作属性的方法是:div.setAttribute("","")
;——设置属性、修改属性;div.removeAttribute("")
;——移除属性,引号里面写一个属性名;div.getAttribute()
;——获取属性;jQuery
里面用来操作属性的方法:div.attr("test","aa")
;——给这个attr方法加入参数,属性名叫做test,属性的值是aa;div.removeAttr("test")
;——移除test这条属性;div.attr("test")
;——在attr方法里面直接写入一个属性的名就可以了;style
div.style.backgroundColor = "red"
;——把这个div的背景色设置成为了红色;div.css("background-color","yellow")
;——把这个div的背景色变为黄色,在这里CSS里面所有的样式和css样式表里面的样式是一模一样的没有任何变化JS
操作样式的方法只能获取内联样式
,不能取内嵌的和外部的!jQuery
操作样式的方法可以是内联
的也可以是内嵌的
。JQ转换JS
JQ对象.get(索引值)
返回值就是JS对象JQ对象[ 索引值 ]
JS转换JQ::$( js对象 )
;
:first
$( “选择器 : first” ) 表示在已选择的众多元素中,选取第一个元素。:last
—— 选取最后一个元素。:odd
——找到索引值为奇数的元素 。:even
——找到索引值为偶数的元素 。:eq ( index )
——找到指定索引值的那个元素。:it(index)
—— 找到比当前it索引值还小的元素,不包括自己。:gt(index)
——找到比当前gt索引值还大的元素,不包括自己。:not( 选择器 )
——排除not选择器的元素,选择剩下的。.parent()
.children(selector)
.find(selector)
.sibling(selector)
.first( )
.last( )
.eq(index)
.next( )
.prev( )
class:
addClass("类名")
增加一个类removeClass("类名")
删除一个类hasClass("类名")
判断是否包含指定类名toggleClass("类名")
判断是否包含指定类名(包含自动删除,不包含自动添加)css:
$( "选择器" ). css("css属性名")
表示获取元素指定css属性值(包括内嵌,外链)$( "选择器" ). css("属性名","属性值")
设置元素单个css样式$( "选择器" ). css(json对象)
可以一次性设置多个css样式show() 显示动画:
hidden() 隐藏动画:toggle(毫秒值)显示隐藏切换动画
参数格式跟show一样,不过hidden最后是display:none。
滑入动画:slideDown()
参数跟滑入滑出一样,控制的是opacity
淡入:fadeIn()
淡出:fadeOut()
淡入淡出切换:fadeToggle()
fadeTo(毫秒值,透明度):表示淡入淡出到指定透明度
参数:
对象.stop(boolean,boolean) :传入两个布尔值,默认都是false
第一个参数表示动画是否要执行(true:后续动画不执行;false:后续动画执行)
第二个参数表示当前动画是否执行完(true:立即执行;false:立即停止)
如果传入两个false:
马上去执行下一个排队的动画,然后立马停止当前进行的动画。
创建节点对象
var $newDiv= $("
;
在页面上拼接节点对象
父节点.append(标签字符串或者节点对象)
;
子节点对象.appendTo(父节点对象)
;
上面两个 都是拼接到父节点最后一位
父节点.prepend(标签字符串或者节点对象)
;
子节点对象.prependTo(父节点对象)
;
3.兄弟节点之前插入
节点对象.before(标签字符串/节点对象)
;
4.兄弟节点之后插入
节点对象.after(标签字符串/节点对象)
;
总结:
append prepend after before
这四个方法 参数都能传入标签字符串 或者 节点对象
appendTo和prependTo不行 必须是节点对象调用
html方法的使用
元素.html("新标签内容")
;把元素内部所有内容清空 并替换新内容
元素.html("")
;清空当前元素内部所有内容
元素.html()
;表示获取元素内部所有内容 返回字符串
text方法的使用 跟innerText效果一样,具体使用跟上面一样
JQ清空元素的操作 :
$("#box").html("")
;
元素"自杀" 表示连自己也干掉
$("#box").empty()
;
JQ的clone 默认是带着内部内容一起克隆
虽然JQ的clone参数也是传一个布尔值但是这个布尔值表示:
一个布尔值(true 或者 false)
指示事件处理函数是否会被复制。
V1.5以上版本默认值是:false
是否复制标签上面的事件
实际操作不好用!!
JQ是通过attr方法 来实现原生js的这三个功能
元素.attr("属性名","属性值")
;元素.removeAttr("属性名")
;元素.attr("已经存在的属性名","新属性值")
;元素的.attr("属性名")
返回当前属性节点的值但是:
三个特殊的哥们(属性) 无法通过attr进行操作
checked selected disabled
需要通过 .prop()方法
操作
.prop()
方法跟.attr()
方法操作一模一样
经过测试 attr无法操作checked属性 只有第一次生效 后面不生效
有简单事件绑定$("选择器").事件名称(驱动函数)
,delegate事件绑定和on事件绑定,jq1.7版本后,用on统一了所有事件的处理方法,整合了delegate批量添加事件减少绑定次数,自带委托功能可以一次性添加多个事件的优点。
JQ给元素绑定事件的方式:
简单事件绑定 $("选择器").事件名称(驱动函数)
delegate方式绑定事件 父元素.delegate("子元素选择器","不带on的事件名称",事件驱动函数)
优点:
jQuery1.7版本后,jQuery用on统一了所有的事件处理的方法
给匹配的元素绑定事件,包括了上面所有绑定事件方式的优点
格式:父元素.on("不到on的事件名称","子代或者后代选择器",data(传给事件所需要的数据),事件驱动函数)
当前方法return this
,这个this
就表示当前已经设置好的对象返回给下一个调用者。
原理:在图片没有进入可视区域时,先不给的src赋值,这样浏览器就不会发送请求了,等到图片进入可视区域再给src赋值。
作用:jQ自带影式迭代操作就是内部自动帮助我们完成循环需要对每个元素单独操作,但是在某些情况下 我们还是需要每个模式单独操作就需要用到each方法。
使用:$("选择器").each(function(索引值,ele元素){ })
,选择器选择几个元素那么回调函数就会触发几次,会针对每个元素执行一次回调函数,把当前元素索引值和元素js对象
传入回调函数。
就是可以同时引入多个版本的JQ,还可以同时调用任意切换哪个版本的JQ。
编写一个jQuery插件开始于给jQuery.fn加入??新的功能属性,开始编写实际的插件代码,调用一个对象参数,包含你了你想覆写的设置。
1、插件的包装
2、环境
3、默认值和选项
4、插件里面可以有多个自定义方法
执行了事件驱动函数里面的代码,但是又不用去操作事件。
如何:on绑定事件,通过focus或者trigger两种事件触发的方法,出发事件。
5-8个页面,前端2-3人 后台1-2人
这个项目主要以销售酒类为主,以及实现客户的登录状态,
外观样式:主要以红色主题为主,
特效部分:主要使用的是jQUery框架来进行封装轮播图,页面还添加了倒计时抢购功能
由后台给的接口调用到接口
我一般先创建一个所有接口地址的文件从这个文件中调动所要用的接口,
调用到所需要的接口利用ajax的方法实现异步的数据传输,
利用cookie方法来保存用户的登录状态,也可以将用户id存储于一个cookie内
这样当用户下次访问该页面时就不需要重新登录了
在js文件中判断是否接收到数据,接收成功利用jQuery中.HTML()来渲染到页面上
主要涉及到多个轮播图效果的时候我选择了封装轮播图,
还有一些网页模块需要懒加载的地方我也选择了把懒加载封装来调用懒加载来请求数据
首先封装懒加载需要知道scroll 和client有兼容问题 所有把scroll和client也做了兼容性封装
其次要知道懒加载的原理是由盒子到body的距离减去浏览器可视区域的高度还有盒子距离顶部的距离加上盒子自身的高度
就是盒子底部到body的距离然后在判断是否滚动到盒子的范围 最后利用开闭原则控制加载次数
确保代码尽量简洁,代码中用到了事件委托减少了循环绑定事件提高了性能,也利用了立即执行函数的结构来写
数据存在mysql数据库 和 php实现
把他们的注册接口放在同一个文件里,通过ajax调用这些接口。
常见数据库操作:
create database database_name
;//建数据库create table table_name(id INT(11),name VARCHAR(11));
//数据表
<html>
<head>
<title>Finding Usertitle>
head>
<body>
<h2>Finding Users from mysql database.h2>
<form action="info.php" method="post">
Fill user's number:
<input type="text" name="username" size="20"> <br>
<input type="submit" name="submit" value="Find">
form>
body>
html>
$db=mysqli_connect('localhost','root','','mytest')
;表示连接数据库mytest的对象,$q1(2,3)
表示查询数据的对象,mysqli_query(数据库服务器链接对象,SQL语句)
在数据库中执行SQL语句;<!DOCTYPE html>
<html>
<head>
<title>users found</title>
</head>
<body>
$usernumber= $_POST['username'];
//数据接收是否成功
// if($username)
// {
// echo "Error: There is no data passed";
// exit();
// }
$len = strlen($usernumber);//获取长度
//phpinfo();
$db=mysqli_connect('localhost','root','','mytest');//连接数据库
//因为我们学校本科学生学号有10位,研究生9位,老师工号6位,所以要判断长度
if($len==10)
{
$q1="SELECT * FROM stu_bks WHERE XH ='".$usernumber."'";//SQL查询语句
$result1 = mysqli_query($db,$q1);//执行SQL语句
$rownum = mysqli_num_rows($result1);//获取查询结果集中的记录数
for($i=0;$i<$rownum;$i++)
{
$row=mysqli_fetch_assoc($result1);//从数组结果集中获取信息,关联数组形式返回
$infoarr_bks=array('学号'=>$row['XH'],'姓名'=>$row['name'],'年龄'=>$row['age']);
print_r($infoarr_bks);//输出数组
}
mysqli_free_result($result1);//释放查询的数据资源
}
if($len=6)
{
$q3="SELECT * FROM tea_fdy WHERE GH = '".$usernumber."'";
$result3= mysqli_query($db,$q3);
$rownum = mysqli_num_rows($result3);
for($i=0;$i<$rownum;$i++)
{
$row2=mysqli_fetch_assoc($result3);
$infoarr_fdy=array('工号'=>$row2['GH'],'姓名'=>$row2['name'],'性别'=>$row2['sex']);
print_r($infoarr_fdy);
}
mysqli_free_result($result3);
}
if ($len=9) {
$q2="SELECT * FROM stu_yjs WHERE XH ='".$usernumber."'";
$result2 = mysqli_query($db,$q2);
$rownum = mysqli_num_rows($result2);
for($i=0;$i<$rownum;$i++){
$row=mysqli_fetch_assoc($result2);
$infoarr_yjs=array('学号'=>$row['XH'],'姓名'=>$row['name']);
print_r($infoarr_yjs);
}
mysqli_free_result($result2);
}
mysqli_close($db);//关闭数据库
?>
</body>
</html>
查询结果:
js分为值类型和引用类型(基本数据类型和复杂数据类型)
基本数据类型有:Boolean ,Number ,String
复杂数据类型有:Object,Function,Array,Math,Date
还有些特殊类型:undefined,null,NaN
基本数据类型和引用数据类型他们的区别就在于:他们的存储不同,基本数据类型存储在栈内存中;引用数据类型声明在栈内存,内容在堆内存,用地址关联。
那么在使用的时候呢,基本数据类型在赋值时只进行值的复制,而引用数据类型则进行的是地址传递。
面向对象是一种编程思想,在他的概念中是一切皆对象强调对象调用功能,让我们从执行者变成指挥者,它是一个基于面向过程的编程思想,而面向过程是一种直接调用函数调用方法,一切功能皆函数的一种方式,而面向对象由原来的各种调用函数变成对象调用函数,在js中他是属于基于对象的一个脚本语言,面向对象强调的是以对象为主。
构造函数.prototyp
e和对象.__proto__
不推荐使用__proto__
直接绑定到原型修改原型数据,因为后期维护不方便js的继承是对象继承不是模板继承,js继承它属于对象继承其实属于半继承,它并不属于强类型语言那种模板继承;
上级作用域访问下级作用域可以return
一个函数调用内部数据,因为上级作用域无法调用到下级作用域的数据,而下级的函数可以访问到上级的变量数据所有要在下级返回一个函数给最上级的用。
call
和apply
就是实现上下文调用模式的两个方式
call
和apply
作为函数调用的一种模式,它属于函数上下文调用
函数调用一共分四种它算第四种
它的优点在于能够改变方法内部的this指向
call
方法是靠多个参数来匹配当前函数的形参
apply
是靠一个数组来匹配当前函数的形参
跟当前页面加载不同步,是页面加载完毕回头执行的一个函数
比如:事件,ajax,定时器
jsonp是一种跨域请求;
前端:
后端:
String(字符串)
Integer(整型)
Float(浮点型)
Boolean(布尔型)
Array(数组)
;header("Content-type:text/html;charset=utf-8")
;echo $str."10"
;.
进行拼接的var boo=true;
if(boo){
echo "今天中奖了"
}else{
echo" 谢谢惠顾
"};
2.switch语句
$num=2;
switch($num){
case1: echo"打开一号宝藏";
break;
case2: echo "打开二号宝藏";
break;
case3: echo"打开三号宝藏";
break;
default: echo"谢谢惠顾" ;
break
}
3.for循环语句
for(var $i=0;$i<10;$i++){
echo $i."br"
}
$num=0; while($num<10){
echo $num." ";
$num++
}
区分:
小型数据库一般都是一些单机版软件使用的;比如office里面的一个套件ACCES
,VFP
,mysql
等
数据库的大型、中型、大型是这样来区的:
主要是使用的范围,如果用在大型的商业软件中,那么他一处理数据能力也是非常强的。这里有分为十万级数据处理,百万级的数据,千万级,亿万级的数据处理能力来划分。
这个标准还一直在不断被刷新。不过一般大型的数据库常见的有;mysql ,Oracle,Sybase等。
$arr=array("关羽","刘备","张飞")
;count($arr)
;for($i=0;i<$count($arr);$i++){
$arr[i]
}
$arr=array(键=>值,键=>z值)
;$arr=$array("name"=>"张飞","age"=>16,"length"=>2.3)
;$arr["name"];$["age"]
;foreach(数组名 as 自定义键=>自定义值)
;将用户上传的需要被保护的信息进行加密处理,利用jqurey的插件,生成md5的密码,然后再对生成的密码进行二次加工,封装一个自己的算法的函数,再进行调用
var arr=[]; for(var k in o){ if(k!=length){ arr.push(o[k]) } }
;var arr=Array.protype.concat.apply([],o)
[].concat.apply(o[0],o[1],o[2],o[3])
;1.md5加密
2.页面加密构建,对代码进行加密混淆