ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
>### A.今天学什么? #### 1.正则补充 - ##### 1.1 正则的一些属性 - global -g 是否全文搜索,默认false - ignore -i 是否忽略大小写,默认false - test() --> 字符串中是否存在匹配正则表达式的字符串,用来做局部匹配,所以不要加全局搜索 - lastIndex --> 当前表达式匹配内容的最后一个字符的下一个位置 - 如果加了g,全局匹配。会有一个lastIndex属性,用于获取下一个要匹配的下标 ``` // body <body> <script> // global -g 是否全文搜索,默认false // ignore -i 是否忽略大小写,默认false var str = "hello chunjue LL"; var RE = /l/ig; console.log(str.replace(RE,"*")); // test() --> 字符串中是否存在匹配正则表达式的字符串,用来做局部匹配,所以不要加全局搜索 // lastIndex --> 当前表达式匹配内容的最后一个字符的下一个位置 var str2 ="ab"; var RE2 = /[a-z]/; // 如果加了g,全局匹配。会有一个lastIndex属性,用于获取下一个要匹配的下标 // 匹配a的时候,得到的lastIndex=1,匹配b的时候,得到的lastIndex=2,然而下标为2的地方并没有值,所以返回false while (RE2.test(str2)){ console.log(RE2.lastIndex); // 1 2 } </script> </body> ``` - ##### 1.2 贪婪模式 - 贪婪模式 --> 默认会取量词中最大的值 - 懒惰模式 --> ? 取消贪婪模式 --> 只要符合正则就停下来 ``` // body <body> <script> var a = "123456abc"; var RE = /\d{3,6}/; // 贪婪模式 --> 默认会取量词中最大的值 console.log(a.replace(RE,"*")); // *abc 可以看到,123456一起被替换为* // 懒惰模式 --> ? 取消贪婪模式 --> 只要符合正则就停下来 var noRE = /\d{3,6}?/; console.log(a.replace(noRE,"*")); // *456abc </script> </body> ``` #### 2.js内置对象--日期 - ##### 2.1方法介绍 - 获得日期对象 --> var oDate = new Date(); - 获得年 --> var year = oDate.getFullYear(); - 获得月 --> var month = oDate.getMonth()+1; 月 getMonth() 月份从0开始,所以要加1 - 获得日 --> var date = oDate.getDate(); - 获得星期 --> var day = oDate.getDay(); - 获得小时、分钟、秒 - var hour = oDate.getHours(); - var minute = oDate.getMinutes(); - var second = oDate.getSeconds(); ``` // body <body> <script> var oDate = new Date(); console.log(oDate); // 年 var year = oDate.getFullYear(); console.log(year); // 月 getMonth() 月份从0开始,所以要加1 var month = oDate.getMonth()+1; console.log(month); // 日 var date = oDate.getDate(); console.log(date); // 周几 var day = oDate.getDay(); console.log(day); // 小时 分钟 秒 var hour = oDate.getHours(); var minute = oDate.getMinutes(); var second = oDate.getSeconds(); console.log(hour+":"+minute+":"+second); </script> </body> ``` - ##### 2.2 日期对象搭配定时器制作页面时间 ``` // body <body> <div> <img src="images/0.png" alt=""> <img src="images/0.png" alt=""> <img src="images/0.png" alt=""> <img src="images/0.png" alt=""> <img src="images/0.png" alt=""> <img src="images/0.png" alt=""> </div> <script> function showTime() { var clocks = document.getElementsByTagName("img"); var oDate = new Date(); var hour = oDate.getHours(); var minute = oDate.getMinutes(); var second = oDate.getSeconds(); // 1.将时间变为字符串,拼接起来 // 2.将它们分割成数组 // 3.让allTime中对应的值显示对应的图片 // 如果时、分、秒 < 10,则在数字之前补一个0 --> 比如 09 function add(time) { if (time < 10){ // 拼接为字符串 return "0"+time; } else{ return time+""; } } var allTime = add(hour)+add(minute)+add(second); console.log(allTime); for (var i = 0;i < allTime.length;i++){ clocks[i].src = "images/"+allTime[i]+".png"; } } // 将显示时间整个封装为一个方法,利用定时器,每秒调用一次方法 // 在一开始就先调用一次showTime()方法 showTime(); setInterval(showTime,1000); </script> </body> ``` #### 3.Ajax --> 异步局部刷新页面技术 - ##### 3.1 json数据 - JavaScript Object Notation(JavaScript 对象表示法) - JSON 是存储和交换文本信息的语法。类似 XML。 - JSON 比 XML 更小、更快,更易解析。 - 例如:{ "data": { "content": "getTest"} } - json就是一种键值对,key必须双引号引起来 - json对象可以通过 json.key 获得 value值,和obj获得属性一样 - JSON.parse(str) --> 将json格式的字符串转换为json对象 - JSON.stringify(jsonObj) --> 将JSON对象转为字符串。 - ##### 3.2 原生js的Ajax如何使用 - 1.创建ajax的核心对象 --> var xhr = new XMLHttpRequest(); - 2.建立与服务器的连接 --> xhr.open(method,url,true) --> 第一个参数为请求方式,第三个参数是是否异步,默认为异步 true - 3.向服务器发送请求 --> xhr.send() - 4.服务器端响应 xhr.onreadystatechange = function (){} - 状态码要求:xhr.readyState === 4 && xhr.status === 200 - 接收服务器端返回数据 --> var response = xhr.responseText; 得到的是一个字符串 - ##### 3.3 AJAX 状态值(readyState)与状态码(status)详解 - AJAX运行步骤与状态值(readyState)说明 - 在AJAX实际运行当中,对于访问XMLHttpRequest(XHR)时并不是一次完成的,而是分别经历了多种状态后取得的结果,对于这种状态在AJAX中共有5种,分别是。 - 0 - (未初始化)还没有调用send()方法 - 1 - (载入)已调用send()方法,正在发送请求 - 2 - (载入完成)send()方法执行完成 - 3 - (交互)正在解析响应内容 - 4 - (完成)响应内容解析完成,可以在客户端调用了 - 对于上面的状态,其中“0”状态是在定义后自动具有的状态值,而对于成功访问的状态(得到信息)我们大多数采用“4”进行判断。 - AJAX状态码(status)说明 - 1**:请求收到,继续处理 - 2**:操作成功收到,分析、接受 - 3**:完成此请求必须进一步处理 - 4**:请求包含一个错误语法或不能完成 - 5**:服务器执行一个完全有效请求失败 - 100——客户必须继续发出请求 - 101——客户要求服务器根据请求转换HTTP协议版本 - 200——交易成功 - 201——提示知道新文件的URL - 202——接受和处理、但处理未完成 - 203——返回信息不确定或不完整 - 204——请求收到,但返回信息为空 - 205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件 - 206——服务器已经完成了部分用户的GET请求 - 300——请求的资源可在多处得到 - 301——删除请求数据 - 302——在其他地址发现了请求数据 - 303——建议客户访问其他URL或访问方式 - 304——客户端已经执行了GET,但文件未变化 - 305——请求的资源必须从服务器指定的地址得到 - 306——前一版本HTTP中使用的代码,现行版本中不再使用 - 307——申明请求的资源临时性删除 - 400——错误请求,如语法错误 - 401——请求授权失败 - 402——保留有效ChargeTo头响应 - 403——请求不允许 - 404——没有发现文件、查询或URl - 405——用户在Request-Line字段定义的方法不允许 - 406——根据用户发送的Accept拖,请求资源不可访问 - 407——类似401,用户必须首先在代理服务器上得到授权 - 408——客户端没有在用户指定的饿时间内完成请求 - 409——对当前资源状态,请求不能完成 - 410——服务器上不再有此资源且无进一步的参考地址 - 411——服务器拒绝用户定义的Content-Length属性请求 - 412——一个或多个请求头字段在当前请求中错误 - 413——请求的资源大于服务器允许的大小 - 414——请求的资源URL长于服务器允许的长度 - 415——请求资源不支持请求项目格式 - 416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不- 包含If-Range请求头字段 - 417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求 - 500——服务器产生内部错误 - 501——服务器不支持请求的函数 - 502——服务器暂时不可用,有时是为了防止发生系统过载 - 503——服务器过载或暂停维修 - 504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长 - 505——服务器不支持或拒绝支请求头中指定的HTTP版本 ``` // body <body> <div id="text"></div> <script> // ajax --> 就是向服务器端取数据的一种技术,能做到页面的局部刷新,是异步的 // json数据,就是一种键值对的数据格式,key必须双引号引起来 var json = { "name" : "hello world", "arr" : [1,2,3], "age" : 19 }; // 如何使用ajax // 1.创建ajax的核心对象 var xhr = new XMLHttpRequest(); var text = document.getElementById("text"); // 2.建立与服务器的连接 // xhr.open(method,url,true) --> 第一个参数为请求方式,第三个参数是是否异步,默认为异步 true var url = "https://www.easy-mock.com/mock/5b3ae0bfd294426e05198b5a/AjaxTest/getTest"; xhr.open("get",url,true); // true为默认值 // 3.向服务器发送请求 --> xhr.send() xhr.send(); // 4.服务器端响应 xhr.onreadystatechange = function (){} // xhr.readyState和xhr.status为其状态码 xhr.onreadystatechange = function () { if(xhr.readyState === 4 && xhr.status === 200){ console.log(xhr.responseText); // JSON.parse();将json格式的字符串转为json对象 var response = JSON.parse(xhr.responseText); console.log(typeof response); // 获得key为data的value,然后再从value中获得key为content的value // json可以这样用 --> json.key = value text.innerHTML = response.data.content; } } </script> </body> ``` - ##### 3.4 jquery -- ajax - url --> 请求地址 - type --> 请求方式,默认是'GET',常用的还有'POST' - dataType --> 设置返回的数据格式,常用的是'json'格式,也可以设置为'html'等 - async --> 设置是否异步,默认值是'true',表示异步 - .done(function(data){}) --> 设置请求成功后的回调函数 - .fail(function(){}) --> 设置请求失败后的回调函数 - ##### 3.5 jquery的ajax的get请求 ``` // 先要使用script标签引入jquery,可以在百度CDN上查找jquery静态资源引入 地址为:http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js // body <body> <script> // jquery -- ajax // url --> 请求地址 // type --> 请求方式,默认是'GET',常用的还有'POST' // dataType --> 设置返回的数据格式,常用的是'json'格式,也可以设置为'html'等 // async --> 设置是否异步,默认值是'true',表示异步 // .done(function(data){}) --> 设置请求成功后的回调函数 // .fail(function(){}) --> 设置请求失败后的回调函数 $.ajax({ url: 'https://www.easy-mock.com/mock/5b3ae0bfd294426e05198b5a/AjaxTest/getTest', type: 'GET', dataType: 'json', data:{'aa':1} }) .done(function(data) { alert(JSON.stringify(data)); }) .fail(function() { alert('服务器超时,请重试!'); }); setTimeout(1000); // 更加简单的简写方式 var url = "https://www.easy-mock.com/mock/5b3ae0bfd294426e05198b5a/AjaxTest/getTest"; $.get(url,function (data) { console.log(JSON.stringify(data)); }).fail(function () { alert("服务器超时,请重试!"); }) </script> </body> ``` - ##### 3.6 jquery的ajax的post请求 ``` // body <body> <script> // post 请求方式,更改type即可 $.ajax({ url: 'https://www.easy-mock.com/mock/5b3ae0bfd294426e05198b5a/AjaxTest/postTest', type: 'POST', dataType: 'json', data:{'aa':1} }) .done(function(data) { alert(JSON.stringify(data)); }) .fail(function() { alert('服务器超时,请重试!'); }); setTimeout(1000); // 更加简单的简写方式 var url = "https://www.easy-mock.com/mock/5b3ae0bfd294426e05198b5a/AjaxTest/postTest"; // post请求简写时就写 $.post $.post(url,function (data) { console.log(JSON.stringify(data)); }).fail(function () { alert("服务器超时,请重试!"); }) </script> </body> ``` - ##### 3.7 axios的ajax请求 ``` // body <body> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script> // post方法同理 var url = "https://www.easy-mock.com/mock/5b3ae0bfd294426e05198b5a/AjaxTest/getTest"; axios.get(url).then(function (succuss) { console.log(succuss.request.responseText); }).catch(function (err) { console.log(err); }) </script> </body> ``` #### 4.跨域 - ##### 4.1 script标签实现跨域 - 要理解跨域,先要了解一下“同源策略”。所谓同源是指,域名,协议,端口相同。所谓“同源策略“,简单的说就是基于安全考虑,当前域不能访问其他域的东西。 - 协议: http or https - 域名: www.baidu.com or www.hao123.com - 端口号: https://www.a.com:8080 or https://www.a.com:9090 - img标签的src(获取图片),link 的href(获取css),script 的src(获取javascript)这三个都不符合同源策略,它们可以跨域获取数据。 - 这里要介绍的JSONP就是利用 script 的src来实现跨域获取数据的。 - JSONP实现跨域请求的原理简单的说,就是动态创建 script 标签,然后利用 script 的src 不受同源策略约束来跨域获取数据。 - JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。 - script标签,可以跨域请求静态资源等,所以用script实现跨域就是钻这个漏洞 ``` <body> <input type="text" id="song" name=""> <input type="button" id="song_search" value="歌曲搜索" name=""> <br /> <div style="width:300px;height:300px;background:pink" id="song_list"> <ul class="list"></ul> </div> <script type="text/javascript" src="../../static/js/jquery-1.12.4.min.js"></script> <script type="text/javascript"> // <img>的src(获取图片),<link>的href(获取css),<script>的src(获取javascript)这三个都不符合同源策略,它们可以跨域获取数据。 // 这里要介绍的JSONP就是利用<script>的src来实现跨域获取数据的。 // JSONP实现跨域请求的原理简单的说,就是动态创建<script>标签,然后利用<script>的src 不受同源策略约束来跨域获取数据。 // JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。 // script标签,可以跨域请求静态资源等,所以用script实现跨域就是钻这个漏洞 // handleResponse 用于处理服务器返回数据,回调函数 function handleResponse(response){ console.log(response.s); for (var i = 0;i < response.s.length;i++){ var $li = $('<li>' + response.s[i] + '</li>'); $li.insertAfter(".list"); } } $("#song_search").on("click",function(){ var keyword=$("#song").val(); if(keyword === undefined || keyword === ""){ alert("歌曲搜索不能为空"); return false; }else{ // 动态创建<script>标签,设置其src,回调函数在src中设置 // claaback=handleResponse --> 自动调用定义的handleResponse方法对返回的data进行操作 // handleResponse即为回调函数 var url = "https://sug.so.360.cn/suggest?word="+keyword+"&callback=handleResponse"; // 创建script标签,设置其属性 var script = document.createElement('script'); script.setAttribute('src', url); // 把script标签加入head,此时调用开始 document.getElementsByTagName('head')[0].appendChild(script); } }); </script> </body> ``` - ##### 4.2 jquery实现跨域及jquery的几个参数 - dataType(string) - "xml": 返回 XML 文档,可用 jQuery 处理。 - "html": 返回纯文本 HTML 信息;包含的script标签会在插入dom时执行。 - "script": 返回纯文本 JavaScript 代码。 - "json": 返回 JSON 数据 。 - "jsonp": JSONP 格式。开启跨域 - "text": 返回纯文本字符串 - jsonp(string) --> 一般不用,只定义一个jsonpCallback即可 - 回掉函数名的参数名,默认callback,服务端通过它来获取到回掉函数名 - jsonpCallback(string) --> 回掉函数名,默认jquery自动生成 - 指定jsonpCallback时可以将回掉函数写在ajax外面做其他操作,不指定时不能这样做,只能在success里做操作 - 定义jsonp和jsonpCallback后,后端返回数据,需要使用 jsonpCallback的值+"{return json 返回的json }"这样包起来 - 一般使用 String callback = Request.QueryString["callback"].ToString(); 获取,callback即为jsonp的值 - jquery实现跨域,将dataType属性改为jsonp即可 ``` // body <body> <script> // jquery跨域,将dataType的属性改为jsonp即可 /** *@dataType (String) *"xml": 返回 XML 文档,可用 jQuery 处理。 *"html": 返回纯文本 HTML 信息;包含的script标签会在插入dom时执行。 *"script": 返回纯文本 JavaScript 代码。"json": 返回 JSON 数据 。 *"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。 *"text": 返回纯文本字符串 */ /** *@jsonp (String)在一个jsonp请求中重写回调函数的名字。 *这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分, *比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。 */ /** *@jsonpCallback (String) *为jsonp请求指定一个回调函数名。这个值将用来取代jQuery自动生成的随机函数名。 *这主要用来让jQuery生成度独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。 *你也可以在想让浏览器缓存GET请求的时候,指定这个回调函数名。 */ $.ajax({ url:"https://api.douban.com/v2/book/search?q=javascript&count=1", type:"get", dataType:"jsonp", jsonpCallback:"a" }) .done(function(data){ console.log(JSON.stringify(data)); }) .fail(function(){ console.log('error'); }) </script> </body> ```