理解 JavaScript 库
什么是 JavaScript 库?就是把各种常用的代码片段,组织起来放在一个 js 文件里,组成一个包,这个包就是 JavaScript 库。现如今有太多优秀的开源 JavaScript 库,比如:jQuery、Swiper、 Prototype、Dojo、Extjs、Zepto 等等。这些 JavaScript 库已经把最常用的代码进行了有效的封装,以方便我们开发,从而提高效率。本章节,我们尝试自己封装一个js库,主要目的是提升我们的编程能力和面向对象的思维。
# 1. 对象字面量形式执行对象里面的方法达到简化获取对象节点的操作
新建一个/static/js/myBase.js文件,在里面编写最常用的代码,然后不断的扩展封装。
// let menu = document.getElementById('banner'); // console.log(menu.innerHTML); var myBase = { //整个库可以是一个对象 getId: function (id) { //方法尽可能简短而富有含义 return document.getElementById(id); }, getName: function (name) { return document.getElementsByName(name); }, getTagName: function (tag) { return document.getElementsByTagName(tag); } } let menu = myBase.getId('banner'); menu.setAttribute('data',456); menu.onclick = function(){ console.log('我是广告栏'); } //那么现在有新的需求了 menu.setAttribute('data',456).onclick = function(){ console.log('我是广告栏'); } //发现报错了 //console.log(menu.setAttribute('data',456));//undefined //那么如何进行连缀操作呢?连缀操作: 一个或者多个节点同时进行两个或以上的操作
# 2. 改写库对象:通过构造函数和原型改写库对象
我们上节课提到要实现连缀功能,我们来分析一下:
- myBase是一个基础库的核心对象,menu.setAttribute('data',456)返回的是什么?
- 返回的是一个undefined,没有onclick事件可以执行,那思考什么可以返回执行?;
- 有的同学会想到,就是我们上节课刚讲的面向对象,将menu.setAttribute('data',456)返回的结果改成myBase对象;
- myBase对象在添加一个click事件不就可以了吗?
- 即在myBase对象中添加html方法,click方法,setAttribute方法,css方法等等,就可以一直进行连缀操作了。即menu.setAttribute('data',456)应该返回myBase对象,不应该是undefined,menu.setAttribute('data',456).onclick 返回的也应该是myBase对象对象,这样就可以一直连缀下去。
menu.setAttribute('data',456).click(function(){ console.log('我是广告栏'); }).css('backgroundColor','red');
那么很明显,我们上面的库返回的是节点对象,没有机会了,因此我们要改写我们的基础库。我们需要返回一个对象,然后可以调用里面的方法,而创建一个对象,我们很容易想到我们上一个章节的面向对象与原型还有继承,创建对象我们可以用构造函数、原型还有类来创建,由于我们本季主要是教大家面向对象的编程思维和策略,因此我们不用类创建,关于类创建对象,我们后面有大型项目,在使用类,类里面的知识很多,我们上一章节只是讲了类的基础知识。回到我们的问题,我们先尝试通过构造函数来创建对象。
<div id="box">我是用来测试的</div> function Mybase(){ this.getId = function(id){ return document.getElementById(id); } } let mybase = new Mybase(); console.log(mybase.getId('box'));//还是节点对象 //我们需要mybase.getId('box')返回的是mybase对象,才能继续调用,那该如何写?//我们先用正常程序写一下这些功能 mybase.getId('box').style.color = 'red'; mybase.getId('box').style.backgroundColor = 'green'; mybase.getId('box').innerHTML = '我是box'; mybase.getId('box').setAttribute('data',123); mybase.getId('box').onclick = function(){ console.log('我被点了'); }; //我们现在希望通过连缀来完成: // mybase.getId('box').css('color','red').css('backgroundColor','green') // .html('我是box').attr('data',123).click(function(){ // console.log('我被点了'); // }) //因此,我们上面的程序,不应该返回document.getElementById(id);而应该返回this,this不就是我们的Mybase构造函数对象吗?
因此,我们需要创建一个数组,来保存获取的节点(id获取的是节点)和节点数组(其他方式获取的是节点数组)
# ① 获取id节点,返回实例对象mybase,给构造函数原型添加css方法
function Mybase(){ //创建一个数组,来保存获取的节点和节点数组 this.elements = []; //获取id节点 this.getId = function(id){ //return document.getElementById(id); this.elements.push(document.getElementById(id)); return this; }; // this.css = function(){} 这是操作,写这里不好管理,可以写在外面,写外面可以用原型方法 } Mybase.prototype.css = function(attribute,value){ //mybase.getId('box').style.color = 'red'; //mybase.getId('box').style.backgroundColor = 'green'; this.elements[0].style[attribute] = value; return this; } let mybase = new Mybase(); console.log(mybase.getId('box'));//返回mybase实例对象 //通过输出结果,我们可以看到可以在里面继续添加方法,如css方法,attr方法,html方法,click方法等 //接下来完成这步:mybase.getId('box').css('color','red') //mybase.getId('box').css('color','red'); mybase.getId('box').css('color','red').css('backgroundColor','green'); //同学们听完应该豁然开朗了,但是,我们的写法不够完美,因为数组用的下标,如果多个元素就不好办了
# ② 改写构造函数原型css方法,处理多个节点存放问题,html方法按照css方法进行扩展测试,扩展click方法
//获取元素节点 this.getTagName = function (tag) { //this.elements.push(document.getElementsByTagName(tag)); let tags = document.getElementsByTagName(tag); for(let i=0;i<tags.length;i++){ this.elements.push(tags[i]); } return this; } //执行元素节点 console.log(mybase.getTagName('p')); mybase.getTagName('p').css('color','blue');//发现只改了一个p //改写css方法 Mybase.prototype.css = function(attribute,value){ // mybase.getId('box').style.color = 'red'; // mybase.getId('box').style.backgroundColor = 'green'; //this.elements[0].style[attribute] = value; for(let i=0;i<this.elements.length;i++){ this.elements[i].style[attribute] = value; } return this; } //接着写html方法 Mybase.prototype.html = function(str){ // mybase.getId('box').innerHTML = '我是box'; for(let i=0;i<this.elements.length;i++){ this.elements[i].innerHTML = str; } return this; } mybase.getTagName('p').css('color','blue').html('我是段落p'); //接着扩展click方法 mybase.getTagName('p').css('color','blue').html('我是段落p').click(function(){ console.log('我被点了') }).css('backgroundColor','black'); Mybase.prototype.click = function(fn){ for(let i=0;i<this.elements.length;i++){ this.elements[i].onclick = fn; } return this; }//同时执行 mybase.getId('box').css('color','red').css('backgroundColor','green');有问题了 //发现我们执行的代码被后面的代码替代了,我们可以查看一下中控台 console.log(mybase); // this.elements[i]包含了id='box' 还有p的元素,因此设置p元素样式时候,会覆盖id='box'的元素 // 那么该怎么解决呢?此时我们应该想到,我们实例化的时候,就不该只实例化一个对象,因为我们操作的元素不同 // 我们应该实例化两个对象,分别来处理我们的div#box,p元素 //实例化多个对象 // let mybase1 = new Mybase(); // let mybase2 = new Mybase(); let $ = function(){ return new Mybase(); } $().getId('box').css('color','red').css('backgroundColor','green'); $().getTagName('p').css('color','blue').html('我是段落p').click(function(){ console.log('我被点了') }).css('backgroundColor','black');
# ③ 改造html方法,可以设置或者获取内容
在上一节课我们通过 html()方法和 css()方法可以设置内容和 CSS 样式,但我们如何通过这两个方法来获取内容或样式呢?比如:
console.log($().getId('box').html()); //获取内容 console.log($().getId('box').css('fontSize')); //获取 CSS 样式要实现获取内容,只要判断传递过来的参数即可
//设置或者获取内容 Mybase.prototype.html = function (str) { // mybase.getId('box').innerHTML = '我是box'; for (let i = 0; i < this.elements.length; i++) { //判断传参 arguments.length if (arguments.length == 0) { //没有传参 return this.elements[i].innerHTML;//返回内容 } else { this.elements[i].innerHTML = str; } } return this; } // console.log($().getId('box').html());//获取内容 // console.log($().getId('box').html('我是p标签'));//设置内容
# ④ 改造css方法,可以设置获取css样式
<div id="box" style="font-size: 20px;">我是测试的</div> // $().getId('box').css('fontSize','100px'); // console.log($().getId('box').css('fontSize')); //获取 CSS 样式 Mybase.prototype.css = function (attribute, value) { for (let i = 0; i < this.elements.length; i++) { if(arguments.length == 1){ //return this.elements[i].style[attribute]; return window.getComputedStyle(this.elements[i], null)[attribute]; } this.elements[i].style[attribute] = value; } return this; } //但无法获取计算后的样式 console.log($().getId('box').css('height'));//计算后的样式
# 3. 封装js库总结
//实例化多个对象 // let mybase = new Mybase(); // let mybase1 = new Mybase(); let $ = function () { return new Mybase(); } //基础库 function Mybase() { //创建一个数组,来保存获取的节点和节点数组 this.elements = []; } //获取id节点 Mybase.prototype.getId = function (id) { this.elements.push(document.getElementById(id)); return this; } //执行元素节点 Mybase.prototype.getTagName = function (tag) { let tags = document.getElementsByTagName(tag); for (let i = 0; i < tags.length; i++) { this.elements.push(tags[i]); } return this; } //设置或获取css Mybase.prototype.css = function (attribute, value) { for (let i = 0; i < this.elements.length; i++) { if(arguments.length == 1){ //return this.elements[i].style[attribute]; return window.getComputedStyle(this.elements[i], null)[attribute]; } this.elements[i].style[attribute] = value; } return this; } //设置或者获取内容 Mybase.prototype.html = function (str) { // mybase.getId('box').innerHTML = '我是box'; for (let i = 0; i < this.elements.length; i++) { //判断传参 arguments.length if (arguments.length == 0) { //没有传参 return this.elements[i].innerHTML;//返回内容 } else { this.elements[i].innerHTML = str; } } return this; } //触发点击事件 Mybase.prototype.click = function (fn) { for (let i = 0; i < this.elements.length; i++) { this.elements[i].onclick = fn; } return this; } /* $().getId('box').css('color','red').css('backgroundColor','green'); $().getTagName('p').css('color','blue').html('我是段落p').click(function(){ console.log('我被点了'); }).css('backgroundColor','black'); console.log($().getId('box').html());//获取内容 console.log($().getId('box').css('fontSize')); //获取 CSS 样式 $().getId('box').css('fontSize','100px'); console.log($().getId('box').css('height'));//计算后的样式 */
以上,是我们通过简单封装js库,让大家进一步理解面向对象、原型在开发中的思维和重要性,主要目的是拓宽大家的面向对象思维能力。然后,顺便通过封装我们DOM章节的知识点,让大家回忆一下我们第二学期第1季DOM章节操作我们节点的一些方法,做到一个前后呼应。
当然:
回到我们目前封装的js库本身,还有很多的方法没有封装,比如:获取class类名、设置class类名、添加class类名、移除class类名等等很多功能,而且我们的库还需要进一步的改进。
那么:
在我们实际开发中,有没有我们IT界的前辈或者大佬,帮我们写好了操作我们js的库呢,功能和我们上面自己封装的功能一样呢,而且功能更加完善呢?
答案是:有的。回到我们本章的开头,现如今有太多优秀的开源 JavaScript 库,比如:jQuery、Swiper、 Prototype、Dojo、Extjs、Zepto 等等。而这里面最为优秀,被封神的 JavaScript 库就是我们的:jQuery库,那么我们下一章节将学习如何使用jQuery库。
# 【第二学期第2季课程】其它章节
# 章节1.课程介绍
# 章节2.面向对象与原型
# 1、创建对象
# ① 创建对象,剖析问题:传统创建对象方法代码重复冗余,对象无法识别从属于哪个函数
# ② 传统创建对象:工厂模式(没有办法识别某一个对象的引用)
# ③ 构造函数(构造方法)创建特定的对象
# ④ 构造函数知识扩展,对象冒充构造函数,构造函数体内的函数返回值相等,但引用地址不相同
# 2、原型
# ① 原型创建对象
# ② 构造函数与原型对比,深度解析(图片示例)
# ③ isPrototypeOf()方法:判断一个对象是否指向了该构造函数的原型对象
# ④ 原型模式的执行流程(顺序):先实例,在构造函数,最后原型
# ⑤ 删除实例属性访问原型属性:delete方法
# ⑥ hasOwnProperty()方法检测属性是否存在实例中,in操作符判断属性是否存在于实例或原型中,两者结合判断属性是否只存在原型中
# ⑦ 原型创建对象字面量声明方式
# ⑧ 原型创建对象字面量声明方式,原型的声明是有先后顺序,重写原型会覆盖(切断)之前的原型
# ⑨ 内置引用类型:String,Number,Array等本身也使用了原型
# ⑩ 原型创建对象缺点剖析:传参和引用共享问题
# ⑪ 组合构造函数+原型模式:解决 ⑩ 构造传参和引用共享问题
# ⑫ 动态原型模式:解决 ⑪ 组合构造函数+原型模式,代码封装在一起,一种封装的感觉
# ⑬ 寄生构造函数:工厂模式 + 构造函数【备胎模式(了解)】
# ⑭ 稳妥构造函数(了解即可):在一些安全的环境中,比如禁止使用 this 和 new,就是寄生构造函数不能用new
# 3、继承
# ① js的继承方式通过原型链完成
# ② 继承父类属性方法的继承顺序:就近原则(实例化-->构造函数实例属性方法-->原型属性方法)
# ③ 继承后的实例从属关系
# ④ 对象冒充继承及问题:原型里面的属性方法无法继承
# ⑤ 组合继承【广泛应用】:原型链+借用构造函数(对象冒充)的模式,完成对象冒充的原型继承
# ⑥ 原型式继承(了解)
# ⑦ 寄生式继承:原型式+工厂模式结合
# ⑧ 继承终极版模式:寄生组合继承来实现继承:组合模式 + 寄生式继承
# 4、类和对象
# ① 理解类和对象
# ② 类中的constructor()方法(构造函数)
# ③ 类中添加方法
# ④ 类的继承
# ⑤ 类的继承中的super关键字:调用父类的构造函数constructor
# ⑥ 类的继承中的super关键字:调用父类的普通函数
# ⑦ 子类继承父类方法同时扩展自己的方法,子类在构造函数中使用super,必须放到this前面
# ⑧ 类和对象的几个注意点:
# 5、面向对象、原型、继承、类小结
# 章节3.封装js库过渡到jQuery
# 章节4.jQuery
# 1、代码风格:$包裹,加载模式:$(function () {}),获取元素DOM对象:get(索引)方法,多个库之间的冲突
# 2、选择器:
# ① ID 选择器、元素选择器、类(class)选择器,属性 length 或 size()方法来查看返回的元素个数
# ② jQuery对象转成DOM对象:get方法或下标获取
# ③ 群组选择器、后代选择器、通配选择器、指定元素前缀选择器
# ④ 层次选择器:jQuery提供后代选择器find、子选择器children、next 选择器、nextAll 选择器
# ⑤ jQuery提供:prev同级上一个元素,prevAll同级所有上面的元素
# ⑥ jQuery提供:siblings()方法:上下同级所有元素,正好集成了 prevAll()和 nextAll()两个功能的效果
# ⑦ jQuery提供:nextUntil()方法:查找同级后面的节点,遇到指定元素停止选定,prevUntil()方法:查找同级前面的节点,遇到指定元素停止选定
# ⑧ 属性选择器:一般超链接用得多点
# 3、过滤器(伪类选择器)
# ① :first,选取第一个元素,返回单个元素,jQuery提供first()方法
# ② jQuery对象转成DOM对象:get方法或下标获取
# ③:not(selector), :not(.active)选取class不是active的元素,返回元素集合,jQuery提供not(selector)方法
# ④ :eq(index),选择索引(0 开始)等于 index 的元素,返回单个元素,jQuery提供eq()方法
# ⑤ :gt(index),选择索引(0 开始)大于 index 的元素,返回元素集合
# ⑥ :lt(index),选择索引(0 开始)小于 index 的元素,返回元素集合
# ⑦ :even,选择索引(0 开始)是偶数的所有元素,返回元素集合
# ⑧ :odd,选择索引(0 开始)是奇数的所有元素,返回元素集合
# ⑨ :header,选择标题元素,h1 ~ h6,返回元素集合
# ⑩ :focus,选择当前被焦点的元素,一般用在表单元素上
# 4、内容过滤器
# ① :contains(text),选取含有text文本的元素,返回元素集合
# ② :empty,选取不包含子元素或空文本的元素,返回元素集合
# ③ :has(selector),如::has(.active) 选择后代元素含有class 是active 的元素,jQuery提供has()方法
# ④ :parent,与:empty刚好相反,选取含有子元素或文本的元素,返回元素集合
# 5、jQuery提供:parent()、parents()、parentsUntil方法特别说明
# ① jQuery提供:parent()方法:选取当前元素的父元素,注意与 :parent的区别
# ② jQuery提供:parents()方法:选择当前元素的父元素及祖先元素
# ③ jQuery提供:parentsUntil方法,如:parentsUntil('ul') 选择当前元素往上一层级查找,遇到ul元素停止
# 6、可见性过滤器
# ① :hidden,选取所有不可见元素,返回元素集合,一般包含:CSS 样式为 display:none、input 表单类型为type="hidden"和 visibility:hidden 的元素
# ② :visible,选取所有可见元素
# 7、子元素过滤器
# ① :first-child,获取每个父元素的第一个子元素,返回元素集合
# ② :last-child,获取每个父元素的最后一个子元素,返回元素集合
# ③ :only-child,获取只有一个子元素的元素,返回元素集合
# ④ :nth-child(odd/even/eq(index)),获取每个自定义子元素的元素(索引值从 1 开始计算)
# 8、jQuery提供选择器和过滤器方法
# ① is()方法:传递选择器、DOM、jquery 对象、函数
# ② hasClass方法,hasClass(); hasClass(class),判断某个元素是否有某个class,比较常用,和 is 一样,只不过只能传递class
# ③ slice方法,slice(start, end),选择从 start 到 end 位置的元素,如果是负数,则从后开始
# ④ end方法,end(),获取当前元素前一次状态:可以找它的父节点,也可以找它的相邻前一个兄弟节点
# ⑤ contents方法,contents(),获取某元素下面所有元素节点,包括文本节点,如果是 iframe,则可以查找文本内容
# ⑥ filter方法,filter(),比较灵活的选择器,扩展性较好
# 9、表单选择器
# ① jQuery方法:通过type类型或者name字段获取表单组件,通过val()方法获取表单组件的值
# 10、jQuery操作DOM及CSS
# 1、设置元素及内容:html(),html(value),text(),text(value)
# 2、获取或设置表单内容:val(),val(value)
# 3、设置单选框、复选框默认选中状态val(),非常好用
# 4、元素属性操作:attr()和 removeAttr()
# 5、元素CSS样式操作
# Ⅰ、css()方法
# ① css()方法获取、设置元素样式
# ② css()方法传递多个样式属性的数组,得到样式属性值对象数组,$.each(box,function(attr,value){})遍历原生态对象数组,jQuery对象数组采用$(selector).each(function(index,element){})方法遍历
# ③ css()方法传递多个 CSS 样式的键值对
# ④ css()方法可以传匿名函数
# Ⅱ、addClass()方法、removeClass()方法、toggleClass()方法
# ① addClass()方法、removeClass()方法
# ② toggleClass()方法:切换class
# Ⅲ、jQuery提供其他css操作方法
# ① jQuery提供:width()、width(value)、width(function (index, width) {})方法:获取、设置、通过匿名函数设置某个元素的长度
# ② jQuery提供:height()、height(value)、height(function (index, width) {})方法:获取、设置、通过匿名函数设置某个元素的高度
# ③ jQuery提供内外边距和边框尺寸方法:innerWidth(),innerHeight(),outerWidth(),outerHeight(),outerWidth(ture),outerHeight(true)
# ④ jQuery提供元素偏移方法:offset()、position()、scrollTop()、scrollTop(value)、scrollLeft()、scrollLeft(value)
# 11、jQuery提供的DOM节点操作方法
# 1、创建节点
# 2、插入节点
# ① 内部插入节点 append(content):向指定元素内部后面插入节点content
# ② 内部移入节点(不需要创建节点) appendTo(content):将指定元素移入到指定元素content 内部后面
# ③ 内部插入节点 prepend(content):向指定元素 content 内部的前面插入节点
# ④ 内部移入节点(不需要创建节点) prependTo(content):将指定元素移入到指定元素content 内部前面
# ⑤ 外部(同级)插入节点 before(content):向指定元素的外部前面插入节点content
# ⑥ 外部(同级)移到节点 (不需要创建节点)insertBefore(content):将指定节点移到指定元素content 外部的前面
# ⑦ 外部(同级)插入节点 after(content):向指定元素的外部后面插入节点content
# ⑧ 外部(同级)移到节点 (不需要创建节点)insertAfter(content):将指定节点移到指定元素content 外部的后面
# 3、包裹节点
# ① wrap(html):向指定元素包裹一层html 代码
# ② wrap(element):向指定元素包裹一层 DOM对象节点
# ③ wrap(function (index) {}):使用匿名函数向指定元素包裹一层自定义内容
# ④ unwrap():移除一层指定元素包裹的内容
# ⑤ wrapAll(html):用 html 将所有元素包裹到一起
# ⑥ wrapAll(element):用 DOM 对象将所有元素包裹在一起
# ⑦ wrapInner(html)、wrapInner(element)、wrapInner(function (index) {}):向指定元素的子内容包裹一层
# 4、节点操作
# ① 复制节点 clone(true)、替换节点:replaceWith、replaceAll
# ② 删除节点:remove() 或者 detach()
# ③ 删除掉节点里的内容empty()
# 章节5.jQuery事件、动画、插件
# 一、事件
# 1、简写事件
# 2、复合事件:hover([fn1,]fn2)
# 3、jQuery中的事件对象:target、currentTarget、e.stopPropagation()、e.preventDefault()、return false
# 4、jQuery中的高级事件:on、off 和 one
# ① on方法
# ② off方法:移除事件
# ③ one方法:仅触发一次的事件
# 5、jQuery中的模拟操作
# 二、动画
# 1、 显示:show、隐藏:hide
# ① 直接调用:显示show()、隐藏:hide()
# ② 传递一个参数(毫秒):显示show(1000)、隐藏:hide(1000)
# ③ 传递一个预设参数:显示show(slow|normal|fast),隐藏:hide(slow|normal|fast),slow:600 毫秒,normal:默认 400 毫秒,fast:200 毫秒
# ④ 传递第二个参数回调函数,实现列队动画(排队动画):show(毫秒数|slow|normal|fast,function(){}),hide(毫秒数|slow|normal|fast,function(){})
# ⑤ 列队动画,可以使用函数名调用自身或者arguments.callee 匿名函数自调用
# ⑥ toggle()切换show()和hide()
# 2、 滑动:slideUp、卷动:slideDown、切换滑动卷动:slideToggle
# 3、 淡入:fadeIn、淡出:fadeOut、切换淡入淡出:fadeToggle、指定透明度:fadeTo
# 4、 自定义动画 animate
# ① animate基本用法:css样式自定义,同步动画
# ② animate用法:animate(css,动画时间,回调函数)
# ③ animate位移动画(将元素设置绝对定位或相对定位)
# ④ 列队动画方法:queue()方法,连缀执行下一个dequeue()方法,clearQueue()清理列队动画后面还没有执行的
# 5、 动画相关方法:stop()强制停止动画,delay()延迟动画执行
# 6、判断在运动的动画,通过过滤器:animated
# 7、动画全局属性:$.fx.interval(设置每秒运行的帧数),$.fx.off(关闭页面上所有的动画),默认swing(缓动),linear(匀速运动)
# 三、jQuery插件
# 1、引入:下载本地引入、或在线引入
# 2、使用插件方法
# 章节6.Ajax
# 一、原生js中的Ajax
# 1、XMLHttpRequest (简称 XHR,XHR API)
# ① 第一步:调用 open()方法准备发送请求(发送请求前的准备工作):三个参数:要发送的请求类型(get、post)、请求的 URL 和表示是否异步
# ② 第二步:通过 send()方法进行发送请求:一个参数:作为请求主体发送的数据,如果不需要则,必须填 null
# ③ 第三步:发送完了之后,得监听结果(监听服务器给你的请求结果),通过readystatechange 事件监听服务器给你的结果
# 2、理解get、post请求
# ① getAllResponseHeaders()获取整个响应头信息,getResponseHeader()获取单个响应头信息,setRequestHeader()设置请求头信息
# ② get请求
# ③ post请求
# ④ 小结get和post请求
# 3、Fetch API
# ① Fetch API基本用法介绍
# ② XHR 与 Fetch 中的Content-Type(或者小写content-type)
# 4、 XHR(xhr) 与 Fetch(fetch)的区别 (包括:jQuery、Axios、umi-request的说明)
# 二、jQuery中的Ajax
# 1、第二层封装:load()方法,$.get()和$.post()方法
# ① load()方法是局部方法 : 异步加载静态文件如:html文件、json文件等
# ② $.get()和$.post()方法:是全局方法,无须指定某个元素,适合传递参数到服务器请求数据
# 2、最高层封装:$.getJSON() 和 $.getScript()
# ① $.getJSON()方法:专门用于加载 JSON 文件的
# ② $.getScript()方法:按需加载接口或js文件
# 3、最底层的封装:$.ajax()
# 4、表单序列化
# ① 常规形式的表单提交(表单提交数据)
# ② jQuery中的表单序列化提交数据(表单提交数据)
# ③ $.param()方法将对象转换为字符串键值对格式
# 5、jQuery中的跨域jsonp
# ① jQuery中的跨域jsonp使用
# ② 延伸一下:jQuery中的跨域jsonp模拟百度搜索提示数据
# 6、 jqXHR 对象: when()方法、done()方法、always()方法和fail()方法
# 章节7.Node.js基础
# 一、Node环境搭建(安装node.js)
# 1、 下载安装node.js
# 2、 检查node.js是否安装成功
# ① 命令行:node -v npm -v npx -v
# ② 命令行:node 运行js代码
# ③ 命令行:运行js文件代码,清屏命令: cls
# 二、NVM(node版本管理工具,切换node版本)
# 1、 下载安装nvm
# 2、检查nvm是否安装成功:nvm -v
# 3、设置nodejs、npm下载源(可选)
# 4、使用NVM包管理器
# 三、NPM包管理(npm包管理工具)
# 1、 package.json 文件如何生成
# 2、 NPM (npm) 、 CNPM (cnpm)
# 1、npm
# 2、cnpm (可选)
# ① 安装cnpm
# ② 接下来就可以使用cnpm命令安装各个包、插件、模块等等
# ③ 在vscode中运行命令
# ④ npm 或 cnpm 常用命令
# 四、Node的模块
# 1、全局模块 :process为例
# 2、系统模块 : path、fs模块为例
# 3、 自定义模块: exports、module输出、require引入
# 4、 重要系统模块:http模块,搭建网页服务器
# 五、Node中的数据交互,重要系统模块:url模块处理get请求,querystring模块处理post请求
# 1、url模块处理GET(get)请求:url.parse(url,true)
# 2、querystring模块处理POST(post)请求:querystring.parse()
# 六、nodejs项目监测文件变化,自动重启工具:Nodemon
# 1、安装nodemon
# 2、修改package.json 中的启动命令
# 3、配置nodemon,告诉它哪些文件需要修改后重启服务(可选项)
# 七、nrm (使用nrm管理npm下载源)
# 1、安装nrm
# 2、nrm内置的命令函数
# 3、查看当前正在使用的 npm 镜像源
# 4、切换 npm 镜像源
# 八、系统模块:fs模块详解
# 1、读取文件: 异步readFile、同步readFileSync、promise操作
# 2、可读流模式:createReadStream()方法
# 3、创建文件夹:mkdirSync , mkdir
# 4、删除文件夹:rmSync , rm
# 5、重命名文件:renameSync , rename
# 6、监听文件变化: watch
# 7、写入文件:writeFile、writeFileSync,追加写入文件:appendFile、appendFileSync
# 8、写入文件:创建可写流 createWriteStream()
# 9、软链接symlinkSync、symlink 硬链接linkSync、link
# 九、node.js + jQuery完成:网页 “联系我们” 页面的留言板功能
# 十、系统模块:crypto模块详解(加密:对称加密、非对称加密、哈希函数)
# 1、对称加密、封装加密函数
# 2、非对称加密
# 3、哈希函数加密
# 4、对留言板的手机号做一个加密
# 章节8.正则表达式
# 一、创建正则表达式
# ① new运算符创建正则表达式
# ② 字面量方式创建正则表达式
# 二、测试正则表达式
# ① test方法:在字符串中测试模式匹配,返回 true 或 false
# ② exec方法:在字符串中执行匹配搜索,返回结果数组,执行失败,则返回 null
# 三、字符串的正则表达式方法
# ① match方法:就是一个查找的功能,获取匹配的字符串,返回数组或 null
# ② search方法:根据匹配的字符串,返回位置索引(从0开始)
# ③ split方法:按照匹配模式,拆分成字符串数组
# ④ replace方法: 替换匹配到的数据
# 小案例:模拟百度搜索,搜索的关键字设置成红色
# 四、正则表达式RegExp对象的静态属性、实例属性(了解)
# 1、 静态属性
# ① 属性:input,短名:$_ , 当前被匹配的字符串
# ② 属性:leftContext,短名:$` , 最后一次匹配前的子串
# ③ 属性:rightContext,短名:$' , 在上次匹配之后的子串
# ④ 属性:lastMatch,短名:$& , 最后一个匹配字符串
# ⑤ 属性:lastParen,短名:$+ , 最后一对圆括号内的匹配子串
# 2、 实例属性
# 五、正则表达式元字符(包含特殊含义的字符)
# 一、 单个字符和数字、重复字符
# 1、 点符号匹配除了换行符(\n)外的任意字符
# 2、 点符号和重复字符配合使用
# ① 重复字符:x?,表示:匹配 0 个或 1 个 x (x可以换成任意字符)
# ② 重复字符:x*,表示:匹配 0 个或 1 个 或者任意多个 x (x可以换成任意字符)
# ③ 重复字符:x+,表示:匹配 至少1个 或者任意多个 x (x可以换成任意字符)
# ④ 重复字符:x{m,n},表示:匹配最少 m 个、最多 n 个 x, x{m}表示:只能有m个x, x{m,}表示:有m个x或者以上个x (x可以换成任意字符)
# ⑤ 重复字符:(xyz)+,表示:匹配至少一个(xyz),括号可以看成分组,分组里面的元素可以是任意多个字符
# ⑥ 任意一个匹配:[a-z]匹配26个小写字母任意一个,[A-Z]匹配26个大写字母任意一个,[0-9]匹配0到9的数字任意一个,[a-zA-Z0-9]匹配混合字母和数字中的任意一个
# ⑦ 任意一个不匹配:[^a-z]不匹配26个小写字母,[^A-Z]不匹配26个大写字母,[^0-9]不匹配0到9的数字,[^a-zA-Z0-9]不匹配混合字母和数字
# 3、字符类:锚字符
# ① 锚字符:^ , 表示:从行首开始匹配
# ② 锚字符:$ , 表示:从行尾开始匹配
# 4、字符:\d , 匹配数字,和字符集合 [0-9]相同,字符:\D , 匹配非数字,同[^0-9]相同
# 5、字符:\w , 匹配字母和数字及_,和字符集合 [a-zA-Z0-9_]相同,字符:\W , 匹配非字母和数字及_,同[^a-zA-Z0-9_]相同
# 二、空白字符
# ① 字符:\s,表示:匹配空白字符、空格、制表符和换行符
# ② 字符:\b,表示:到达边界
# 三、选择字符(|)选择模式,匹配如:jpg|png|gif,非相等包含的意思
# 四、分组模式:()做分组,\1或$1匹配第一个分组中的内容,\2或$2匹配第二个分组中的内容,依次类推
# ① 分组模式:()做分组
# ② $1可以获取到第一个分组内容
# ③ 小案例:$1获取到第一个分组内容,并做替换
# ④ 小案例:获取多个分组内容,进行替换
# 六、正则表达式:贪婪和惰性
# 七、正则表达式使用 exec 返回数组
# 八、捕获性分组和非捕获性分组
# 九、分组嵌套、前瞻捕获、特殊字符匹配、换行模式
# 十、书写常用正则表达式
# ① 手机号正则
# ② 邮政编码正则
# ③ 简单的电子邮件正则
# ④ 匹配图片格式
# ⑤ 删除多余空格
# ⑥ 删除首尾的空格,中间的空格不删除
# ⑦ 延伸:将11位手机号中的4-7位号码换成 *
# 章节9.Vue.js基础
# 一、课前准备:启动node服务器,引入vue.js
# 二、体验vue的数据响应式:① 配置项data中的数据响应式,及渲染到页面上的真实DOM效果、② 循环语句,事件处理体验、③ vuejs计算属性体验
# 三、理解vue的注入、虚拟DOM及底层原理:vue实例成员的注入、虚拟DOM、虚拟DOM的底层原理
# 四、案例:node.js + vue.js 渲染企业网站
# 其它学期课程
# 第一学期(学习顺序:01)
第一学期课程专为零基础的学员定制录制的,纯html+css做企业网站的网页,主讲html和css的相关基础知识,flex布局相关知识,封装css基础样式库,引入字体图标及网页开发基础布局思维,完成企业网站网页的开发过程。
[第一学期学习视频]
# 第二学期【第1季】(学习顺序:02)
# 第二学期【第2季】(学习顺序:03)
JavaScript中的面向对象,类,ajax,封装js库过渡到jQuery, vue.js基础配置网站页面,建议所有学员观看。
[第2季学习文档] [第2季学习视频]
# 第二学期【第3季】(学习顺序:04)
egg.js基础,响应式网页布局,Bootstrap框架,响应式后台系统管理,完整企业网站前后台开发,建议所有学员观看。
[第3季学习文档] [第3季学习视频]
# 第二学期【第4季】(学习顺序:05)
主要对第三季,同学们开发的企业网站,进行一个完整的上线运维流程的一个讲解,同学们将网站开发完成之后,如何进行上线运维,将项目交付给客户。
[第4季学习文档] [第4季学习视频]