<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>前端笔记 | WEB前端博客 | 隔壁老刘</title><link>https://www.liuhuadong.cc/</link><description>Good Luck To You!</description><item><title>快捷方式的使用方法</title><link>https://www.liuhuadong.cc/post/50.html</link><description>&lt;p&gt;ctrl+a        将光标快速移动到行首&lt;br&gt;ctrl+e        将光标快速移动到行尾&lt;br&gt;ctrl+⬅️➡️        将光标按单词快速左右移动&lt;br&gt;ctrl+w        将空格分隔的一个字符串整体进行删除（剪切）&lt;br&gt;ctrl+u        将光标所在位置到行首内容进行删除（剪切）&lt;br&gt;ctrl+k        将光标所在位置到行尾内容进行删除（剪切）&lt;br&gt;ctrl+y        粘贴剪切的内容&lt;br&gt;ctrl+s        xshell进入到了锁定状态 suo锁&lt;br&gt;ctrl+q        解除锁定状态 quit退出锁定状态&lt;br&gt;tab        补全命令&lt;/p&gt;
</description><pubDate>Tue, 12 May 2020 22:55:18 +0800</pubDate></item><item><title>文件相关命令</title><link>https://www.liuhuadong.cc/post/49.html</link><description>&lt;p&gt;touch 空文件&lt;br&gt;ls -l 查看文件属性信息&lt;br&gt;ls -ld&lt;br&gt;vi    打开文件进行编辑&lt;br&gt;echo 只是将信息显示到屏幕上&lt;br&gt;echo &amp;gt;&amp;gt; 将屏幕上显示的内容重定向输出到指定文件中&lt;br&gt;    cp  备份数据的命令&lt;br&gt;        备份文件信息 cp 要备份的文件 文件备份保存的其他路径&lt;br&gt;        备份目录信息    cp -r 备份的目录  保存到的路径&lt;br&gt;rm        删除数据信息&lt;br&gt;    rm 数据信息 会有提示&lt;br&gt;    rm -f 数据信息 不会有提示&lt;br&gt;    rm -rf 目录信息 不会有提示&lt;br&gt;mv    移动数据信息（目录 文件）&lt;br&gt;        数据信息进行重命名&lt;/p&gt;
</description><pubDate>Tue, 12 May 2020 22:48:21 +0800</pubDate></item><item><title>ES6概念&amp;amp;新增语法&amp;amp;内置对象拓展</title><link>https://www.liuhuadong.cc/post/48.html</link><description>&lt;h1 id=&quot;h1-es6-&quot;&gt;&lt;a name=&quot;ES6语法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;ES6语法&lt;/h1&gt;&lt;h2 id=&quot;h2-u76EEu6807&quot;&gt;&lt;a name=&quot;目标&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;目标&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;能够说出使用let关键字声明变量的特点&lt;/li&gt;&lt;li&gt;能够使用解构赋值从数组中提取值&lt;/li&gt;&lt;li&gt;能够说出箭头函数拥有的特性&lt;/li&gt;&lt;li&gt;能够使用剩余参数接收剩余的函数参数&lt;/li&gt;&lt;li&gt;能够使用拓展运算符拆分数组&lt;/li&gt;&lt;li&gt;能够说出模板字符串拥有的特性&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2-es6-&quot;&gt;&lt;a name=&quot;ES6相关概念（★★）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;ES6相关概念（★★）&lt;/h2&gt;&lt;h3 id=&quot;h3--es6&quot;&gt;&lt;a name=&quot;什么是ES6&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;什么是ES6&lt;/h3&gt;&lt;p&gt;ES 的全称是 ECMAScript , 它是由 ECMA 国际标准化组织,制定的一项脚本语言的标准化规范。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images5/es-version.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3--es6-&quot;&gt;&lt;a name=&quot;为什么使用 ES6 ?&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;为什么使用 ES6 ?&lt;/h3&gt;&lt;p&gt;每一次标准的诞生都意味着语言的完善，功能的加强。JavaScript语言本身也有一些令人不满意的地方。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;变量提升特性增加了程序运行时的不可预测性&lt;/li&gt;&lt;li&gt;语法过于松散，实现相同的功能，不同的人可能会写出不同的代码&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2-es6-&quot;&gt;&lt;a name=&quot;ES6新增语法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;ES6新增语法&lt;/h2&gt;&lt;h3 id=&quot;h3-let-&quot;&gt;&lt;a name=&quot;let（★★★）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;let（★★★）&lt;/h3&gt;&lt;p&gt;ES6中新增了用于声明变量的关键字&lt;/p&gt;
&lt;h4 id=&quot;h4-let-&quot;&gt;&lt;a name=&quot;let声明的变量只在所处于的块级有效&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;let声明的变量只在所处于的块级有效&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; if (true) { 
     let a = 10;
 }
console.log(a) // a is not defined&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;使用let关键字声明的变量才具有块级作用域，使用var声明的变量不具备块级作用域特性。&lt;/p&gt;
&lt;h4 id=&quot;h4-u4E0Du5B58u5728u53D8u91CFu63D0u5347&quot;&gt;&lt;a name=&quot;不存在变量提升&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;不存在变量提升&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;console.log(a); // a is not defined 
let a = 20;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-u6682u65F6u6027u6B7Bu533A&quot;&gt;&lt;a name=&quot;暂时性死区&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;暂时性死区&lt;/h4&gt;&lt;p&gt;利用let声明的变量会绑定在这个块级作用域，不会受外界的影响&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; var tmp = 123;
 if (true) { 
     tmp = &amp;#39;abc&amp;#39;;
     let tmp; 
 } &lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-u7ECFu5178u9762u8BD5u9898&quot;&gt;&lt;a name=&quot;经典面试题&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;经典面试题&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; var arr = [];
 for (var i = 0; i &amp;lt; 2; i++) {
     arr[i] = function () {
         console.log(i); 
     }
 }
 arr[0]();
 arr[1]();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images5/let面试题.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经典面试题图解：&lt;/strong&gt;此题的关键点在于变量i是全局的，函数执行时输出的都是全局作用域下的i值。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; let arr = [];
 for (let i = 0; i &amp;lt; 2; i++) {
     arr[i] = function () {
         console.log(i); 
     }
 }
 arr[0]();
 arr[1]();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images5/let面试题2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经典面试题图解：&lt;/strong&gt;此题的关键点在于每次循环都会产生一个块级作用域，每个块级作用域中的变量都是不同的，函数执行时输出的是自己上一级（循环产生的块级作用域）作用域下的i值.&lt;/p&gt;
&lt;h4 id=&quot;h4-u5C0Fu7ED3&quot;&gt;&lt;a name=&quot;小结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;小结&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;let关键字就是用来声明变量的&lt;/li&gt;&lt;li&gt;使用let关键字声明的变量具有块级作用域&lt;/li&gt;&lt;li&gt;在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的&lt;/li&gt;&lt;li&gt;防止循环变量变成全局变量&lt;/li&gt;&lt;li&gt;使用let关键字声明的变量没有变量提升&lt;/li&gt;&lt;li&gt;使用let关键字声明的变量具有暂时性死区特性&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-const-&quot;&gt;&lt;a name=&quot;const（★★★）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;const（★★★）&lt;/h3&gt;&lt;p&gt;声明常量，常量就是值（内存地址）不能变化的量&lt;/p&gt;
&lt;h4 id=&quot;h4-u5177u6709u5757u7EA7u4F5Cu7528u57DF&quot;&gt;&lt;a name=&quot;具有块级作用域&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;具有块级作用域&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; if (true) { 
     const a = 10;
 }
console.log(a) // a is not defined&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-u58F0u660Eu5E38u91CFu65F6u5FC5u987Bu8D4Bu503C&quot;&gt;&lt;a name=&quot;声明常量时必须赋值&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;声明常量时必须赋值&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const PI; // Missing initializer in const declaration&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--&quot;&gt;&lt;a name=&quot;常量赋值后，值不能修改&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;常量赋值后，值不能修改&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const PI = 3.14;
PI = 100; // Assignment to constant variable.

const ary = [100, 200];
ary[0] = &amp;#39;a&amp;#39;;
ary[1] = &amp;#39;b&amp;#39;;
console.log(ary); // [&amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;]; 
ary = [&amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;]; // Assignment to constant variable.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-u5C0Fu7ED3&quot;&gt;&lt;a name=&quot;小结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;小结&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;const声明的变量是一个常量&lt;/li&gt;&lt;li&gt;既然是常量不能重新进行赋值，如果是基本数据类型，不能更改值，如果是复杂数据类型，不能更改地址值&lt;/li&gt;&lt;li&gt;声明 const时候必须要给定值&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-let-const-var-&quot;&gt;&lt;a name=&quot;let、const、var 的区别&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;let、const、var 的区别&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;使用 var 声明的变量，其作用域为该语句所在的函数内，且存在变量提升现象&lt;/li&gt;&lt;li&gt;使用 let 声明的变量，其作用域为该语句所在的代码块内，不存在变量提升&lt;/li&gt;&lt;li&gt;使用 const 声明的是常量，在后面出现的代码中不能再修改该常量的值&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images5/var&amp;let&amp;const区别.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;解构赋值（★★★）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;解构赋值（★★★）&lt;/h3&gt;&lt;p&gt;ES6中允许从数组中提取值，按照对应位置，对变量赋值，对象也可以实现解构&lt;/p&gt;
&lt;h4 id=&quot;h4-u6570u7EC4u89E3u6784&quot;&gt;&lt;a name=&quot;数组解构&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;数组解构&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; let [a, b, c] = [1, 2, 3];
 console.log(a)//1
 console.log(b)//2
 console.log(c)//3
//如果解构不成功，变量的值为undefined&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-u5BF9u8C61u89E3u6784&quot;&gt;&lt;a name=&quot;对象解构&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;对象解构&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; let person = { name: &amp;#39;zhangsan&amp;#39;, age: 20 }; 
 let { name, age } = person;
 console.log(name); // &amp;#39;zhangsan&amp;#39; 
 console.log(age); // 20

 let {name: myName, age: myAge} = person; // myName myAge 属于别名
 console.log(myName); // &amp;#39;zhangsan&amp;#39; 
 console.log(myAge); // 20
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-u5C0Fu7ED3&quot;&gt;&lt;a name=&quot;小结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;小结&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;解构赋值就是把数据结构分解，然后给变量进行赋值&lt;/li&gt;&lt;li&gt;如果结构不成功，变量跟数值个数不匹配的时候，变量的值为undefined&lt;/li&gt;&lt;li&gt;数组解构用中括号包裹，多个变量用逗号隔开，对象解构用花括号包裹，多个变量用逗号隔开&lt;/li&gt;&lt;li&gt;利用解构赋值能够让我们方便的去取对象中的属性跟方法&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;箭头函数（★★★）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;箭头函数（★★★）&lt;/h3&gt;&lt;p&gt;ES6中新增的定义函数的方式。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;() =&amp;gt; {} //()：代表是函数； =&amp;gt;：必须要的符号，指向哪一个代码块；{}：函数体
const fn = () =&amp;gt; {}//代表把一个函数赋值给fn&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;函数体中只有一句代码，且代码的执行结果就是返回值，可以省略大括号&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; function sum(num1, num2) { 
     return num1 + num2; 
 }
 //es6写法
 const sum = (num1, num2) =&amp;gt; num1 + num2; 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果形参只有一个，可以省略小括号&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; function fn (v) {
     return v;
 } 
//es6写法
 const fn = v =&amp;gt; v;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;箭头函数不绑定this关键字，箭头函数中的this，指向的是函数定义位置的上下文this&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const obj = { name: &amp;#39;张三&amp;#39;} 
 function fn () { 
     console.log(this);//this 指向 是obj对象
     return () =&amp;gt; { 
         console.log(this);//this 指向 的是箭头函数定义的位置，那么这个箭头函数定义在fn里面，而这个fn指向是的obj对象，所以这个this也指向是obj对象
     } 
 } 
 const resFn = fn.call(obj); 
 resFn();
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-u5C0Fu7ED3&quot;&gt;&lt;a name=&quot;小结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;小结&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;箭头函数中不绑定this，箭头函数中的this指向是它所定义的位置，可以简单理解成，定义箭头函数中的作用域的this指向谁，它就指向谁&lt;/li&gt;&lt;li&gt;箭头函数的优点在于解决了this执行环境所造成的一些问题。比如：解决了匿名函数this指向的问题（匿名函数的执行环境具有全局性），包括setTimeout和setInterval中使用this所造成的问题&lt;/li&gt;&lt;/ul&gt;
&lt;h4 id=&quot;h4-u9762u8BD5u9898&quot;&gt;&lt;a name=&quot;面试题&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;面试题&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;var age = 100;

var obj = {
    age: 20,
    say: () =&amp;gt; {
        alert(this.age)
    }
}

obj.say();//箭头函数this指向的是被声明的作用域里面，而对象没有作用域的，所以箭头函数虽然在对象中被定义，但是this指向的是全局作用域&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3--&quot;&gt;&lt;a name=&quot;剩余参数（★★）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;剩余参数（★★）&lt;/h3&gt;&lt;p&gt;剩余参数语法允许我们将一个不定数量的参数表示为一个数组，不定参数定义方式，这种方式很方便的去声明不知道参数情况下的一个函数&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;function sum (first, ...args) {
     console.log(first); // 10
     console.log(args); // [20, 30] 
 }
 sum(10, 20, 30)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-u5269u4F59u53C2u6570u548Cu89E3u6784u914Du5408u4F7Fu7528&quot;&gt;&lt;a name=&quot;剩余参数和解构配合使用&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;剩余参数和解构配合使用&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;let students = [&amp;#39;wangwu&amp;#39;, &amp;#39;zhangsan&amp;#39;, &amp;#39;lisi&amp;#39;];
let [s1, ...s2] = students; 
console.log(s1);  // &amp;#39;wangwu&amp;#39; 
console.log(s2);  // [&amp;#39;zhangsan&amp;#39;, &amp;#39;lisi&amp;#39;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-es6-&quot;&gt;&lt;a name=&quot;ES6 的内置对象扩展&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;ES6 的内置对象扩展&lt;/h2&gt;&lt;h3 id=&quot;h3-array-&quot;&gt;&lt;a name=&quot;Array 的扩展方法（★★）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;Array 的扩展方法（★★）&lt;/h3&gt;&lt;h4 id=&quot;h4--&quot;&gt;&lt;a name=&quot;扩展运算符（展开语法）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;扩展运算符（展开语法）&lt;/h4&gt;&lt;p&gt;扩展运算符可以将数组或者对象转为用逗号分隔的参数序列&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; let ary = [1, 2, 3];
 ...ary  // 1, 2, 3
 console.log(...ary);    // 1 2 3,相当于下面的代码
 console.log(1,2,3);&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id=&quot;h5-u6269u5C55u8FD0u7B97u7B26u53EFu4EE5u5E94u7528u4E8Eu5408u5E76u6570u7EC4&quot;&gt;&lt;a name=&quot;扩展运算符可以应用于合并数组&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;扩展运算符可以应用于合并数组&lt;/h5&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 方法一 
 let ary1 = [1, 2, 3];
 let ary2 = [3, 4, 5];
 let ary3 = [...ary1, ...ary2];
 // 方法二 
 ary1.push(...ary2);&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id=&quot;h5-u5C06u7C7Bu6570u7EC4u6216u53EFu904Du5386u5BF9u8C61u8F6Cu6362u4E3Au771Fu6B63u7684u6570u7EC4&quot;&gt;&lt;a name=&quot;将类数组或可遍历对象转换为真正的数组&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;将类数组或可遍历对象转换为真正的数组&lt;/h5&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;let oDivs = document.getElementsByTagName(&amp;#39;div&amp;#39;); 
oDivs = [...oDivs];&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--array-from-&quot;&gt;&lt;a name=&quot;构造函数方法：Array.from()&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;构造函数方法：Array.from()&lt;/h4&gt;&lt;p&gt;将伪数组或可遍历对象转换为真正的数组&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;//定义一个集合
let arrayLike = {
    &amp;#39;0&amp;#39;: &amp;#39;a&amp;#39;,
    &amp;#39;1&amp;#39;: &amp;#39;b&amp;#39;,
    &amp;#39;2&amp;#39;: &amp;#39;c&amp;#39;,
    length: 3
}; 
//转成数组
let arr2 = Array.from(arrayLike); // [&amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;, &amp;#39;c&amp;#39;]&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;方法还可以接受第二个参数，作用类似于数组的map方法，用来对每个元素进行处理，将处理后的值放入返回的数组&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; let arrayLike = { 
     &amp;quot;0&amp;quot;: 1,
     &amp;quot;1&amp;quot;: 2,
     &amp;quot;length&amp;quot;: 2
 }
 let newAry = Array.from(arrayLike, item =&amp;gt; item *2)//[2,4]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：如果是对象，那么属性需要写对应的索引&lt;/p&gt;
&lt;h4 id=&quot;h4--find-&quot;&gt;&lt;a name=&quot;实例方法：find()&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;实例方法：find()&lt;/h4&gt;&lt;p&gt;用于找出第一个符合条件的数组成员，如果没有找到返回undefined&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;let ary = [{
     id: 1,
     name: &amp;#39;张三&amp;#39;
 }, { 
     id: 2,
     name: &amp;#39;李四&amp;#39;
 }]; 
 let target = ary.find((item, index) =&amp;gt; item.id == 2);//找数组里面符合条件的值，当数组中元素id等于2的查找出来，注意，只会匹配第一个
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--findindex-&quot;&gt;&lt;a name=&quot;实例方法：findIndex()&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;实例方法：findIndex()&lt;/h4&gt;&lt;p&gt;用于找出第一个符合条件的数组成员的位置，如果没有找到返回-1&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;let ary = [1, 5, 10, 15];
let index = ary.findIndex((value, index) =&amp;gt; value &amp;gt; 9); 
console.log(index); // 2&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--includes-&quot;&gt;&lt;a name=&quot;实例方法：includes()&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;实例方法：includes()&lt;/h4&gt;&lt;p&gt;判断某个数组是否包含给定的值，返回布尔值。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;[1, 2, 3].includes(2) // true 
[1, 2, 3].includes(4) // false
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-string-&quot;&gt;&lt;a name=&quot;String 的扩展方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;String 的扩展方法&lt;/h3&gt;&lt;h4 id=&quot;h4--&quot;&gt;&lt;a name=&quot;模板字符串（★★★）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;模板字符串（★★★）&lt;/h4&gt;&lt;p&gt;ES6新增的创建字符串的方式，使用反引号定义&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;let name = `zhangsan`;
&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id=&quot;h5-u6A21u677Fu5B57u7B26u4E32u4E2Du53EFu4EE5u89E3u6790u53D8u91CF&quot;&gt;&lt;a name=&quot;模板字符串中可以解析变量&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;模板字符串中可以解析变量&lt;/h5&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;let name = &amp;#39;张三&amp;#39;; 
let sayHello = `hello,my name is ${name}`; // hello, my name is zhangsan&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id=&quot;h5-u6A21u677Fu5B57u7B26u4E32u4E2Du53EFu4EE5u6362u884C&quot;&gt;&lt;a name=&quot;模板字符串中可以换行&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;模板字符串中可以换行&lt;/h5&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; let result = { 
     name: &amp;#39;zhangsan&amp;#39;, 
     age: 20,
     sex: &amp;#39;男&amp;#39; 
 } 
 let html = ` &amp;lt;div&amp;gt;
     &amp;lt;span&amp;gt;${result.name}&amp;lt;/span&amp;gt;
     &amp;lt;span&amp;gt;${result.age}&amp;lt;/span&amp;gt;
     &amp;lt;span&amp;gt;${result.sex}&amp;lt;/span&amp;gt;
 &amp;lt;/div&amp;gt; `;
&lt;/code&gt;&lt;/pre&gt;
&lt;h5 id=&quot;h5-u5728u6A21u677Fu5B57u7B26u4E32u4E2Du53EFu4EE5u8C03u7528u51FDu6570&quot;&gt;&lt;a name=&quot;在模板字符串中可以调用函数&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;在模板字符串中可以调用函数&lt;/h5&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const sayHello = function () { 
    return &amp;#39;哈哈哈哈 追不到我吧 我就是这么强大&amp;#39;;
 }; 
 let greet = `${sayHello()} 哈哈哈哈`;
 console.log(greet); // 哈哈哈哈 追不到我吧 我就是这么强大 哈哈哈哈
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--startswith-endswith-&quot;&gt;&lt;a name=&quot;实例方法：startsWith() 和 endsWith()&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;实例方法：startsWith() 和 endsWith()&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;startsWith()：表示参数字符串是否在原字符串的头部，返回布尔值&lt;/li&gt;&lt;li&gt;endsWith()：表示参数字符串是否在原字符串的尾部，返回布尔值&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;let str = &amp;#39;Hello world!&amp;#39;;
str.startsWith(&amp;#39;Hello&amp;#39;) // true 
str.endsWith(&amp;#39;!&amp;#39;)       // true
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4--repeat-&quot;&gt;&lt;a name=&quot;实例方法：repeat()&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;实例方法：repeat()&lt;/h4&gt;&lt;p&gt;repeat方法表示将原字符串重复n次，返回一个新字符串&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;#39;x&amp;#39;.repeat(3)      // &amp;quot;xxx&amp;quot; 
&amp;#39;hello&amp;#39;.repeat(2)  // &amp;quot;hellohello&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-set-&quot;&gt;&lt;a name=&quot;Set 数据结构（★★）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;Set 数据结构（★★）&lt;/h3&gt;&lt;p&gt;ES6 提供了新的数据结构  Set。它类似于数组，但是成员的值都是唯一的，没有重复的值。&lt;/p&gt;
&lt;p&gt;Set本身是一个构造函数，用来生成  Set  数据结构&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const s = new Set();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set函数可以接受一个数组作为参数，用来初始化。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;const set = new Set([1, 2, 3, 4, 4]);//{1, 2, 3, 4}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-u5B9Eu4F8Bu65B9u6CD5&quot;&gt;&lt;a name=&quot;实例方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;实例方法&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;add(value)：添加某个值，返回 Set 结构本身&lt;/li&gt;&lt;li&gt;delete(value)：删除某个值，返回一个布尔值，表示删除是否成功&lt;/li&gt;&lt;li&gt;has(value)：返回一个布尔值，表示该值是否为 Set 的成员&lt;/li&gt;&lt;li&gt;clear()：清除所有成员，没有返回值&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; const s = new Set();
 s.add(1).add(2).add(3); // 向 set 结构中添加值 
 s.delete(2)             // 删除 set 结构中的2值   
 s.has(1)                // 表示 set 结构中是否有1这个值 返回布尔值 
 s.clear()               // 清除 set 结构中的所有值
 //注意：删除的是元素的值，不是代表的索引&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-u904Du5386&quot;&gt;&lt;a name=&quot;遍历&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;遍历&lt;/h4&gt;&lt;p&gt;Set 结构的实例与数组一样，也拥有forEach方法，用于对每个成员执行某种操作，没有返回值。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;s.forEach(value =&amp;gt; console.log(value))
&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Tue, 28 Apr 2020 02:51:41 +0800</pubDate></item><item><title>JavaScript高级第04天笔记</title><link>https://www.liuhuadong.cc/post/47.html</link><description>&lt;h1 id=&quot;h1-javascript-04-&quot;&gt;&lt;a name=&quot;JavaScript高级第04天笔记&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;JavaScript高级第04天笔记&lt;/h1&gt;&lt;h2 id=&quot;h2-1-&quot;&gt;&lt;a name=&quot;1.正则表达式概述&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.正则表达式概述&lt;/h2&gt;&lt;h3 id=&quot;h3-1-1-&quot;&gt;&lt;a name=&quot;1.1什么是正则表达式&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1什么是正则表达式&lt;/h3&gt;&lt;p&gt;正则表达式（ Regular Expression ）是用于匹配字符串中字符组合的模式。在JavaScript中，正则表达式也是对象。&lt;/p&gt;
&lt;p&gt;正则表通常被用来检索、替换那些符合某个模式（规则）的文本，例如验证表单：用户名表单只能输入英文字母、数字或者下划线， 昵称输入框中可以输入中文(匹配)。此外，正则表达式还常用于过滤掉页面内容中的一些敏感词(替换)，或从字符串中获取我们想要的特定部分(提取)等 。&lt;/p&gt;
&lt;p&gt;其他语言也会使用正则表达式，本阶段我们主要是利用JavaScript 正则表达式完成表单验证。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-2-&quot;&gt;&lt;a name=&quot;1.2 正则表达式的特点&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2 正则表达式的特点&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;灵活性、逻辑性和功能性非常的强。&lt;/li&gt;&lt;li&gt;可以迅速地用极简单的方式达到字符串的复杂控制。&lt;/li&gt;&lt;li&gt;对于刚接触的人来说，比较晦涩难懂。比如：^\w+([-+.]\w+)&lt;em&gt;@\w+([-.]\w+)&lt;/em&gt;.\w+([-.]\w+)*$&lt;/li&gt;&lt;li&gt;实际开发,一般都是直接复制写好的正则表达式. 但是要求会使用正则表达式并且根据实际情况修改正则表达式.   比如用户名:   /^[a-z0-9_-]{3,16}$/&lt;/li&gt;&lt;/ol&gt;
&lt;h2 id=&quot;h2-2-js-&quot;&gt;&lt;a name=&quot;2.正则表达式在js中的使用&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.正则表达式在js中的使用&lt;/h2&gt;&lt;h3 id=&quot;h3-2-1-&quot;&gt;&lt;a name=&quot;2.1正则表达式的创建&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.1正则表达式的创建&lt;/h3&gt;&lt;p&gt;在 JavaScript 中，可以通过两种方式创建一个正则表达式。&lt;/p&gt;
&lt;p&gt;方式一：通过调用RegExp对象的构造函数创建 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var regexp = new RegExp(/123/);
console.log(regexp);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;方式二：利用字面量创建 正则表达式&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; var rg = /123/;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-2-2-&quot;&gt;&lt;a name=&quot;2.2测试正则表达式&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2测试正则表达式&lt;/h3&gt;&lt;p&gt;test() 正则对象方法，用于检测字符串是否符合该规则，该对象会返回 true 或 false，其参数是测试字符串。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var rg = /123/;
console.log(rg.test(123));//匹配字符中是否出现123  出现结果为true
console.log(rg.test(&amp;#39;abc&amp;#39;));//匹配字符中是否出现123 未出现结果为false&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images4/img4.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2-3-&quot;&gt;&lt;a name=&quot;3.正则表达式中的特殊字符&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.正则表达式中的特殊字符&lt;/h2&gt;&lt;h3 id=&quot;h3-3-1-&quot;&gt;&lt;a name=&quot;3.1正则表达式的组成&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.1正则表达式的组成&lt;/h3&gt;&lt;p&gt;一个正则表达式可以由简单的字符构成，比如 /abc/，也可以是简单和特殊字符的组合，比如 /ab*c/ 。其中特殊字符也被称为元字符，在正则表达式中是具有特殊意义的专用符号，如 ^ 、$ 、+ 等。&lt;/p&gt;
&lt;p&gt;特殊字符非常多，可以参考： &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions&quot;&gt;MDN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;jQuery 手册：正则表达式部分&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;&lt;http://tool.oschina.net/regex&quot;&gt;正则测试工具&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-3-2-&quot;&gt;&lt;a name=&quot;3.2边界符&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.2边界符&lt;/h3&gt;&lt;p&gt;正则表达式中的边界符（位置符）用来提示字符所处的位置，主要有两个字符&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;边界符&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;^&lt;/td&gt;
&lt;td&gt;表示匹配行首的文本（以谁开始）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$&lt;/td&gt;
&lt;td&gt;表示匹配行尾的文本（以谁结束）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;如果 ^和 $ 在一起，表示必须是精确匹配。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var rg = /abc/; // 正则表达式里面不需要加引号 不管是数字型还是字符串型
// /abc/ 只要包含有abc这个字符串返回的都是true
console.log(rg.test(&amp;#39;abc&amp;#39;));
console.log(rg.test(&amp;#39;abcd&amp;#39;));
console.log(rg.test(&amp;#39;aabcd&amp;#39;));
console.log(&amp;#39;---------------------------&amp;#39;);
var reg = /^abc/;
console.log(reg.test(&amp;#39;abc&amp;#39;)); // true
console.log(reg.test(&amp;#39;abcd&amp;#39;)); // true
console.log(reg.test(&amp;#39;aabcd&amp;#39;)); // false
console.log(&amp;#39;---------------------------&amp;#39;);
var reg1 = /^abc$/; // 精确匹配 要求必须是 abc字符串才符合规范
console.log(reg1.test(&amp;#39;abc&amp;#39;)); // true
console.log(reg1.test(&amp;#39;abcd&amp;#39;)); // false
console.log(reg1.test(&amp;#39;aabcd&amp;#39;)); // false
console.log(reg1.test(&amp;#39;abcabc&amp;#39;)); // false&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-3-3-&quot;&gt;&lt;a name=&quot;3.3字符类&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.3字符类&lt;/h3&gt;&lt;p&gt;字符类表示有一系列字符可供选择，只要匹配其中一个就可以了。所有可供选择的字符都放在方括号内。&lt;/p&gt;
&lt;h4 id=&quot;h4-3-3-1-&quot;&gt;&lt;a name=&quot;3.3.1 [] 方括号&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.3.1 [] 方括号&lt;/h4&gt;&lt;p&gt;表示有一系列字符可供选择，只要匹配其中一个就可以了&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var rg = /[abc]/; // 只要包含有a 或者 包含有b 或者包含有c 都返回为true
console.log(rg.test(&amp;#39;andy&amp;#39;));//true
console.log(rg.test(&amp;#39;baby&amp;#39;));//true
console.log(rg.test(&amp;#39;color&amp;#39;));//true
console.log(rg.test(&amp;#39;red&amp;#39;));//false
var rg1 = /^[abc]$/; // 三选一 只有是a 或者是 b  或者是c 这三个字母才返回 true
console.log(rg1.test(&amp;#39;aa&amp;#39;));//false
console.log(rg1.test(&amp;#39;a&amp;#39;));//true
console.log(rg1.test(&amp;#39;b&amp;#39;));//true
console.log(rg1.test(&amp;#39;c&amp;#39;));//true
console.log(rg1.test(&amp;#39;abc&amp;#39;));//true
----------------------------------------------------------------------------------
var reg = /^[a-z]$/ //26个英文字母任何一个字母返回 true  - 表示的是a 到z 的范围  
console.log(reg.test(&amp;#39;a&amp;#39;));//true
console.log(reg.test(&amp;#39;z&amp;#39;));//true
console.log(reg.test(&amp;#39;A&amp;#39;));//false
-----------------------------------------------------------------------------------
//字符组合
var reg1 = /^[a-zA-Z0-9]$/; // 26个英文字母(大写和小写都可以)任何一个字母返回 true  
------------------------------------------------------------------------------------
//取反 方括号内部加上 ^ 表示取反，只要包含方括号内的字符，都返回 false 。
var reg2 = /^[^a-zA-Z0-9]$/;
console.log(reg2.test(&amp;#39;a&amp;#39;));//false
console.log(reg2.test(&amp;#39;B&amp;#39;));//false
console.log(reg2.test(8));//false
console.log(reg2.test(&amp;#39;!&amp;#39;));//true&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-3-3-2-&quot;&gt;&lt;a name=&quot;3.3.2量词符&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.3.2量词符&lt;/h4&gt;&lt;p&gt;量词符用来设定某个模式出现的次数。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;量词&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;重复0次或更多次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;重复1次或更多次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;?&lt;/td&gt;
&lt;td&gt;重复0次或1次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{n}&lt;/td&gt;
&lt;td&gt;重复n次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{n,}&lt;/td&gt;
&lt;td&gt;重复n次或更多次&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{n,m}&lt;/td&gt;
&lt;td&gt;重复n到m次&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;h4-3-3-3-&quot;&gt;&lt;a name=&quot;3.3.3用户名表单验证&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.3.3用户名表单验证&lt;/h4&gt;&lt;p&gt;功能需求:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果用户名输入合法, 则后面提示信息为:  用户名合法,并且颜色为绿色&lt;/li&gt;&lt;li&gt;如果用户名输入不合法, 则后面提示信息为:  用户名不符合规范, 并且颜色为红色&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images4/img2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images4/img1.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;分析:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用户名只能为英文字母,数字,下划线或者短横线组成, 并且用户名长度为6~16位.&lt;/li&gt;&lt;li&gt;首先准备好这种正则表达式模式/$[a-zA-Z0-9-_]{6,16}^/&lt;/li&gt;&lt;li&gt;当表单失去焦点就开始验证. &lt;/li&gt;&lt;li&gt;如果符合正则规范, 则让后面的span标签添加 right类.&lt;/li&gt;&lt;li&gt;如果不符合正则规范, 则让后面的span标签添加 wrong类.&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;uname&amp;quot;&amp;gt; &amp;lt;span&amp;gt;请输入用户名&amp;lt;/span&amp;gt;
 &amp;lt;script&amp;gt;
 //  量词是设定某个模式出现的次数
 var reg = /^[a-zA-Z0-9_-]{6,16}$/; // 这个模式用户只能输入英文字母 数字 下划线 中划线
 var uname = document.querySelector(&amp;#39;.uname&amp;#39;);
 var span = document.querySelector(&amp;#39;span&amp;#39;);
 uname.onblur = function() {
   if (reg.test(this.value)) {
   console.log(&amp;#39;正确的&amp;#39;);
   span.className = &amp;#39;right&amp;#39;;
   span.innerHTML = &amp;#39;用户名格式输入正确&amp;#39;;
   } else {
   console.log(&amp;#39;错误的&amp;#39;);
   span.className = &amp;#39;wrong&amp;#39;;
   span.innerHTML = &amp;#39;用户名格式输入不正确&amp;#39;;
   }
 }
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-3-3-4-&quot;&gt;&lt;a name=&quot;3.3.4 括号总结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.3.4 括号总结&lt;/h4&gt;&lt;p&gt;1.大括号  量词符.  里面表示重复次数&lt;/p&gt;
&lt;p&gt;2.中括号 字符集合。匹配方括号中的任意字符. &lt;/p&gt;
&lt;p&gt;3.小括号表示优先级&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://c.runoob.com/&quot;&gt;正则表达式在线测试&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-3-4-&quot;&gt;&lt;a name=&quot;3.4预定义类&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.4预定义类&lt;/h3&gt;&lt;p&gt;预定义类指的是某些常见模式的简写方式.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images4/img3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;案例:验证座机号码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var reg = /^\d{3}-\d{8}|\d{4}-\d{7}$/;
var reg = /^\d{3,4}-\d{7,8}$/;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;表单验证案例&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;//手机号验证:/^1[3|4|5|7|8][0-9]{9}$/;
//验证通过与不通过更换元素的类名与元素中的内容
 if (reg.test(this.value)) {
    // console.log(&amp;#39;正确的&amp;#39;);
    this.nextElementSibling.className = &amp;#39;success&amp;#39;;
    this.nextElementSibling.innerHTML = &amp;#39;&amp;lt;i class=&amp;quot;success_icon&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; 恭喜您输入正确&amp;#39;;
   } else {
       // console.log(&amp;#39;不正确&amp;#39;);
      this.nextElementSibling.className = &amp;#39;error&amp;#39;;
      this.nextElementSibling.innerHTML = &amp;#39;&amp;lt;i class=&amp;quot;error_icon&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;格式不正确,请从新输入 &amp;#39;;
 }&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;//QQ号验证: /^[1-9]\d{4,}$/; 
//昵称验证:/^[\u4e00-\u9fa5]{2,8}$/
//验证通过与不通过更换元素的类名与元素中的内容 ,将上一步的匹配代码进行封装,多次调用即可
 function regexp(ele, reg) {
    ele.onblur = function() {
      if (reg.test(this.value)) {
        // console.log(&amp;#39;正确的&amp;#39;);
        this.nextElementSibling.className = &amp;#39;success&amp;#39;;
        this.nextElementSibling.innerHTML = &amp;#39;&amp;lt;i class=&amp;quot;success_icon&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; 恭喜您输入正确&amp;#39;;
   } else {
     // console.log(&amp;#39;不正确&amp;#39;);
     this.nextElementSibling.className = &amp;#39;error&amp;#39;;
     this.nextElementSibling.innerHTML = &amp;#39;&amp;lt;i class=&amp;quot;error_icon&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; 格式不正确,请从新输入 &amp;#39;;
            }
        }
 };&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;//密码验证:/^[a-zA-Z0-9_-]{6,16}$/
//再次输入密码只需匹配与上次输入的密码值 是否一致&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-3-5-replace&quot;&gt;&lt;a name=&quot;3.5正则替换replace&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.5正则替换replace&lt;/h3&gt;&lt;p&gt;replace() 方法可以实现替换字符串操作，用来替换的参数可以是一个字符串或是一个正则表达式。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var str = &amp;#39;andy和red&amp;#39;;
var newStr = str.replace(&amp;#39;andy&amp;#39;, &amp;#39;baby&amp;#39;);
console.log(newStr)//baby和red
//等同于 此处的andy可以写在正则表达式内
var newStr2 = str.replace(/andy/, &amp;#39;baby&amp;#39;);
console.log(newStr2)//baby和red
//全部替换
var str = &amp;#39;abcabc&amp;#39;
var nStr = str.replace(/a/,&amp;#39;哈哈&amp;#39;)
console.log(nStr) //哈哈bcabc
//全部替换g
var nStr = str.replace(/a/a,&amp;#39;哈哈&amp;#39;)
console.log(nStr) //哈哈bc哈哈bc
//忽略大小写i
var str = &amp;#39;aAbcAba&amp;#39;;
var newStr = str.replace(/a/gi,&amp;#39;哈哈&amp;#39;)//&amp;quot;哈哈哈哈bc哈哈b哈哈&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;案例:过滤敏感词汇&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;textarea name=&amp;quot;&amp;quot; id=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt; &amp;lt;button&amp;gt;提交&amp;lt;/button&amp;gt;
&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
    var text = document.querySelector(&amp;#39;textarea&amp;#39;);
    var btn = document.querySelector(&amp;#39;button&amp;#39;);
    var div = document.querySelector(&amp;#39;div&amp;#39;);
    btn.onclick = function() {
        div.innerHTML = text.value.replace(/激情|gay/g, &amp;#39;**&amp;#39;);
    }
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Tue, 28 Apr 2020 02:41:28 +0800</pubDate></item><item><title>JavaScript高级第03天笔记</title><link>https://www.liuhuadong.cc/post/46.html</link><description>&lt;h1 id=&quot;h1-javascript-03-&quot;&gt;&lt;a name=&quot;JavaScript高级第03天笔记&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;JavaScript高级第03天笔记&lt;/h1&gt;&lt;h2 id=&quot;h2-1-&quot;&gt;&lt;a name=&quot;1.函数的定义和调用&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.函数的定义和调用&lt;/h2&gt;&lt;h3 id=&quot;h3-1-1-&quot;&gt;&lt;a name=&quot;1.1函数的定义方式&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1函数的定义方式&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;方式1 函数声明方式 function 关键字 (命名函数)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function fn(){}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;方式2 函数表达式(匿名函数)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var fn = function(){}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;方式3 new Function() &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var f = new Function(&amp;#39;a&amp;#39;, &amp;#39;b&amp;#39;, &amp;#39;console.log(a + b)&amp;#39;);
f(1, 2);

var fn = new Function(&amp;#39;参数1&amp;#39;,&amp;#39;参数2&amp;#39;..., &amp;#39;函数体&amp;#39;)
注意
/*Function 里面参数都必须是字符串格式
第三种方式执行效率低，也不方便书写，因此较少使用
所有函数都是 Function 的实例(对象)  
函数也属于对象
*/&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-1-2-&quot;&gt;&lt;a name=&quot;1.2函数的调用&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2函数的调用&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;/* 1. 普通函数 */
function fn() {
    console.log(&amp;#39;人生的巅峰&amp;#39;);
}
 fn(); 
/* 2. 对象的方法 */
var o = {
  sayHi: function() {
      console.log(&amp;#39;人生的巅峰&amp;#39;);
  }
}
o.sayHi();
/* 3. 构造函数*/
function Star() {};
new Star();
/* 4. 绑定事件函数*/
 btn.onclick = function() {};   // 点击了按钮就可以调用这个函数
/* 5. 定时器函数*/
setInterval(function() {}, 1000);  这个函数是定时器自动1秒钟调用一次
/* 6. 立即执行函数(自调用函数)*/
(function() {
    console.log(&amp;#39;人生的巅峰&amp;#39;);
})();&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-2-this&quot;&gt;&lt;a name=&quot;2.this&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.this&lt;/h2&gt;&lt;h3 id=&quot;h3-2-1-this-&quot;&gt;&lt;a name=&quot;2.1函数内部的this指向&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.1函数内部的this指向&lt;/h3&gt;&lt;p&gt;这些 this 的指向，是当我们调用函数的时候确定的。调用方式的不同决定了this 的指向不同&lt;/p&gt;
&lt;p&gt;一般指向我们的调用者.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images3/img1.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-2-2-this-&quot;&gt;&lt;a name=&quot;2.2改变函数内部 this 指向&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2改变函数内部 this 指向&lt;/h3&gt;&lt;h4 id=&quot;h4-2-2-1-call-&quot;&gt;&lt;a name=&quot;2.2.1 call方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2.1 call方法&lt;/h4&gt;&lt;p&gt;call()方法调用一个对象。简单理解为调用函数的方式，但是它可以改变函数的 this 指向&lt;/p&gt;
&lt;p&gt;应用场景:  经常做继承. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var o = {
    name: &amp;#39;andy&amp;#39;
}
 function fn(a, b) {
      console.log(this);
      console.log(a+b)
};
fn(1,2)// 此时的this指向的是window 运行结果为3
fn.call(o,1,2)//此时的this指向的是对象o,参数使用逗号隔开,运行结果为3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上代码运行结果为:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images3/img4.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;h4-2-2-2-apply-&quot;&gt;&lt;a name=&quot;2.2.2 apply方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2.2 apply方法&lt;/h4&gt;&lt;p&gt;apply() 方法调用一个函数。简单理解为调用函数的方式，但是它可以改变函数的 this 指向。&lt;/p&gt;
&lt;p&gt;应用场景:  经常跟数组有关系&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var o = {
    name: &amp;#39;andy&amp;#39;
}
 function fn(a, b) {
      console.log(this);
      console.log(a+b)
};
fn()// 此时的this指向的是window 运行结果为3
fn.apply(o,[1,2])//此时的this指向的是对象o,参数使用数组传递 运行结果为3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images3/img4.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;h4-2-2-3-bind-&quot;&gt;&lt;a name=&quot;2.2.3 bind方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2.3 bind方法&lt;/h4&gt;&lt;p&gt;bind() 方法不会调用函数,但是能改变函数内部this 指向,返回的是原函数改变this之后产生的新函数&lt;/p&gt;
&lt;p&gt;如果只是想改变 this 指向，并且不想调用这个函数的时候，可以使用bind&lt;/p&gt;
&lt;p&gt;应用场景:不调用函数,但是还想改变this指向&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; var o = {
 name: &amp;#39;andy&amp;#39;
 };

function fn(a, b) {
    console.log(this);
    console.log(a + b);
};
var f = fn.bind(o, 1, 2); //此处的f是bind返回的新函数
f();//调用新函数  this指向的是对象o 参数使用逗号隔开&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images3/img5.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;h4-2-2-4-call-apply-bind-&quot;&gt;&lt;a name=&quot;2.2.4 call、apply、bind三者的异同&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2.4 call、apply、bind三者的异同&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;共同点 : 都可以改变this指向&lt;/li&gt;&lt;li&gt;不同点:&lt;ul&gt;
&lt;li&gt;call 和 apply  会调用函数, 并且改变函数内部this指向.&lt;/li&gt;&lt;li&gt;call 和 apply传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递&lt;/li&gt;&lt;li&gt;bind  不会调用函数, 可以改变函数内部this指向.&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;应用场景&lt;ol&gt;
&lt;li&gt;call 经常做继承. &lt;/li&gt;&lt;li&gt;apply经常跟数组有关系.  比如借助于数学对象实现数组最大值最小值&lt;/li&gt;&lt;li&gt;bind  不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向. &lt;/li&gt;&lt;/ol&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2-3-&quot;&gt;&lt;a name=&quot;3.严格模式&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.严格模式&lt;/h2&gt;&lt;h3 id=&quot;h3-3-1-&quot;&gt;&lt;a name=&quot;3.1什么是严格模式&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.1什么是严格模式&lt;/h3&gt;&lt;p&gt;JavaScript 除了提供正常模式外，还提供了严格模式（strict mode）。ES5 的严格模式是采用具有限制性 JavaScript变体的一种方式，即在严格的条件下运行 JS 代码。&lt;/p&gt;
&lt;p&gt;严格模式在 IE10 以上版本的浏览器中才会被支持，旧版本浏览器中会被忽略。&lt;/p&gt;
&lt;p&gt;严格模式对正常的 JavaScript 语义做了一些更改： &lt;/p&gt;
&lt;p&gt;1.消除了 Javascript 语法的一些不合理、不严谨之处，减少了一些怪异行为。&lt;/p&gt;
&lt;p&gt;2.消除代码运行的一些不安全之处，保证代码运行的安全。&lt;/p&gt;
&lt;p&gt;3.提高编译器效率，增加运行速度。&lt;/p&gt;
&lt;p&gt;4.禁用了在 ECMAScript 的未来版本中可能会定义的一些语法，为未来新版本的 Javascript 做好铺垫。比如一些保留字如：class,enum,export, extends, import, super 不能做变量名&lt;/p&gt;
&lt;h3 id=&quot;h3-3-2-&quot;&gt;&lt;a name=&quot;3.2开启严格模式&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.2开启严格模式&lt;/h3&gt;&lt;p&gt;严格模式可以应用到整个脚本或个别函数中。因此在使用时，我们可以将严格模式分为为脚本开启严格模式和为函数开启严格模式两种情况。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;情况一 :为脚本开启严格模式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;有的 script 脚本是严格模式，有的 script 脚本是正常模式，这样不利于文件合并，所以可以将整个脚本文件放在一个立即执行的匿名函数之中。这样独立创建一个作用域而不影响其他&lt;br&gt;script 脚本文件。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;(function (){
  //在当前的这个自调用函数中有开启严格模式，当前函数之外还是普通模式
　　　　&amp;quot;use strict&amp;quot;;
       var num = 10;
　　　　function fn() {}
})();
//或者 
&amp;lt;script&amp;gt;
  　&amp;quot;use strict&amp;quot;; //当前script标签开启了严格模式
&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
              //当前script标签未开启严格模式
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;情况二: 为函数开启严格模式&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;要给某个函数开启严格模式，需要把“use strict”;  (或 ‘use strict’; ) 声明放在函数体所有语句之前。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function fn(){
　　&amp;quot;use strict&amp;quot;;
　　return &amp;quot;123&amp;quot;;
} 
//当前fn函数开启了严格模式&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-3-3-&quot;&gt;&lt;a name=&quot;3.3严格模式中的变化&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.3严格模式中的变化&lt;/h3&gt;&lt;p&gt;严格模式对 Javascript 的语法和行为，都做了一些改变。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;#39;use strict&amp;#39;
num = 10 
console.log(num)//严格模式后使用未声明的变量
--------------------------------------------------------------------------------
var num2 = 1;
delete num2;//严格模式不允许删除变量
--------------------------------------------------------------------------------
function fn() {
 console.log(this); // 严格模式下全局作用域中函数中的 this 是 undefined
}
fn();  
---------------------------------------------------------------------------------
function Star() {
     this.sex = &amp;#39;男&amp;#39;;
}
// Star();严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错.
var ldh = new Star();
console.log(ldh.sex);
----------------------------------------------------------------------------------
setTimeout(function() {
  console.log(this); //严格模式下，定时器 this 还是指向 window
}, 2000);  &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode&quot;&gt;更多严格模式要求参考&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2-4-&quot;&gt;&lt;a name=&quot;4.高阶函数&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;4.高阶函数&lt;/h2&gt;&lt;p&gt;高阶函数是对其他函数进行操作的函数，它接收函数作为参数或将函数作为返回值输出。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images3/img2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;此时fn 就是一个高阶函数&lt;/p&gt;
&lt;p&gt;函数也是一种数据类型，同样可以作为参数，传递给另外一个参数使用。最典型的就是作为回调函数。&lt;/p&gt;
&lt;p&gt;同理函数也可以作为返回值传递回来&lt;/p&gt;
&lt;h2 id=&quot;h2-5-&quot;&gt;&lt;a name=&quot;5.闭包&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.闭包&lt;/h2&gt;&lt;h3 id=&quot;h3-5-1-&quot;&gt;&lt;a name=&quot;5.1变量的作用域复习&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.1变量的作用域复习&lt;/h3&gt;&lt;p&gt;变量根据作用域的不同分为两种：全局变量和局部变量。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;函数内部可以使用全局变量。&lt;/li&gt;&lt;li&gt;函数外部不可以使用局部变量。&lt;/li&gt;&lt;li&gt;当函数执行完毕，本作用域内的局部变量会销毁。&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-5-2-&quot;&gt;&lt;a name=&quot;5.2什么是闭包&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.2什么是闭包&lt;/h3&gt;&lt;p&gt;闭包（closure）指有权访问另一个函数作用域中变量的函数。简单理解就是 ，一个作用域可以访问另外一个函数内部的局部变量。 &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images3/img3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-5-3-&quot;&gt;&lt;a name=&quot;5.3闭包的作用&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.3闭包的作用&lt;/h3&gt;&lt;p&gt;作用：延伸变量的作用范围。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; function fn() {
   var num = 10;
   function fun() {
       console.log(num);
     }
    return fun;
 }
var f = fn();
f();&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-5-4-&quot;&gt;&lt;a name=&quot;5.4闭包的案例&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.4闭包的案例&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;利用闭包的方式得到当前li 的索引号&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;for (var i = 0; i &amp;lt; lis.length; i++) {
// 利用for循环创建了4个立即执行函数
// 立即执行函数也成为小闭包因为立即执行函数里面的任何一个函数都可以使用它的i这变量
(function(i) {
    lis[i].onclick = function() {
      console.log(i);
    }
 })(i);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;闭包应用-3秒钟之后,打印所有li元素的内容&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; for (var i = 0; i &amp;lt; lis.length; i++) {
   (function(i) {
     setTimeout(function() {
     console.log(lis[i].innerHTML);
     }, 3000)
   })(i);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;闭包应用-计算打车价格 &lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;/*需求分析
打车起步价13(3公里内),  之后每多一公里增加 5块钱.  用户输入公里数就可以计算打车价格
如果有拥堵情况,总价格多收取10块钱拥堵费*/

 var car = (function() {
     var start = 13; // 起步价  局部变量
     var total = 0; // 总价  局部变量
     return {
       // 正常的总价
       price: function(n) {
         if (n &amp;lt;= 3) {
           total = start;
         } else {
           total = start + (n - 3) * 5
         }
         return total;
       },
       // 拥堵之后的费用
       yd: function(flag) {
         return flag ? total + 10 : total;
       }
    }
 })();
console.log(car.price(5)); // 23
console.log(car.yd(true)); // 33&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-5-5-&quot;&gt;&lt;a name=&quot;5.5案例&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;5.5案例&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; var name = &amp;quot;The Window&amp;quot;;
   var object = {
     name: &amp;quot;My Object&amp;quot;,
     getNameFunc: function() {
     return function() {
     return this.name;
     };
   }
 };
console.log(object.getNameFunc()())
-----------------------------------------------------------------------------------
var name = &amp;quot;The Window&amp;quot;;　　
  var object = {　　　　
    name: &amp;quot;My Object&amp;quot;,
    getNameFunc: function() {
    var that = this;
    return function() {
    return that.name;
    };
  }
};
console.log(object.getNameFunc()())
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-6-&quot;&gt;&lt;a name=&quot;6.递归&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;6.递归&lt;/h2&gt;&lt;h3 id=&quot;h3-6-1-&quot;&gt;&lt;a name=&quot;6.1什么是递归&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;6.1什么是递归&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;递归：&lt;/strong&gt;如果一个函数在内部可以调用其本身，那么这个函数就是递归函数。简单理解:函数内部自己调用自己, 这个函数就是递归函数&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;递归函数的作用和循环效果一样，由于递归很容易发生“栈溢出”错误（stack overflow），所以必须要加退出条件return。&lt;/p&gt;
&lt;h3 id=&quot;h3-6-2-1-n-&quot;&gt;&lt;a name=&quot;6.2利用递归求1~n的阶乘&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;6.2利用递归求1~n的阶乘&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;//利用递归函数求1~n的阶乘 1 * 2 * 3 * 4 * ..n
 function fn(n) {
     if (n == 1) { //结束条件
       return 1;
     }
     return n * fn(n - 1);
 }
 console.log(fn(3));&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images3/img6.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-6-3-&quot;&gt;&lt;a name=&quot;6.3利用递归求斐波那契数列&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;6.3利用递归求斐波那契数列&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// 利用递归函数求斐波那契数列(兔子序列)  1、1、2、3、5、8、13、21...
// 用户输入一个数字 n 就可以求出 这个数字对应的兔子序列值
// 我们只需要知道用户输入的n 的前面两项(n-1 n-2)就可以计算出n 对应的序列值
function fb(n) {
  if (n === 1 || n === 2) {
        return 1;
  }
  return fb(n - 1) + fb(n - 2);
}
console.log(fb(3));&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-6-4-&quot;&gt;&lt;a name=&quot;6.4利用递归遍历数据&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;6.4利用递归遍历数据&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// 我们想要做输入id号,就可以返回的数据对象
 var data = [{
   id: 1,
   name: &amp;#39;家电&amp;#39;,
   goods: [{
     id: 11,
     gname: &amp;#39;冰箱&amp;#39;,
     goods: [{
       id: 111,
       gname: &amp;#39;海尔&amp;#39;
     }, {
       id: 112,
       gname: &amp;#39;美的&amp;#39;
     },

            ]

   }, {
     id: 12,
     gname: &amp;#39;洗衣机&amp;#39;
   }]
 }, {
   id: 2,
   name: &amp;#39;服饰&amp;#39;
}];
//1.利用 forEach 去遍历里面的每一个对象
 function getID(json, id) {
   var o = {};
   json.forEach(function(item) {
     // console.log(item); // 2个数组元素
     if (item.id == id) {
       // console.log(item);
       o = item;
       return o;
       // 2. 我们想要得里层的数据 11 12 可以利用递归函数
       // 里面应该有goods这个数组并且数组的长度不为 0 
     } else if (item.goods &amp;amp;&amp;amp; item.goods.length &amp;gt; 0) {
       o = getID(item.goods, id);
     }
   });
   return o;
}&lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Tue, 28 Apr 2020 02:36:00 +0800</pubDate></item><item><title>JavaScript高级第02天笔记</title><link>https://www.liuhuadong.cc/post/45.html</link><description>&lt;h1 id=&quot;h1-javascript-02-&quot;&gt;&lt;a name=&quot;JavaScript高级第02天笔记&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;JavaScript高级第02天笔记&lt;/h1&gt;&lt;h2 id=&quot;h2-1-&quot;&gt;&lt;a name=&quot;1.构造函数和原型&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.构造函数和原型&lt;/h2&gt;&lt;h3 id=&quot;h3-1-1-&quot;&gt;&lt;a name=&quot;1.1对象的三种创建方式–复习&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1对象的三种创建方式–复习&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;字面量方式&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var obj = {};&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;new关键字&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var obj = new Object();&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;构造函数方式&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function Person(name,age){
  this.name = name;
  this.age = age;
}
var obj = new Person(&amp;#39;zs&amp;#39;,12);&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-1-2-&quot;&gt;&lt;a name=&quot;1.2静态成员和实例成员&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2静态成员和实例成员&lt;/h3&gt;&lt;h4 id=&quot;h4-1-2-1-&quot;&gt;&lt;a name=&quot;1.2.1实例成员&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.1实例成员&lt;/h4&gt;&lt;p&gt;实例成员就是构造函数内部通过this添加的成员 如下列代码中uname age sing 就是实例成员,实例成员只能通过实例化的对象来访问&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; function Star(uname, age) {
     this.uname = uname;
     this.age = age;
     this.sing = function() {
     console.log(&amp;#39;我会唱歌&amp;#39;);
    }
}
var ldh = new Star(&amp;#39;刘德华&amp;#39;, 18);
console.log(ldh.uname);//实例成员只能通过实例化的对象来访问&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;h4-1-2-2-&quot;&gt;&lt;a name=&quot;1.2.2静态成员&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.2静态成员&lt;/h4&gt;&lt;p&gt;静态成员 在构造函数本身上添加的成员  如下列代码中 sex 就是静态成员,静态成员只能通过构造函数来访问&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; function Star(uname, age) {
     this.uname = uname;
     this.age = age;
     this.sing = function() {
     console.log(&amp;#39;我会唱歌&amp;#39;);
    }
}
Star.sex = &amp;#39;男&amp;#39;;
var ldh = new Star(&amp;#39;刘德华&amp;#39;, 18);
console.log(Star.sex);//静态成员只能通过构造函数来访问&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-3-&quot;&gt;&lt;a name=&quot;1.3构造函数的问题&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3构造函数的问题&lt;/h3&gt;&lt;p&gt;构造函数方法很好用，但是存在浪费内存的问题。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img1.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-1-4-prototype&quot;&gt;&lt;a name=&quot;1.4构造函数原型prototype&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4构造函数原型prototype&lt;/h3&gt;&lt;p&gt;构造函数通过原型分配的函数是所有对象所共享的。&lt;/p&gt;
&lt;p&gt;JavaScript 规定，每一个构造函数都有一个prototype 属性，指向另一个对象。注意这个prototype就是一个对象，这个对象的所有属性和方法，都会被构造函数所拥有。&lt;/p&gt;
&lt;p&gt;我们可以把那些不变的方法，直接定义在 prototype 对象上，这样所有对象的实例就可以共享这些方法。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function Star(uname, age) {
    this.uname = uname;
    this.age = age;
}
Star.prototype.sing = function() {
    console.log(&amp;#39;我会唱歌&amp;#39;);
}
var ldh = new Star(&amp;#39;刘德华&amp;#39;, 18);
var zxy = new Star(&amp;#39;张学友&amp;#39;, 19);
ldh.sing();//我会唱歌
zxy.sing();//我会唱歌&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img7.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-1-5-&quot;&gt;&lt;a name=&quot;1.5对象原型&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.5对象原型&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;对象都会有一个属性 __proto__ 指向构造函数的 prototype 原型对象，之所以我们对象可以使用构造函数 prototype 原型对象的属性和方法，就是因为对象有 __proto__ 原型的存在。
__proto__对象原型和原型对象 prototype 是等价的
__proto__对象原型的意义就在于为对象的查找机制提供一个方向，或者说一条路线，但是它是一个非标准属性，因此实际开发中，不可以使用这个属性，它只是内部指向原型对象 prototype&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-1-6constructor-&quot;&gt;&lt;a name=&quot;1.6constructor构造函数&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.6constructor构造函数&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;对象原型（ __proto__）和构造函数（prototype）原型对象里面都有一个属性 constructor 属性 ，constructor 我们称为构造函数，因为它指回构造函数本身。
constructor 主要用于记录该对象引用于哪个构造函数，它可以让原型对象重新指向原来的构造函数。
一般情况下，对象的方法都在构造函数的原型对象中设置。如果有多个对象的方法，我们可以给原型对象采取对象形式赋值，但是这样就会覆盖构造函数原型对象原来的内容，这样修改后的原型对象 constructor  就不再指向当前构造函数了。此时，我们可以在修改后的原型对象中，添加一个 constructor 指向原来的构造函数。&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数如:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; function Star(uname, age) {
     this.uname = uname;
     this.age = age;
 }
 // 很多情况下,我们需要手动的利用constructor 这个属性指回 原来的构造函数
 Star.prototype = {
 // 如果我们修改了原来的原型对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数
   constructor: Star, // 手动设置指回原来的构造函数
   sing: function() {
     console.log(&amp;#39;我会唱歌&amp;#39;);
   },
   movie: function() {
     console.log(&amp;#39;我会演电影&amp;#39;);
   }
}
var zxy = new Star(&amp;#39;张学友&amp;#39;, 19);
console.log(zxy)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上代码运行结果,设置constructor属性如图:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img8.png&quot; alt=&quot;&quot;&gt;如果未设置constructor属性,如图:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img9.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-1-7-&quot;&gt;&lt;a name=&quot;1.7原型链&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.7原型链&lt;/h3&gt;&lt;p&gt;​    每一个实例对象又有一个&lt;strong&gt;proto&lt;/strong&gt;属性，指向的构造函数的原型对象，构造函数的原型对象也是一个对象，也有&lt;strong&gt;proto&lt;/strong&gt;属性，这样一层一层往上找就形成了原型链。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img5.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-1-8-&quot;&gt;&lt;a name=&quot;1.8构造函数实例和原型对象三角关系&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.8构造函数实例和原型对象三角关系&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;1.构造函数的prototype属性指向了构造函数原型对象
2.实例对象是由构造函数创建的,实例对象的__proto__属性指向了构造函数的原型对象
3.构造函数的原型对象的constructor属性指向了构造函数,实例对象的原型的constructor属性也指向了构造函数&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img4.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-1-9-&quot;&gt;&lt;a name=&quot;1.9原型链和成员的查找机制&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.9原型链和成员的查找机制&lt;/h3&gt;&lt;p&gt;任何对象都有原型对象,也就是prototype属性,任何原型对象也是一个对象,该对象就有&lt;strong&gt;proto&lt;/strong&gt;属性,这样一层一层往上找,就形成了一条链,我们称此为原型链;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;当访问一个对象的属性（包括方法）时，首先查找这个对象自身有没有该属性。
如果没有就查找它的原型（也就是 __proto__指向的 prototype 原型对象）。
如果还没有就查找原型对象的原型（Object的原型对象）。
依此类推一直找到 Object 为止（null）。
__proto__对象原型的意义就在于为对象成员查找机制提供一个方向，或者说一条路线。&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-10-this-&quot;&gt;&lt;a name=&quot;1.10原型对象中this指向&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.10原型对象中this指向&lt;/h3&gt;&lt;p&gt;构造函数中的this和原型对象的this,都指向我们new出来的实例对象&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function Star(uname, age) {
    this.uname = uname;
    this.age = age;
}
var that;
Star.prototype.sing = function() {
    console.log(&amp;#39;我会唱歌&amp;#39;);
    that = this;
}
var ldh = new Star(&amp;#39;刘德华&amp;#39;, 18);
// 1. 在构造函数中,里面this指向的是对象实例 ldh
console.log(that === ldh);//true
// 2.原型对象函数里面的this 指向的是 实例对象 ldh&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img6.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-1-11-&quot;&gt;&lt;a name=&quot;1.11通过原型为数组扩展内置方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.11通过原型为数组扩展内置方法&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; Array.prototype.sum = function() {
   var sum = 0;
   for (var i = 0; i &amp;lt; this.length; i++) {
   sum += this[i];
   }
   return sum;
 };
 //此时数组对象中已经存在sum()方法了  可以始终 数组.sum()进行数据的求&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-2-&quot;&gt;&lt;a name=&quot;2.继承&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.继承&lt;/h2&gt;&lt;h3 id=&quot;h3-2-1call-&quot;&gt;&lt;a name=&quot;2.1call()&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.1call()&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;call()可以调用函数&lt;/li&gt;&lt;li&gt;call()可以修改this的指向,使用call()的时候 参数一是修改后的this指向,参数2,参数3..使用逗号隔开连接&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; function fn(x, y) {
     console.log(this);
     console.log(x + y);
}
  var o = {
      name: &amp;#39;andy&amp;#39;
  };
  fn.call(o, 1, 2);//调用了函数此时的this指向了对象o,&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img10.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-2-2-&quot;&gt;&lt;a name=&quot;2.2子构造函数继承父构造函数中的属性&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2子构造函数继承父构造函数中的属性&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;先定义一个父构造函数&lt;/li&gt;&lt;li&gt;再定义一个子构造函数&lt;/li&gt;&lt;li&gt;子构造函数继承父构造函数的属性(使用call方法)&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; // 1. 父构造函数
 function Father(uname, age) {
   // this 指向父构造函数的对象实例
   this.uname = uname;
   this.age = age;
 }
  // 2 .子构造函数 
function Son(uname, age, score) {
  // this 指向子构造函数的对象实例
  3.使用call方式实现子继承父的属性
  Father.call(this, uname, age);
  this.score = score;
}
var son = new Son(&amp;#39;刘德华&amp;#39;, 18, 100);
console.log(son);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img11.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-2-3-&quot;&gt;&lt;a name=&quot;2.3借用原型对象继承方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.3借用原型对象继承方法&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;先定义一个父构造函数&lt;/li&gt;&lt;li&gt;再定义一个子构造函数&lt;/li&gt;&lt;li&gt;子构造函数继承父构造函数的属性(使用call方法)&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// 1. 父构造函数
function Father(uname, age) {
  // this 指向父构造函数的对象实例
  this.uname = uname;
  this.age = age;
}
Father.prototype.money = function() {
  console.log(100000);
 };
 // 2 .子构造函数 
  function Son(uname, age, score) {
      // this 指向子构造函数的对象实例
      Father.call(this, uname, age);
      this.score = score;
  }
// Son.prototype = Father.prototype;  这样直接赋值会有问题,如果修改了子原型对象,父原型对象也会跟着一起变化
  Son.prototype = new Father();
  // 如果利用对象的形式修改了原型对象,别忘了利用constructor 指回原来的构造函数
  Son.prototype.constructor = Son;
  // 这个是子构造函数专门的方法
  Son.prototype.exam = function() {
    console.log(&amp;#39;孩子要考试&amp;#39;);

  }
  var son = new Son(&amp;#39;刘德华&amp;#39;, 18, 100);
  console.log(son);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如上代码结果如图:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images2/img12.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;h2-3-es5-&quot;&gt;&lt;a name=&quot;3.ES5新增方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.ES5新增方法&lt;/h2&gt;&lt;h3 id=&quot;h3-3-1-foreach-&quot;&gt;&lt;a name=&quot;3.1数组方法forEach遍历数组&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.1数组方法forEach遍历数组&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; arr.forEach(function(value, index, array) {
       //参数一是:数组元素
       //参数二是:数组元素的索引
       //参数三是:当前的数组
 })
  //相当于数组遍历的 for循环 没有返回值&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-3-2-filter-&quot;&gt;&lt;a name=&quot;3.2数组方法filter过滤数组&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.2数组方法filter过滤数组&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;  var arr = [12, 66, 4, 88, 3, 7];
  var newArr = arr.filter(function(value, index,array) {
       //参数一是:数组元素
     //参数二是:数组元素的索引
     //参数三是:当前的数组
     return value &amp;gt;= 20;
  });
  console.log(newArr);//[66,88] //返回值是一个新数组&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-3-3-some&quot;&gt;&lt;a name=&quot;3.3数组方法some&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.3数组方法some&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;some 查找数组中是否有满足条件的元素 
 var arr = [10, 30, 4];
 var flag = arr.some(function(value,index,array) {
    //参数一是:数组元素
     //参数二是:数组元素的索引
     //参数三是:当前的数组
     return value &amp;lt; 3;
  });
console.log(flag);//false返回值是布尔值,只要查找到满足条件的一个元素就立马终止循环&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-3-4-&quot;&gt;&lt;a name=&quot;3.4筛选商品案例&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.4筛选商品案例&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;p&gt;定义数组对象数据&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var data = [{
            id: 1,
            pname: &amp;#39;小米&amp;#39;,
            price: 3999
        }, {
            id: 2,
            pname: &amp;#39;oppo&amp;#39;,
            price: 999
        }, {
            id: 3,
            pname: &amp;#39;荣耀&amp;#39;,
            price: 1299
        }, {
            id: 4,
            pname: &amp;#39;华为&amp;#39;,
            price: 1999
        }, ];&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;使用forEach遍历数据并渲染到页面中&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;data.forEach(function(value) {
  var tr = document.createElement(&amp;#39;tr&amp;#39;);
  tr.innerHTML = &amp;#39;&amp;lt;td&amp;gt;&amp;#39; + value.id + &amp;#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;#39; + value.pname + &amp;#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;#39; + value.price + &amp;#39;&amp;lt;/td&amp;gt;&amp;#39;;
  tbody.appendChild(tr);
 });&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;根据价格筛选数据&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;获取到搜索按钮并为其绑定点击事件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;search_price.addEventListener(&amp;#39;click&amp;#39;, function() {
});&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;使用filter将用户输入的价格信息筛选出来&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;search_price.addEventListener(&amp;#39;click&amp;#39;, function() {
      var newDate = data.filter(function(value) {
        //start.value是开始区间
        //end.value是结束的区间
          return value.price &amp;gt;= start.value &amp;amp;&amp;amp; value.price &amp;lt;= end.value;
      });
      console.log(newDate);
 });&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;将筛选出来的数据重新渲染到表格中&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;将渲染数据的逻辑封装到一个函数中&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function setDate(mydata) {
      // 先清空原来tbody 里面的数据
  tbody.innerHTML = &amp;#39;&amp;#39;;
  mydata.forEach(function(value) {
    var tr = document.createElement(&amp;#39;tr&amp;#39;);
    tr.innerHTML = &amp;#39;&amp;lt;td&amp;gt;&amp;#39; + value.id + &amp;#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;#39; + value.pname + &amp;#39;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;#39; + value.price + &amp;#39;&amp;lt;/td&amp;gt;&amp;#39;;
      tbody.appendChild(tr);
  });
 }&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;将筛选之后的数据重新渲染&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; search_price.addEventListener(&amp;#39;click&amp;#39;, function() {
     var newDate = data.filter(function(value) {
     return value.price &amp;gt;= start.value &amp;amp;&amp;amp; value.price &amp;lt;= end.value;
     });
     console.log(newDate);
     // 把筛选完之后的对象渲染到页面中
     setDate(newDate);
});&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;根据商品名称筛选&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;获取用户输入的商品名称&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;为查询按钮绑定点击事件,将输入的商品名称与这个数据进行筛选&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; search_pro.addEventListener(&amp;#39;click&amp;#39;, function() {
     var arr = [];
     data.some(function(value) {
       if (value.pname === product.value) {
         // console.log(value);
         arr.push(value);
         return true; // return 后面必须写true  
       }
     });
     // 把拿到的数据渲染到页面中
     setDate(arr);
})&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-3-5some-foreach-&quot;&gt;&lt;a name=&quot;3.5some和forEach区别&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.5some和forEach区别&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;如果查询数组中唯一的元素, 用some方法更合适,在some 里面 遇到 return true 就是终止遍历 迭代效率更高&lt;/li&gt;&lt;li&gt;在forEach 里面 return 不会终止迭代&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-3-6trim-&quot;&gt;&lt;a name=&quot;3.6trim方法去除字符串两端的空格&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.6trim方法去除字符串两端的空格&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;var str = &amp;#39;   hello   &amp;#39;
console.log(str.trim()）  //hello 去除两端空格
var str1 = &amp;#39;   he l l o   &amp;#39;
console.log(str.trim()）  //he l l o  去除两端空格&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-3-7-&quot;&gt;&lt;a name=&quot;3.7获取对象的属性名&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.7获取对象的属性名&lt;/h3&gt;&lt;p&gt;Object.keys(对象) 获取到当前对象中的属性名 ，返回值是一个数组&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; var obj = {
     id: 1,
     pname: &amp;#39;小米&amp;#39;,
     price: 1999,
     num: 2000
};
var result = Object.keys(obj)
console.log(result)//[id，pname,price,num]&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-3-8object-defineproperty&quot;&gt;&lt;a name=&quot;3.8Object.defineProperty&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.8Object.defineProperty&lt;/h3&gt;&lt;p&gt;Object.defineProperty设置或修改对象中的属性&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;Object.defineProperty(对象，修改或新增的属性名，{
        value:修改或新增的属性的值,
        writable:true/false,//如果值为false 不允许修改这个属性值
        enumerable: false,//enumerable 如果值为false 则不允许遍历
        configurable: false  //configurable 如果为false 则不允许删除这个属性 属性是否可以被删除或是否可以再次修改特性
})    &lt;/code&gt;&lt;/pre&gt;
</description><pubDate>Tue, 28 Apr 2020 02:27:19 +0800</pubDate></item><item><title>JavaScript高级第01天笔记</title><link>https://www.liuhuadong.cc/post/44.html</link><description>&lt;h1 id=&quot;h1-javascript-01-&quot;&gt;&lt;a name=&quot;JavaScript高级第01天笔记&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;JavaScript高级第01天笔记&lt;/h1&gt;&lt;h2 id=&quot;h2-1-&quot;&gt;&lt;a name=&quot;1.面向过程与面向对象&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.面向过程与面向对象&lt;/h2&gt;&lt;h3 id=&quot;h3-1-1-&quot;&gt;&lt;a name=&quot;1.1面向过程&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1面向过程&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;面向过程就是分析出解决问题所需要的步骤，然后用函数把这些步骤一步一步实现，使用的时候再一个一个的依次调用就可以了。&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-1-2-&quot;&gt;&lt;a name=&quot;1.2面向对象&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2面向对象&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;面向对象是把事务分解成为一个个对象，然后由对象之间分工与合作。&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-1-3-&quot;&gt;&lt;a name=&quot;1.3面向过程与面向对象对比&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3面向过程与面向对象对比&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;面向过程&lt;/th&gt;
&lt;th&gt;面向对象&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;优点&lt;/td&gt;
&lt;td&gt;性能比面向对象高，适合跟硬件联系很紧密的东西，例如单片机就采用的面向过程编程。&lt;/td&gt;
&lt;td&gt;易维护、易复用、易扩展，由于面向对象有封装、继承、多态性的特性，可以设计出低耦合的系统，使系统 更加灵活、更加易于维护&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;缺点&lt;/td&gt;
&lt;td&gt;不易维护、不易复用、不易扩展&lt;/td&gt;
&lt;td&gt;性能比面向过程低&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;h2-2-&quot;&gt;&lt;a name=&quot;2.对象与类&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.对象与类&lt;/h2&gt;&lt;h3 id=&quot;h3-2-1-&quot;&gt;&lt;a name=&quot;2.1对象&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.1对象&lt;/h3&gt;&lt;p&gt;对象是由属性和方法组成的：是一个无序键值对的集合,指的是一个具体的事物&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;属性：事物的特征，在对象中用属性来表示（常用名词）&lt;/li&gt;&lt;li&gt;方法：事物的行为，在对象中用方法来表示（常用动词）&lt;/li&gt;&lt;/ul&gt;
&lt;h4 id=&quot;h4-2-1-1-&quot;&gt;&lt;a name=&quot;2.1.1创建对象&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.1.1创建对象&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;//以下代码是对对象的复习
//字面量创建对象
var ldh = {
    name: &amp;#39;刘德华&amp;#39;,
    age: 18
}
console.log(ldh);

//构造函数创建对象
  function Star(name, age) {
    this.name = name;
    this.age = age;
 }
var ldh = new Star(&amp;#39;刘德华&amp;#39;, 18)//实例化对象
console.log(ldh);    &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如上两行代码运行结果为:&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images1/img3.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-2-2-&quot;&gt;&lt;a name=&quot;2.2类&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2类&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;在 ES6 中新增加了类的概念，可以使用 class 关键字声明一个类，之后以这个类来实例化对象。类抽象了对象的公共部分，它泛指某一大类（class）对象特指某一个，通过类实例化一个具体的对象&lt;/li&gt;&lt;/ul&gt;
&lt;h4 id=&quot;h4-2-2-1-&quot;&gt;&lt;a name=&quot;2.2.1创建类&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2.1创建类&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;语法:&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;//步骤1 使用class关键字
class name {
  // class body
}     
//步骤2使用定义的类创建实例  注意new关键字
var xx = new name();     &lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;示例&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; // 1. 创建类 class  创建一个 明星类
 class Star {
   // 类的共有属性放到 constructor 里面
   constructor(name, age) {
   this.name = name;
   this.age = age;
   }
 }
   // 2. 利用类创建对象 new
   var ldh = new Star(&amp;#39;刘德华&amp;#39;, 18);
   console.log(ldh);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上代码运行结果: &lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images1/img4.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;通过结果我们可以看出,运行结果和使用构造函数方式一样&lt;/p&gt;
&lt;h4 id=&quot;h4-2-2-2-&quot;&gt;&lt;a name=&quot;2.2.2类创建添加属性和方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2.2类创建添加属性和方法&lt;/h4&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; // 1. 创建类 class  创建一个类
class Star {
    // 类的共有属性放到 constructor 里面 constructor是 构造器或者构造函数
    constructor(uname, age) {
      this.uname = uname;
      this.age = age;
    }//-------------------------------------------&amp;gt;注意,方法与方法之间不需要添加逗号
    sing(song) {
      console.log(this.uname + &amp;#39;唱&amp;#39; + song);
    }
}
// 2. 利用类创建对象 new
var ldh = new Star(&amp;#39;刘德华&amp;#39;, 18);
console.log(ldh); // Star {uname: &amp;quot;刘德华&amp;quot;, age: 18}
ldh.sing(&amp;#39;冰雨&amp;#39;); // 刘德华唱冰雨&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt; 以上代码运行结果:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images1/img5.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意哟:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过class 关键字创建类, 类名我们还是习惯性定义首字母大写&lt;/li&gt;&lt;li&gt;类里面有个constructor 函数,可以接受传递过来的参数,同时返回实例对象&lt;/li&gt;&lt;li&gt;constructor 函数 只要 new 生成实例时,就会自动调用这个函数, 如果我们不写这个函数,类也会自动生成这个函数&lt;/li&gt;&lt;li&gt;多个函数方法之间不需要添加逗号分隔&lt;/li&gt;&lt;li&gt;生成实例 new 不能省略&lt;/li&gt;&lt;li&gt;语法规范, 创建类 类名后面不要加小括号,生成实例 类名后面加小括号, 构造函数不需要加function&lt;/li&gt;&lt;/ol&gt;
&lt;h4 id=&quot;h4-2-2-3-&quot;&gt;&lt;a name=&quot;2.2.3类的继承&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;2.2.3类的继承&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;语法&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;// 父类
class Father{   
} 

// 子类继承父类
class  Son  extends Father {  
}       &lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;示例&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;class Father {
      constructor(surname) {
        this.surname= surname;
      }
      say() {
        console.log(&amp;#39;你的姓是&amp;#39; + this.surname);
       }
}

class Son extends Father{  // 这样子类就继承了父类的属性和方法
}
var damao= new Son(&amp;#39;刘&amp;#39;);
damao.say();      //结果为 你的姓是刘&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上代码运行结果:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images1/img6.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;子类使用super关键字访问父类的方法&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;//定义了父类
class Father {
   constructor(x, y) {
   this.x = x;
   this.y = y;
   }
   sum() {
   console.log(this.x + this.y);
    }
 }
//子元素继承父类
    class Son extends Father {
            constructor(x, y) {
            super(x, y); //使用super调用了父类中的构造函数
        }
    }
    var son = new Son(1, 2);
    son.sum(); //结果为3&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意:&lt;/strong&gt; &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;继承中,如果实例化子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;继承中,如果子类里面没有,就去查找父类有没有这个方法,如果有,就执行父类的这个方法(就近原则)&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;如果子类想要继承父类的方法,同时在自己内部扩展自己的方法,利用super 调用父类的构造函数,super 必须在子类this之前调用&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; // 父类有加法方法
 class Father {
   constructor(x, y) {
   this.x = x;
   this.y = y;
   }
   sum() {
   console.log(this.x + this.y);
   }
 }
 // 子类继承父类加法方法 同时 扩展减法方法
 class Son extends Father {
   constructor(x, y) {
   // 利用super 调用父类的构造函数 super 必须在子类this之前调用,放到this之后会报错
   super(x, y);
   this.x = x;
   this.y = y;

  }
  subtract() {
  console.log(this.x - this.y);
  }
}
var son = new Son(5, 3);
son.subtract(); //2
son.sum();//8&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上代码运行结果为:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images1/img7.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;时刻注意this的指向问题,类里面的共有的属性和方法一定要加this使用.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;constructor中的this指向的是new出来的实例对象 &lt;/li&gt;&lt;li&gt;自定义的方法,一般也指向的new出来的实例对象&lt;/li&gt;&lt;li&gt;绑定事件之后this指向的就是触发事件的事件源&lt;/li&gt;&lt;/ol&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;在 ES6 中类没有变量提升，所以必须先定义类，才能通过类实例化对象&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images1/img2.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt; &lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/04JS高级/images1/img1.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h2 id=&quot;h2-3-tab-&quot;&gt;&lt;a name=&quot;3.面向对象版tab 栏切换&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.面向对象版tab 栏切换&lt;/h2&gt;&lt;h3 id=&quot;h3-3-1-&quot;&gt;&lt;a name=&quot;3.1功能需求&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.1功能需求&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;点击 tab栏,可以切换效果.&lt;/li&gt;&lt;li&gt;点击 + 号, 可以添加 tab 项和内容项.&lt;/li&gt;&lt;li&gt;点击 x 号, 可以删除当前的tab项和内容项.&lt;/li&gt;&lt;li&gt;双击tab项文字或者内容项文字可以修改里面的文字内容&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-3-2-&quot;&gt;&lt;a name=&quot;3.2案例准备&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.2案例准备&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;获取到标题元素&lt;/li&gt;&lt;li&gt;获取到内容元素&lt;/li&gt;&lt;li&gt;获取到删除的小按钮 x号&lt;/li&gt;&lt;li&gt;新建js文件,定义类,添加需要的属性方法(切换,删除,增加,修改)&lt;/li&gt;&lt;li&gt;时刻注意this的指向问题&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-3-3-&quot;&gt;&lt;a name=&quot;3.3切换&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.3切换&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;为获取到的标题绑定点击事件,展示对应的内容区域,存储对应的索引&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; this.lis[i].index = i;
 this.lis[i].onclick = this.toggleTab;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;使用排他,实现只有一个元素的显示&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; toggleTab() {
   //将所有的标题与内容类样式全部移除
     for (var i = 0; i &amp;lt; this.lis.length; i++) {
     this.lis[i].className = &amp;#39;&amp;#39;;
     this.sections[i].className = &amp;#39;&amp;#39;;
     }
   //为当前的标题添加激活样式
     this.className = &amp;#39;liactive&amp;#39;;
    //为当前的内容添加激活样式
     that.sections[this.index].className = &amp;#39;conactive&amp;#39;;
  }&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-3-4-&quot;&gt;&lt;a name=&quot;3.4添加&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.4添加&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;为添加按钮+ 绑定点击事件 &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; this.add.onclick = this.addTab;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;实现标题与内容的添加,做好排他处理&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;addTab() {
    that.clearClass();
    // (1) 创建li元素和section元素 
    var random = Math.random();
    var li = &amp;#39;&amp;lt;li class=&amp;quot;liactive&amp;quot;&amp;gt;&amp;lt;span&amp;gt;新选项卡&amp;lt;/span&amp;gt;&amp;lt;span class=&amp;quot;iconfont icon-guanbi&amp;quot;&amp;gt;                &amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;&amp;#39;;
    var section = &amp;#39;&amp;lt;section class=&amp;quot;conactive&amp;quot;&amp;gt;测试 &amp;#39; + random + &amp;#39;&amp;lt;/section&amp;gt;&amp;#39;;
    // (2) 把这两个元素追加到对应的父元素里面
    that.ul.insertAdjacentHTML(&amp;#39;beforeend&amp;#39;, li);
    that.fsection.insertAdjacentHTML(&amp;#39;beforeend&amp;#39;, section);
    that.init();
    }&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-3-5-&quot;&gt;&lt;a name=&quot;3.5删除&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.5删除&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;为元素的删除按钮x绑定点击事件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; this.remove[i].onclick = this.removeTab;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;获取到点击的删除按钮的所在的父元素的所有,删除对应的标题与内容&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; removeTab(e) {
     e.stopPropagation(); // 阻止冒泡 防止触发li 的切换点击事件
     var index = this.parentNode.index;
     console.log(index);
     // 根据索引号删除对应的li 和section   remove()方法可以直接删除指定的元素
     that.lis[index].remove();
     that.sections[index].remove();
     that.init();
     // 当我们删除的不是选中状态的li 的时候,原来的选中状态li保持不变
     if (document.querySelector(&amp;#39;.liactive&amp;#39;)) return;
     // 当我们删除了选中状态的这个li 的时候, 让它的前一个li 处于选定状态
     index--;
     // 手动调用我们的点击事件  不需要鼠标触发
     that.lis[index] &amp;amp;&amp;amp; that.lis[index].click();
 }&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-3-6-&quot;&gt;&lt;a name=&quot;3.6编辑&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;3.6编辑&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;为元素(标题与内容)绑定双击事件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt; this.spans[i].ondblclick = this.editTab;
 this.sections[i].ondblclick = this.editTab;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;在双击事件处理文本选中状态,修改内部DOM节点,实现新旧value值的传递&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;editTab() {
    var str = this.innerHTML;
    // 双击禁止选定文字
    window.getSelection ? window.getSelection().removeAllRanges() :                     document.selection.empty();
    // alert(11);
      this.innerHTML = &amp;#39;&amp;lt;input type=&amp;quot;text&amp;quot; /&amp;gt;&amp;#39;;
      var input = this.children[0];
      input.value = str;
      input.select(); // 文本框里面的文字处于选定状态
      // 当我们离开文本框就把文本框里面的值给span 
      input.onblur = function() {
      this.parentNode.innerHTML = this.value;
      };
      // 按下回车也可以把文本框里面的值给span
      input.onkeyup = function(e) {
      if (e.keyCode === 13) {
      // 手动调用表单失去焦点事件  不需要鼠标离开操作
      this.blur();
      }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;&lt;/ul&gt;
</description><pubDate>Tue, 28 Apr 2020 02:18:50 +0800</pubDate></item><item><title>day03 - jQuery</title><link>https://www.liuhuadong.cc/post/43.html</link><description>&lt;h1 id=&quot;h1-day03-jquery&quot;&gt;&lt;a name=&quot;day03 - jQuery&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;day03 - jQuery&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;学习目标：&lt;/p&gt;
&lt;p&gt;能够说出4种常见的注册事件&lt;br&gt;能够说出 on 绑定事件的优势&lt;br&gt;能够说出 jQuery 事件委派的优点以及方式&lt;br&gt;能够说出绑定事件与解绑事件&lt;br&gt;能够说出 jQuery 对象的拷贝方法&lt;br&gt;能够说出 jQuery 多库共存的2种方法&lt;br&gt;能够使用 jQuery 插件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;h2-1-1-jquery-&quot;&gt;&lt;a name=&quot;1.1. jQuery 事件注册&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1. jQuery 事件注册&lt;/h2&gt;&lt;p&gt;​    jQuery 为我们提供了方便的事件注册机制，是开发人员抑郁操作优缺点如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;优点: 操作简单，且不用担心事件覆盖等问题。&lt;/li&gt;&lt;li&gt;缺点: 普通的事件注册不能做事件委托，且无法实现事件解绑，需要借助其他方法。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/register.png&quot; alt=&quot;register&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演示代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            // 1. 单个事件注册
            $(&amp;quot;div&amp;quot;).click(function() {
                $(this).css(&amp;quot;background&amp;quot;, &amp;quot;purple&amp;quot;);
            });
            $(&amp;quot;div&amp;quot;).mouseenter(function() {
                $(this).css(&amp;quot;background&amp;quot;, &amp;quot;skyblue&amp;quot;);
            });
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-1-2-jquery-&quot;&gt;&lt;a name=&quot;1.2. jQuery 事件处理&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2. jQuery 事件处理&lt;/h2&gt;&lt;p&gt;​    因为普通注册事件方法的不足，jQuery又开发了多个处理方法，重点讲解如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on(): 用于事件绑定，目前最好用的事件绑定方法&lt;/li&gt;&lt;li&gt;off(): 事件解绑&lt;/li&gt;&lt;li&gt;trigger() / triggerHandler(): 事件触发&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-1-2-1-on-&quot;&gt;&lt;a name=&quot;1.2.1 事件处理 on() 绑定事件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.1 事件处理 on() 绑定事件&lt;/h3&gt;&lt;p&gt;​    因为普通注册事件方法的不足，jQuery又创建了多个新的事件绑定方法bind() / live() / delegate() / on()等，其中最好用的是: on()&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/on1.png&quot; alt=&quot;on1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/on2.png&quot; alt=&quot;on2&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/on3.png&quot; alt=&quot;on3&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演示代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;我们都是好孩子&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;我们都是好孩子&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;我们都是好孩子&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;ol&amp;gt;&amp;lt;/ol&amp;gt;

    &amp;lt;script&amp;gt;
        $(function() {
            // (1) on可以绑定1个或者多个事件处理程序
            // $(&amp;quot;div&amp;quot;).on({
            //     mouseenter: function() {
            //         $(this).css(&amp;quot;background&amp;quot;, &amp;quot;skyblue&amp;quot;);
            //     },
            //     click: function() {
            //         $(this).css(&amp;quot;background&amp;quot;, &amp;quot;purple&amp;quot;);
            //     }
            // });
            $(&amp;quot;div&amp;quot;).on(&amp;quot;mouseenter mouseleave&amp;quot;, function() {
                $(this).toggleClass(&amp;quot;current&amp;quot;);
            });

            // (2) on可以实现事件委托（委派）
            // click 是绑定在ul 身上的，但是 触发的对象是 ul 里面的小li
            // $(&amp;quot;ul li&amp;quot;).click();
            $(&amp;quot;ul&amp;quot;).on(&amp;quot;click&amp;quot;, &amp;quot;li&amp;quot;, function() {
                alert(11);
            });

            // (3) on可以给未来动态创建的元素绑定事件
            $(&amp;quot;ol&amp;quot;).on(&amp;quot;click&amp;quot;, &amp;quot;li&amp;quot;, function() {
                alert(11);
            })
            var li = $(&amp;quot;&amp;lt;li&amp;gt;我是后来创建的&amp;lt;/li&amp;gt;&amp;quot;);
            $(&amp;quot;ol&amp;quot;).append(li);
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-2-2-&quot;&gt;&lt;a name=&quot;1.2.2. 案例：发布微博案例&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.2. 案例：发布微博案例&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;1.点击发布按钮， 动态创建一个小li，放入文本框的内容和删除按钮， 并且添加到ul 中。&lt;br&gt;2.点击的删除按钮，可以删除当前的微博留言。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h3 id=&quot;h3-1-2-3-off-&quot;&gt;&lt;a name=&quot;1.2.3. 事件处理 off() 解绑事件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.3. 事件处理 off() 解绑事件&lt;/h3&gt;&lt;p&gt;​    当某个事件上面的逻辑，在特定需求下不需要的时候，可以把该事件上的逻辑移除，这个过程我们称为事件解绑。jQuery 为我们提供 了多种事件解绑方法：die() / undelegate() / off() 等，甚至还有只触发一次的事件绑定方法 one()，在这里我们重点讲解一下 off() ;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/off.png&quot; alt=&quot;off&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演示代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;我们都是好孩子&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;我们都是好孩子&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;我们都是好孩子&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;p&amp;gt;我是一个P标签&amp;lt;/p&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
              // 事件绑定
            $(&amp;quot;div&amp;quot;).on({
                click: function() {
                    console.log(&amp;quot;我点击了&amp;quot;);
                },
                mouseover: function() {
                    console.log(&amp;#39;我鼠标经过了&amp;#39;);
                }
            });
            $(&amp;quot;ul&amp;quot;).on(&amp;quot;click&amp;quot;, &amp;quot;li&amp;quot;, function() {
                alert(11);
            });

            // 1. 事件解绑 off 
            // $(&amp;quot;div&amp;quot;).off();  // 这个是解除了div身上的所有事件
            $(&amp;quot;div&amp;quot;).off(&amp;quot;click&amp;quot;); // 这个是解除了div身上的点击事件
            $(&amp;quot;ul&amp;quot;).off(&amp;quot;click&amp;quot;, &amp;quot;li&amp;quot;);

            // 2. one() 但是它只能触发事件一次
            $(&amp;quot;p&amp;quot;).one(&amp;quot;click&amp;quot;, function() {
                alert(11);
            })
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-2-4-trigger-&quot;&gt;&lt;a name=&quot;1.2.4. 事件处理 trigger() 自动触发事件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.4. 事件处理 trigger() 自动触发事件&lt;/h3&gt;&lt;p&gt;​    有些时候，在某些特定的条件下，我们希望某些事件能够自动触发, 比如轮播图自动播放功能跟点击右侧按钮一致。可以利用定时器自动触发右侧按钮点击事件，不必鼠标点击触发。由此 jQuery 为我们提供了两个自动触发事件 trigger() 和 triggerHandler() ; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/t1.png&quot; alt=&quot;t1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/t2.png&quot; alt=&quot;t2&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演示代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;input type=&amp;quot;text&amp;quot;&amp;gt;

    &amp;lt;script&amp;gt;
    $(function() {
      // 绑定事件
      $(&amp;quot;div&amp;quot;).on(&amp;quot;click&amp;quot;, function() {
        alert(11);
      });

      // 自动触发事件
      // 1. 元素.事件()
      // $(&amp;quot;div&amp;quot;).click();会触发元素的默认行为

      // 2. 元素.trigger(&amp;quot;事件&amp;quot;)
      // $(&amp;quot;div&amp;quot;).trigger(&amp;quot;click&amp;quot;);会触发元素的默认行为
      $(&amp;quot;input&amp;quot;).trigger(&amp;quot;focus&amp;quot;);

      // 3. 元素.triggerHandler(&amp;quot;事件&amp;quot;) 就是不会触发元素的默认行为
      $(&amp;quot;input&amp;quot;).on(&amp;quot;focus&amp;quot;, function() {
        $(this).val(&amp;quot;你好吗&amp;quot;);
      });
      // 一个会获取焦点，一个不会
      $(&amp;quot;div&amp;quot;).triggerHandler(&amp;quot;click&amp;quot;);
      // $(&amp;quot;input&amp;quot;).triggerHandler(&amp;quot;focus&amp;quot;);
    });
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-1-3-jquery-&quot;&gt;&lt;a name=&quot;1.3. jQuery 事件对象&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3. jQuery 事件对象&lt;/h2&gt;&lt;p&gt;​    jQuery 对DOM中的事件对象 event 进行了封装，兼容性更好，获取更方便，使用变化不大。事件被触发，就会有事件对象的产生。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/event.png&quot; alt=&quot;event&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演示代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;script&amp;gt;
        $(function() {
            $(document).on(&amp;quot;click&amp;quot;, function() {
                console.log(&amp;quot;点击了document&amp;quot;);
            })
            $(&amp;quot;div&amp;quot;).on(&amp;quot;click&amp;quot;, function(event) {
                // console.log(event);
                console.log(&amp;quot;点击了div&amp;quot;);
                event.stopPropagation();
            })
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：jQuery中的 event 对象使用，可以借鉴 API 和 DOM 中的 event 。&lt;/p&gt;
&lt;h2 id=&quot;h2-1-4-jquery-&quot;&gt;&lt;a name=&quot;1.4.  jQuery 拷贝对象&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.  jQuery 拷贝对象&lt;/h2&gt;&lt;p&gt;​    jQuery中分别为我们提供了两套快速获取和设置元素尺寸和位置的API，方便易用，内容如下。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/extend.png&quot; alt=&quot;extend&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演示代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; &amp;lt;script&amp;gt;
        $(function() {
               // 1.合并数据
            var targetObj = {};
            var obj = {
                id: 1,
                name: &amp;quot;andy&amp;quot;
            };
            // $.extend(target, obj);
            $.extend(targetObj, obj);
            console.log(targetObj);

               // 2. 会覆盖 targetObj 里面原来的数据
            var targetObj = {
                id: 0
            };
            var obj = {
                id: 1,
                name: &amp;quot;andy&amp;quot;
            };
            // $.extend(target, obj);
            $.extend(targetObj, obj);
            console.log(targetObj); 
        })
    &amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-1-5-jquery-&quot;&gt;&lt;a name=&quot;1.5.  jQuery 多库共存&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.5.  jQuery 多库共存&lt;/h2&gt;&lt;p&gt;​    实际开发中，很多项目连续开发十多年，jQuery版本不断更新，最初的 jQuery 版本无法满足需求，这时就需要保证在旧有版本正常运行的情况下，新的功能使用新的jQuery版本实现，这种情况被称为，jQuery 多库共存。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/noconfig.png&quot; alt=&quot;noconfig&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演示代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;script&amp;gt;
    $(function() {
          // 让jquery 释放对$ 控制权 让用自己决定
          var suibian = jQuery.noConflict();
          console.log(suibian(&amp;quot;span&amp;quot;));
    })
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-1-6-jquery-&quot;&gt;&lt;a name=&quot;1.6.  jQuery 插件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.6.  jQuery 插件&lt;/h2&gt;&lt;p&gt;​    jQuery 功能比较有限，想要更复杂的特效效果，可以借助于 jQuery 插件完成。 这些插件也是依赖于jQuery来完成的，所以必须要先引入&lt;/p&gt;
&lt;p&gt;jQuery文件，因此也称为 jQuery 插件。&lt;/p&gt;
&lt;p&gt;​    jQuery 插件常用的网站：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;jQuery 插件库  &lt;a href=&quot;http://www.jq22.com/&quot;&gt;http://www.jq22.com/&lt;/a&gt;     &lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;jQuery 之家   &lt;a href=&quot;http://www.htmleaf.com/&quot;&gt;http://www.htmleaf.com/&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;jQuery 插件使用步骤：&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;引入相关文件。（jQuery 文件 和 插件文件）    &lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;复制相关html、css、js (调用插件)。&lt;/p&gt;
&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-1-4-1-&quot;&gt;&lt;a name=&quot;1.4.1.  瀑布流插件（重点讲解）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.1.  瀑布流插件（重点讲解）&lt;/h3&gt;&lt;p&gt;​    我们学习的第一个插件是jQuery之家的开源插件，瀑布流。我们将重点详细讲解，从找到插件所在网页，然后点击下载代码，到插件的使用等，后面的插件使用可参考瀑布流插件的使用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下载位置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/water.png&quot; alt=&quot;water&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/download.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码演示&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;​    插件的使用三点：   1. 引入css.           2.引入JS            3.引入html。 （有的简单插件只需引入html和js，甚至有的只需引入js）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.引入css.&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;css/normalize.css&amp;quot;&amp;gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; href=&amp;quot;css/default.css&amp;quot;&amp;gt;

&amp;lt;!-- 下面的样式代码为页面布局，可以引入，也可以自己写，自己设计页面样式，一般为直接引入，方便 --&amp;gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
  #gallery-wrapper {
    position: relative;
    max-width: 75%;
    width: 75%;
    margin: 50px auto;
  }

  img.thumb {
    width: 100%;
    max-width: 100%;
    height: auto;
  }

  .white-panel {
    position: absolute;
    background: white;
    border-radius: 5px;
    box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3);
    padding: 10px;
  }

  .white-panel h1 {
    font-size: 1em;
  }

  .white-panel h1 a {
    color: #A92733;
  }

  .white-panel:hover {
    box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.5);
    margin-top: -5px;
    -webkit-transition: all 0.3s ease-in-out;
    -moz-transition: all 0.3s ease-in-out;
    -o-transition: all 0.3s ease-in-out;
    transition: all 0.3s ease-in-out;
  }
&amp;lt;/style&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;2.引入js.&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;!-- 前两个必须引入 --&amp;gt;
&amp;lt;script src=&amp;quot;js/jquery-1.11.0.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;js/pinterest_grid.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;!-- 下面的为启动瀑布流代码，参数可调节属性，具体功能可参考readme.html --&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
    $(function() {
      $(&amp;quot;#gallery-wrapper&amp;quot;).pinterest_grid({
          no_columns: 5,
          padding_x: 15,
          padding_y: 10,
          margin_bottom: 50,
          single_column_breakpoint: 700
      });
    });
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;3.引入html.&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;    &amp;lt;!-- html结构一般为事先写好，很难修改结构，但可以修改内容及图片的多少（article标签） --&amp;gt;
    &amp;lt;section id=&amp;quot;gallery-wrapper&amp;quot;&amp;gt;
        &amp;lt;article class=&amp;quot;white-panel&amp;quot;&amp;gt;
            &amp;lt;img src=&amp;quot;images/P_000.jpg&amp;quot; class=&amp;quot;thumb&amp;quot;&amp;gt;
            &amp;lt;h1&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;我是轮播图片1&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;
            &amp;lt;p&amp;gt;里面很精彩哦&amp;lt;/p&amp;gt;
        &amp;lt;/article&amp;gt;
        &amp;lt;article class=&amp;quot;white-panel&amp;quot;&amp;gt;
            &amp;lt;img src=&amp;quot;images/P_005.jpg&amp;quot; class=&amp;quot;thumb&amp;quot;&amp;gt;
            &amp;lt;h1&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;我是轮播图片1&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;
            &amp;lt;p&amp;gt;里面很精彩哦&amp;lt;/p&amp;gt;
        &amp;lt;/article&amp;gt;
        &amp;lt;article class=&amp;quot;white-panel&amp;quot;&amp;gt;
            &amp;lt;img src=&amp;quot;images/P_006.jpg&amp;quot; class=&amp;quot;thumb&amp;quot;&amp;gt;
            &amp;lt;h1&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;我是轮播图片1&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;
            &amp;lt;p&amp;gt;里面很精彩哦&amp;lt;/p&amp;gt;
        &amp;lt;/article&amp;gt;
        &amp;lt;article class=&amp;quot;white-panel&amp;quot;&amp;gt;
            &amp;lt;img src=&amp;quot;images/P_007.jpg&amp;quot; class=&amp;quot;thumb&amp;quot;&amp;gt;
            &amp;lt;h1&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;我是轮播图片1&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;
            &amp;lt;p&amp;gt;里面很精彩哦&amp;lt;/p&amp;gt;
        &amp;lt;/article&amp;gt;
    &amp;lt;/section&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;总结：jQuery插件就是引入别人写好的：html 、css、js  （有时也可以只引入一部分，读懂后也可以修改部分内容）&lt;/p&gt;
&lt;h3 id=&quot;h3-1-4-2-&quot;&gt;&lt;a name=&quot;1.4.2. 图片懒加载插件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.2. 图片懒加载插件&lt;/h3&gt;&lt;p&gt;​    图片的懒加载就是：当页面滑动到有图片的位置，图片才进行加载，用以提升页面打开的速度及用户体验。（下载略）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码演示&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;​    懒加载只需引入html 和 js操作 即可，此插件不涉及css。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.引入js&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;script src=&amp;quot;js/EasyLazyload.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
       lazyLoadInit({
           showTime: 1100,
           onLoadBackEnd: function(i, e) {
             console.log(&amp;quot;onLoadBackEnd:&amp;quot; + i);
           },
           onLoadBackStart: function(i, e) {
             console.log(&amp;quot;onLoadBackStart:&amp;quot; + i);
           }
     });
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;2.引入html&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt; &amp;lt;img data-lazy-src=&amp;quot;upload/floor-1-3.png&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-4-3-&quot;&gt;&lt;a name=&quot;1.4.3. 全屏滚动插件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.3. 全屏滚动插件&lt;/h3&gt;&lt;p&gt;​    全屏滚动插件比较大，所以，一般大型插件都会有帮助文档，或者网站。全屏滚动插件介绍比较详细的网站为：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.dowebok.com/demo/2014/77/&quot;&gt;http://www.dowebok.com/demo/2014/77/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码演示&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;​    全屏滚动因为有多重形式，所以不一样的风格html和css也不一样，但是 js 变化不大。所以下面只演示js的引入，html和css引入根据自己实际&lt;/p&gt;
&lt;p&gt;项目需要使用哪种风格引入对应的HTML和CSS。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;script src=&amp;quot;js/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;js/fullpage.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
      $(function() {
          $(&amp;#39;#dowebok&amp;#39;).fullpage({
            sectionsColor: [&amp;#39;pink&amp;#39;, &amp;#39;#4BBFC3&amp;#39;, &amp;#39;#7BAABE&amp;#39;, &amp;#39;#f90&amp;#39;],
            navigation: true
          });
    });
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：实际开发，一般复制文件，然后在文件中进行修改和添加功能。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-4-4-bootstrap-&quot;&gt;&lt;a name=&quot;1.4.4. bootstrap组件&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.4. bootstrap组件&lt;/h3&gt;&lt;p&gt;​    Bootstrap是 Twitter 公司设计的基于HTML、CSS、JavaScript开发的简洁、直观、强悍的前端开发框架，他依靠jQuery实现，且支持响应式&lt;/p&gt;
&lt;p&gt;布局，使得 Web 开发更加方便快捷。&lt;/p&gt;
&lt;p&gt;​    &lt;strong&gt;凡是在软件开发中用到了软件的复用，被复用的部分都可以称为组件，凡是在应用程序中已经预留接口的组件就是插件&lt;/strong&gt;。Bootstrap组件使&lt;/p&gt;
&lt;p&gt;用非常方便:  1.引入bootstrap相关css和js        2.去官网复制html&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码演示&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;引入bootstrap相关css和js&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;bootstrap/css/bootstrap.min.css&amp;quot;&amp;gt;
&amp;lt;script src=&amp;quot;bootstrap/js/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;bootstrap/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;去官网复制html的功能模块&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
        &amp;lt;!-- Single button --&amp;gt;
        &amp;lt;div class=&amp;quot;btn-group&amp;quot;&amp;gt;
            &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;btn btn-default dropdown-toggle&amp;quot; data-toggle=&amp;quot;dropdown&amp;quot; aria-haspopup=&amp;quot;true&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;
              Action &amp;lt;span class=&amp;quot;caret&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;
            &amp;lt;/button&amp;gt;
            &amp;lt;ul class=&amp;quot;dropdown-menu&amp;quot;&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Action&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Another action&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Something else here&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li role=&amp;quot;separator&amp;quot; class=&amp;quot;divider&amp;quot;&amp;gt;&amp;lt;/li&amp;gt;
                &amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;Separated link&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
            &amp;lt;/ul&amp;gt;
         &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-4-5-bootstrap-js-&quot;&gt;&lt;a name=&quot;1.4.5. bootstrap插件（JS）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.5. bootstrap插件（JS）&lt;/h3&gt;&lt;p&gt;​    bootstrap中的js插件其实也是组件的一部分，只不过是需要js调用功能的组件，所以一般bootstrap的js插件一般会伴随着js代码（有的也可以&lt;/p&gt;
&lt;p&gt;省略js，用属性实现）。&lt;/p&gt;
&lt;p&gt;​    步骤： 1.引入bootstrap相关css和js        2.去官网复制html        3.复制js代码，启动js插件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码演示&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;引入bootstrap相关css和js&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;bootstrap/css/bootstrap.min.css&amp;quot;&amp;gt;
&amp;lt;script src=&amp;quot;bootstrap/js/jquery.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;bootstrap/js/bootstrap.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;去官网复制html的功能模块&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;!-- 模态框 --&amp;gt;
&amp;lt;!-- Large modal --&amp;gt;
&amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;btn btn-primary&amp;quot; data-toggle=&amp;quot;modal&amp;quot; data-target=&amp;quot;.bs-example-modal-lg&amp;quot;&amp;gt;Large modal&amp;lt;/button&amp;gt;
&amp;lt;div class=&amp;quot;modal fade bs-example-modal-lg&amp;quot; tabindex=&amp;quot;-1&amp;quot; role=&amp;quot;dialog&amp;quot; aria-labelledby=&amp;quot;myLargeModalLabel&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;modal-dialog modal-lg&amp;quot; role=&amp;quot;document&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;modal-content&amp;quot;&amp;gt;
            里面就是模态框
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;复制js代码，启动js插件。&lt;/li&gt;&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;script&amp;gt;
    // 当我们点击了自己定义的按钮，就弹出模态框
    $(&amp;quot;.myBtn&amp;quot;).on(&amp;quot;click&amp;quot;, function() {
        // alert(11);
        $(&amp;#39;#btn&amp;#39;).modal()
    })
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-4-6-bootstrap-&quot;&gt;&lt;a name=&quot;1.4.6. bootstrap案例-阿里百秀&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.6. bootstrap案例-阿里百秀&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;1.通过调用组件实现导航栏&lt;br&gt;2.通过调用插件实现登录&lt;br&gt;3.通过调用插件标签页实现 tab 栏&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h2 id=&quot;h2-1-7-todolist-&quot;&gt;&lt;a name=&quot;1.7. 综合案例: toDoList案例分析（代码略）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.7. 综合案例: toDoList案例分析（代码略）&lt;/h2&gt;&lt;h3 id=&quot;h3-1-7-1-&quot;&gt;&lt;a name=&quot;1.7.1 案例：案例介绍&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.7.1 案例：案例介绍&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1. 文本框里面输入内容，按下回车，就可以生成待办事项。
// 2. 点击待办事项复选框，就可以把当前数据添加到已完成事项里面。
// 3. 点击已完成事项复选框，就可以把当前数据添加到待办事项里面。
// 4. 但是本页面内容刷新页面不会丢失。&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-7-2-todolist-&quot;&gt;&lt;a name=&quot;1.7.2 案例：toDoList 分析&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.7.2 案例：toDoList 分析&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1. 刷新页面不会丢失数据，因此需要用到本地存储 localStorage
// 2. 核心思路： 不管按下回车，还是点击复选框，都是把本地存储的数据加载到页面中，这样保证刷新关闭页面不会丢失数据
// 3. 存储的数据格式：var todolist =  [{ title : ‘xxx’, done: false}]
// 4. 注意点1： 本地存储 localStorage 里面只能存储字符串格式 ，因此需要把对象转换为字符串 JSON.stringify(data)。
// 5. 注意点2： 获取本地存储数据，需要把里面的字符串转换为对象格式JSON.parse() 我们才能使用里面的数据。&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-7-3-todolist-&quot;&gt;&lt;a name=&quot;1.7.3 案例：toDoList 按下回车把新数据添加到本地存储里面&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.7.3 案例：toDoList 按下回车把新数据添加到本地存储里面&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1.切记： 页面中的数据，都要从本地存储里面获取，这样刷新页面不会丢失数据，所以先要把数据保存到本地存储里面。
// 2.利用事件对象.keyCode判断用户按下回车键（13）。
// 3.声明一个数组，保存数据。
// 4.先要读取本地存储原来的数据（声明函数 getData()），放到这个数组里面。
// 5.之后把最新从表单获取过来的数据，追加到数组里面。
// 6.最后把数组存储给本地存储 (声明函数 savaDate())&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-7-4-todolist-&quot;&gt;&lt;a name=&quot;1.7.4 案例：toDoList 本地存储数据渲染加载到页面&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.7.4 案例：toDoList 本地存储数据渲染加载到页面&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1.因为后面也会经常渲染加载操作，所以声明一个函数 load，方便后面调用
// 2.先要读取本地存储数据。（数据不要忘记转换为对象格式）
// 3.之后遍历这个数据（$.each()），有几条数据，就生成几个小li 添加到 ol 里面。
// 4.每次渲染之前，先把原先里面 ol 的内容清空，然后渲染加载最新的数据。&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-7-5-todolist-&quot;&gt;&lt;a name=&quot;1.7.5 案例：toDoList 删除操作&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.7.5 案例：toDoList 删除操作&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1.点击里面的a链接，不是删除的li，而是删除本地存储对应的数据。
// 2.核心原理：先获取本地存储数据，删除对应的数据，保存给本地存储，重新渲染列表li
// 3.我们可以给链接自定义属性记录当前的索引号
// 4.根据这个索引号删除相关的数据----数组的splice(i, 1)方法
// 5.存储修改后的数据，然后存储给本地存储
// 6.重新渲染加载数据列表
// 7.因为a是动态创建的，我们使用on方法绑定事件&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-7-6-todolist-&quot;&gt;&lt;a name=&quot;1.7.6 案例：toDoList  正在进行和已完成选项操作&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.7.6 案例：toDoList  正在进行和已完成选项操作&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1.当我们点击了小的复选框，修改本地存储数据，再重新渲染数据列表。
// 2.点击之后，获取本地存储数据。
// 3.修改对应数据属性 done 为当前复选框的checked状态。
// 4.之后保存数据到本地存储
// 5.重新渲染加载数据列表
// 6.load 加载函数里面，新增一个条件,如果当前数据的done为true 就是已经完成的，就把列表渲染加载到 ul 里面
// 7.如果当前数据的done 为false， 则是待办事项，就把列表渲染加载到 ol 里面&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-7-7-todolist-&quot;&gt;&lt;a name=&quot;1.7.7 案例：toDoList 统计正在进行个数和已经完成个数&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.7.7 案例：toDoList 统计正在进行个数和已经完成个数&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1.在我们load 函数里面操作
// 2.声明2个变量 ：todoCount 待办个数  doneCount 已完成个数   
// 3.当进行遍历本地存储数据的时候， 如果 数据done为 false， 则 todoCount++, 否则 doneCount++
// 4.最后修改相应的元素 text() &lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;h2-1-8-&quot;&gt;&lt;a name=&quot;1.8. 今日总结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.8. 今日总结&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images3/总结.png&quot; alt=&quot;总结&quot;&gt;&lt;/p&gt;
</description><pubDate>Tue, 28 Apr 2020 02:16:15 +0800</pubDate></item><item><title>day02 - jQuery</title><link>https://www.liuhuadong.cc/post/42.html</link><description>&lt;h1 id=&quot;h1-day02-jquery&quot;&gt;&lt;a name=&quot;day02 - jQuery&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;day02 - jQuery&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;学习目标：&lt;/p&gt;
&lt;p&gt;能够操作  jQuery 属性&lt;br&gt;能够操作  jQuery 元素&lt;br&gt;能够操作  jQuery 元素尺寸、位置&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;h2-1-1-jquery-&quot;&gt;&lt;a name=&quot;1.1. jQuery 属性操作&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1. jQuery 属性操作&lt;/h2&gt;&lt;p&gt;​    jQuery 常用属性操作有三种：prop() / attr() / data() ;&lt;/p&gt;
&lt;h3 id=&quot;h3-1-1-1-prop-&quot;&gt;&lt;a name=&quot;1.1.1 元素固有属性值 prop()&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1.1 元素固有属性值 prop()&lt;/h3&gt;&lt;p&gt;​    所谓元素固有属性就是元素本身自带的属性，比如 &amp;lt;a&amp;gt; 元素里面的 href ，比如 &amp;lt;input&amp;gt; 元素里面的 type。 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/prop.png&quot; alt=&quot;prop&quot;&gt;&lt;/p&gt;
&lt;p&gt;​    注意：prop() 除了普通属性操作，更适合操作表单属性：disabled / checked / selected 等。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-1-2-attr-&quot;&gt;&lt;a name=&quot;1.1.2 元素自定义属性值 attr()&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1.2 元素自定义属性值 attr()&lt;/h3&gt;&lt;p&gt;​    用户自己给元素添加的属性，我们称为自定义属性。 比如给 div 添加 index =“1”。 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/attr.png&quot; alt=&quot;attr&quot;&gt;&lt;/p&gt;
&lt;p&gt;​    注意：attr() 除了普通属性操作，更适合操作自定义属性。（该方法也可以获取 H5 自定义属性）&lt;/p&gt;
&lt;h3 id=&quot;h3-1-1-3-data-&quot;&gt;&lt;a name=&quot;1.1.3 数据缓存 data()&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1.3 数据缓存 data()&lt;/h3&gt;&lt;p&gt;​    data() 方法可以在指定的元素上存取数据，并不会修改 DOM 元素结构。一旦页面刷新，之前存放的数据都将被移除。 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/data.png&quot; alt=&quot;data&quot;&gt;&lt;/p&gt;
&lt;p&gt;​    注意：同时，还可以读取 HTML5 自定义属性  data-index ，得到的是数字型。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演示代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;a href=&amp;quot;http://www.itcast.cn&amp;quot; title=&amp;quot;都挺好&amp;quot;&amp;gt;都挺好&amp;lt;/a&amp;gt;
    &amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;&amp;quot; id=&amp;quot;&amp;quot; checked&amp;gt;
    &amp;lt;div index=&amp;quot;1&amp;quot; data-index=&amp;quot;2&amp;quot;&amp;gt;我是div&amp;lt;/div&amp;gt;
    &amp;lt;span&amp;gt;123&amp;lt;/span&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            //1. element.prop(&amp;quot;属性名&amp;quot;) 获取元素固有的属性值
            console.log($(&amp;quot;a&amp;quot;).prop(&amp;quot;href&amp;quot;));
            $(&amp;quot;a&amp;quot;).prop(&amp;quot;title&amp;quot;, &amp;quot;我们都挺好&amp;quot;);
            $(&amp;quot;input&amp;quot;).change(function() {
                console.log($(this).prop(&amp;quot;checked&amp;quot;));
            });
            // console.log($(&amp;quot;div&amp;quot;).prop(&amp;quot;index&amp;quot;));
            // 2. 元素的自定义属性 我们通过 attr()
            console.log($(&amp;quot;div&amp;quot;).attr(&amp;quot;index&amp;quot;));
            $(&amp;quot;div&amp;quot;).attr(&amp;quot;index&amp;quot;, 4);
            console.log($(&amp;quot;div&amp;quot;).attr(&amp;quot;data-index&amp;quot;));
            // 3. 数据缓存 data() 这个里面的数据是存放在元素的内存里面
            $(&amp;quot;span&amp;quot;).data(&amp;quot;uname&amp;quot;, &amp;quot;andy&amp;quot;);
            console.log($(&amp;quot;span&amp;quot;).data(&amp;quot;uname&amp;quot;));
            // 这个方法获取data-index h5自定义属性 第一个 不用写data-  而且返回的是数字型
            console.log($(&amp;quot;div&amp;quot;).data(&amp;quot;index&amp;quot;));
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-1-4-&quot;&gt;&lt;a name=&quot;1.1.4 案例：购物车案例模块-全选&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1.4 案例：购物车案例模块-全选&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;1.全选思路：里面3个小的复选框按钮（j-checkbox）选中状态（checked）跟着全选按钮（checkall）走。&lt;br&gt;2.因为checked 是复选框的固有属性，此时我们需要利用prop()方法获取和设置该属性。&lt;br&gt;3.把全选按钮状态赋值给3小复选框就可以了。&lt;br&gt;4.当我们每次点击小的复选框按钮，就来判断：&lt;br&gt;5.如果小复选框被选中的个数等于3 就应该把全选按钮选上，否则全选按钮不选。&lt;br&gt;6.:checked 选择器      :checked 查找被选中的表单元素。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h2 id=&quot;h2-1-2-jquery-&quot;&gt;&lt;a name=&quot;1.2. jQuery 文本属性值&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2. jQuery 文本属性值&lt;/h2&gt;&lt;p&gt;​    jQuery的文本属性值常见操作有三种：html() / text() / val() ; 分别对应JS中的 innerHTML 、innerText 和 value 属性。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-2-1-jquery-&quot;&gt;&lt;a name=&quot;1.2.1 jQuery内容文本值&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.1 jQuery内容文本值&lt;/h3&gt;&lt;p&gt;​    常见操作有三种：html() / text() / val() ; 分别对应JS中的 innerHTML 、innerText 和 value 属性，主要针对元素的内容还有表单的值操作。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/html.png&quot; alt=&quot;html&quot;&gt;&lt;/p&gt;
&lt;p&gt;​    注意：html() 可识别标签，text() 不识别标签。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演示代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;span&amp;gt;我是内容&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;input type=&amp;quot;text&amp;quot; value=&amp;quot;请输入内容&amp;quot;&amp;gt;
    &amp;lt;script&amp;gt;
        // 1. 获取设置元素内容 html()
        console.log($(&amp;quot;div&amp;quot;).html());
        // $(&amp;quot;div&amp;quot;).html(&amp;quot;123&amp;quot;);
        // 2. 获取设置元素文本内容 text()
        console.log($(&amp;quot;div&amp;quot;).text());
        $(&amp;quot;div&amp;quot;).text(&amp;quot;123&amp;quot;);
        // 3. 获取设置表单值 val()
        console.log($(&amp;quot;input&amp;quot;).val());
        $(&amp;quot;input&amp;quot;).val(&amp;quot;123&amp;quot;);
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-2-2-&quot;&gt;&lt;a name=&quot;1.2.2. 案例：购物车案例模块-增减商品数量&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.2. 案例：购物车案例模块-增减商品数量&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;1.核心思路：首先声明一个变量，当我们点击+号（increment），就让这个值++，然后赋值给文本框。&lt;br&gt;2.注意1： 只能增加本商品的数量， 就是当前+号的兄弟文本框（itxt）的值。&lt;br&gt;3.修改表单的值是val() 方法&lt;br&gt;4.注意2： 这个变量初始值应该是这个文本框的值，在这个值的基础上++。要获取表单的值&lt;br&gt;5.减号（decrement）思路同理，但是如果文本框的值是1，就不能再减了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h3 id=&quot;h3-1-2-3-&quot;&gt;&lt;a name=&quot;1.2.3. 案例：购物车案例模块-修改商品小计&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.3. 案例：购物车案例模块-修改商品小计&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;1.核心思路：每次点击+号或者-号，根据文本框的值 乘以 当前商品的价格  就是 商品的小计&lt;br&gt;2.注意1： 只能增加本商品的小计， 就是当前商品的小计模块（p-sum）&lt;br&gt;3.修改普通元素的内容是text() 方法&lt;br&gt;4.注意2： 当前商品的价格，要把￥符号去掉再相乘 截取字符串 substr(1)&lt;br&gt;5.parents(‘选择器’) 可以返回指定祖先元素&lt;br&gt;6.最后计算的结果如果想要保留2位小数 通过 toFixed(2)  方法&lt;br&gt;7.用户也可以直接修改表单里面的值，同样要计算小计。 用表单change事件&lt;br&gt;8.用最新的表单内的值 乘以 单价即可  但是还是当前商品小计&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h2 id=&quot;h2-1-3-jquery-&quot;&gt;&lt;a name=&quot;1.3. jQuery 元素操作&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3. jQuery 元素操作&lt;/h2&gt;&lt;p&gt;​    jQuery 元素操作主要讲的是用jQuery方法，操作标签的遍历、创建、添加、删除等操作。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-3-1-&quot;&gt;&lt;a name=&quot;1.3.1. 遍历元素&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3.1. 遍历元素&lt;/h3&gt;&lt;p&gt;​    jQuery 隐式迭代是对同一类元素做了同样的操作。 如果想要给同一类元素做不同操作，就需要用到遍历。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法1&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/each1.png&quot; alt=&quot;each1&quot;&gt;&lt;/p&gt;
&lt;p&gt;​    注意：此方法用于遍历 jQuery 对象中的每一项，回调函数中元素为 DOM 对象，想要使用 jQuery 方法需要转换。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/each2.png&quot; alt=&quot;each2&quot;&gt;&lt;/p&gt;
&lt;p&gt;​    注意：此方法用于遍历 jQuery 对象中的每一项，回调函数中元素为 DOM 对象，想要使用 jQuery 方法需要转换。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;演示代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;1&amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;2&amp;lt;/div&amp;gt;
    &amp;lt;div&amp;gt;3&amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            // 如果针对于同一类元素做不同操作，需要用到遍历元素（类似for，但是比for强大）
            var sum = 0;
            var arr = [&amp;quot;red&amp;quot;, &amp;quot;green&amp;quot;, &amp;quot;blue&amp;quot;];
            // 1. each() 方法遍历元素 
            $(&amp;quot;div&amp;quot;).each(function(i, domEle) {
                // 回调函数第一个参数一定是索引号  可以自己指定索引号号名称
                // console.log(i);
                // 回调函数第二个参数一定是 dom 元素对象，也是自己命名
                // console.log(domEle);  // 使用jQuery方法需要转换 $(domEle)
                $(domEle).css(&amp;quot;color&amp;quot;, arr[i]);
                sum += parseInt($(domEle).text());
            })
            console.log(sum);
            // 2. $.each() 方法遍历元素 主要用于遍历数据，处理数据
            // $.each($(&amp;quot;div&amp;quot;), function(i, ele) {
            //     console.log(i);
            //     console.log(ele);
            // });
            // $.each(arr, function(i, ele) {
            //     console.log(i);
            //     console.log(ele);
            // })
            $.each({
                name: &amp;quot;andy&amp;quot;,
                age: 18
            }, function(i, ele) {
                console.log(i); // 输出的是 name age 属性名
                console.log(ele); // 输出的是 andy  18 属性值
            })
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-3-2-&quot;&gt;&lt;a name=&quot;1.3.2. 案例：购物车案例模块-计算总计和总额&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3.2. 案例：购物车案例模块-计算总计和总额&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;1.把所有文本框中的值相加就是总额数量，总计同理。&lt;br&gt;2.文本框里面的值不同，如果想要相加需要用 each() 遍历，声明一个变量做计数器，累加即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h3 id=&quot;h3-1-3-3-&quot;&gt;&lt;a name=&quot;1.3.3. 创建、添加、删除&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3.3. 创建、添加、删除&lt;/h3&gt;&lt;p&gt;​    jQuery方法操作元素的创建、添加、删除方法很多，则重点使用部分，如下：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法总和&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/create.png&quot; alt=&quot;create&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/append1.png&quot; alt=&quot;append1&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/append2.png&quot; alt=&quot;append2&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/remove.png&quot; alt=&quot;remove&quot;&gt;&lt;/p&gt;
&lt;p&gt;​    注意：以上只是元素的创建、添加、删除方法的常用方法，其他方法请参详API。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;案例代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;原先的li&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;div class=&amp;quot;test&amp;quot;&amp;gt;我是原先的div&amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            // 1. 创建元素
            var li = $(&amp;quot;&amp;lt;li&amp;gt;我是后来创建的li&amp;lt;/li&amp;gt;&amp;quot;);

            // 2. 添加元素
            //     2.1 内部添加
            // $(&amp;quot;ul&amp;quot;).append(li);  内部添加并且放到内容的最后面 
            $(&amp;quot;ul&amp;quot;).prepend(li); // 内部添加并且放到内容的最前面
            //  2.2 外部添加
            var div = $(&amp;quot;&amp;lt;div&amp;gt;我是后妈生的&amp;lt;/div&amp;gt;&amp;quot;);
            // $(&amp;quot;.test&amp;quot;).after(div);
            $(&amp;quot;.test&amp;quot;).before(div);

            // 3. 删除元素
            // $(&amp;quot;ul&amp;quot;).remove(); 可以删除匹配的元素 自杀
            // $(&amp;quot;ul&amp;quot;).empty(); // 可以删除匹配的元素里面的子节点 孩子
            $(&amp;quot;ul&amp;quot;).html(&amp;quot;&amp;quot;); // 可以删除匹配的元素里面的子节点 孩子
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-3-4-&quot;&gt;&lt;a name=&quot;1.3.4 案例：购物车案例模块-删除商品模块&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3.4 案例：购物车案例模块-删除商品模块&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;1.核心思路：把商品remove() 删除元素即可&lt;br&gt;2.有三个地方需要删除： 1. 商品后面的删除按钮 2. 删除选中的商品 3. 清理购物车&lt;br&gt;3.商品后面的删除按钮： 一定是删除当前的商品，所以从 $(this) 出发&lt;br&gt;4.删除选中的商品： 先判断小的复选框按钮是否选中状态，如果是选中，则删除对应的商品&lt;br&gt;5.清理购物车： 则是把所有的商品全部删掉&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h3 id=&quot;h3-1-3-5-&quot;&gt;&lt;a name=&quot;1.3.5 案例：购物车案例模块-选中商品添加背景&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3.5 案例：购物车案例模块-选中商品添加背景&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;1.核心思路：选中的商品添加背景，不选中移除背景即可&lt;br&gt;2.全选按钮点击：如果全选是选中的，则所有的商品添加背景，否则移除背景&lt;br&gt;3.小的复选框点击： 如果是选中状态，则当前商品添加背景，否则移除背景&lt;br&gt;4.这个背景，可以通过类名修改，添加类和删除类&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h2 id=&quot;h2-1-4-jquery-&quot;&gt;&lt;a name=&quot;1.4.  jQuery 尺寸、位置操作&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.  jQuery 尺寸、位置操作&lt;/h2&gt;&lt;p&gt;​    jQuery中分别为我们提供了两套快速获取和设置元素尺寸和位置的API，方便易用，内容如下。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-4-1-jquery-&quot;&gt;&lt;a name=&quot;1.4.1.  jQuery 尺寸操作&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.1.  jQuery 尺寸操作&lt;/h3&gt;&lt;p&gt;​     jQuery 尺寸操作包括元素宽高的获取和设置，且不一样的API对应不一样的盒子模型。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/size.png&quot; alt=&quot;size&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码演示&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            // 1. width() / height() 获取设置元素 width和height大小 
            console.log($(&amp;quot;div&amp;quot;).width());
            // $(&amp;quot;div&amp;quot;).width(300);

            // 2. innerWidth() / innerHeight()  获取设置元素 width和height + padding 大小 
            console.log($(&amp;quot;div&amp;quot;).innerWidth());

            // 3. outerWidth()  / outerHeight()  获取设置元素 width和height + padding + border 大小 
            console.log($(&amp;quot;div&amp;quot;).outerWidth());

            // 4. outerWidth(true) / outerHeight(true) 获取设置 width和height + padding + border + margin
            console.log($(&amp;quot;div&amp;quot;).outerWidth(true));
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​    注意：有了这套 API 我们将可以快速获取和子的宽高，至于其他属性想要获取和设置，还要使用 css() 等方法配合。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-4-2-jquery-&quot;&gt;&lt;a name=&quot;1.4.2. jQuery 位置操作&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.2. jQuery 位置操作&lt;/h3&gt;&lt;p&gt;​    jQuery的位置操作主要有三个： offset()、position()、scrollTop()/scrollLeft() , 具体介绍如下: &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/offset.png&quot; alt=&quot;offset&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/position.png&quot; alt=&quot;position&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/scroll.png&quot; alt=&quot;scroll&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码演示&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;div class=&amp;quot;father&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;son&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;div class=&amp;quot;back&amp;quot;&amp;gt;返回顶部&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;

    &amp;lt;script&amp;gt;
        $(function() {
            // 1. 获取设置距离文档的位置（偏移） offset
            console.log($(&amp;quot;.son&amp;quot;).offset());
            console.log($(&amp;quot;.son&amp;quot;).offset().top);
            // $(&amp;quot;.son&amp;quot;).offset({
            //     top: 200,
            //     left: 200
            // });

            // 2. 获取距离带有定位父级位置（偏移） position   如果没有带有定位的父级，则以文档为准
            // 这个方法只能获取不能设置偏移
            console.log($(&amp;quot;.son&amp;quot;).position());
            // $(&amp;quot;.son&amp;quot;).position({
            //     top: 200,
            //     left: 200
            // });

              // 3. 被卷去的头部
              $(document).scrollTop(100);
            // 被卷去的头部 scrollTop()  / 被卷去的左侧 scrollLeft()
            // 页面滚动事件
            var boxTop = $(&amp;quot;.container&amp;quot;).offset().top;
            $(window).scroll(function() {
                // console.log(11);
                console.log($(document).scrollTop());
                if ($(document).scrollTop() &amp;gt;= boxTop) {
                    $(&amp;quot;.back&amp;quot;).fadeIn();
                } else {
                    $(&amp;quot;.back&amp;quot;).fadeOut();
                }
            });
            // 返回顶部
            $(&amp;quot;.back&amp;quot;).click(function() {
                // $(document).scrollTop(0);
                $(&amp;quot;body, html&amp;quot;).stop().animate({
                    scrollTop: 0
                });
                // $(document).stop().animate({
                //     scrollTop: 0
                // }); 不能是文档而是 html和body元素做动画
            })
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-4-3-&quot;&gt;&lt;a name=&quot;1.4.3. 案例：带有动画的返回顶部&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.3. 案例：带有动画的返回顶部&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;1.核心原理： 使用animate动画返回顶部。&lt;br&gt;2.animate动画函数里面有个scrollTop 属性，可以设置位置&lt;br&gt;3.但是是元素做动画，因此 $(“body,html”).animate({scrollTop: 0})&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h3 id=&quot;h3-1-4-4-&quot;&gt;&lt;a name=&quot;1.4.4. 案例： 品优购电梯导航（上）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.4. 案例： 品优购电梯导航（上）&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;1.当我们滚动到 今日推荐 模块，就让电梯导航显示出来&lt;br&gt;2.点击电梯导航页面可以滚动到相应内容区域&lt;br&gt;3.核心算法：因为电梯导航模块和内容区模块一一对应的&lt;br&gt;4.当我们点击电梯导航某个小模块，就可以拿到当前小模块的索引号&lt;br&gt;5.就可以把animate要移动的距离求出来：当前索引号内容区模块它的offset().top&lt;br&gt;6.然后执行动画即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h3 id=&quot;h3-1-4-5-&quot;&gt;&lt;a name=&quot;1.4.5. 案例：品优购电梯导航（下）&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.5. 案例：品优购电梯导航（下）&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;1.当我们点击电梯导航某个小li， 当前小li 添加current类，兄弟移除类名&lt;br&gt;2.当我们页面滚动到内容区域某个模块， 左侧电梯导航，相对应的小li模块，也会添加current类， 兄弟移除current类。&lt;br&gt;3.触发的事件是页面滚动，因此这个功能要写到页面滚动事件里面。&lt;br&gt;4.需要用到each，遍历内容区域大模块。 each里面能拿到内容区域每一个模块元素和索引号&lt;br&gt;5.判断的条件：  被卷去的头部 大于等于 内容区域里面每个模块的offset().top&lt;br&gt;6.就利用这个索引号找到相应的电梯导航小li添加类。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h2 id=&quot;h2-1-5-&quot;&gt;&lt;a name=&quot;1.5. 今日总结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.5. 今日总结&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images2/总结.png&quot; alt=&quot;总结&quot;&gt;&lt;/p&gt;
</description><pubDate>Tue, 28 Apr 2020 02:04:19 +0800</pubDate></item><item><title>day01 - jQuery</title><link>https://www.liuhuadong.cc/post/41.html</link><description>&lt;h1 id=&quot;h1-day01-jquery&quot;&gt;&lt;a name=&quot;day01 - jQuery&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;day01 - jQuery&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;学习目标：&lt;/p&gt;
&lt;p&gt;能够说出什么是 jQuery&lt;br&gt;能够说出 jQuery 的优点&lt;br&gt;能够简单使用 jQuery&lt;br&gt;能够说出 DOM 对象和 jQuery 对象的区别&lt;br&gt;能够写出常用的 jQuery 选择器&lt;br&gt;能够操作 jQuery 样式&lt;br&gt;能够写出常用的 jQuery 动画 &lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;h2-1-1-jquery-&quot;&gt;&lt;a name=&quot;1.1. jQuery 介绍&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1. jQuery 介绍&lt;/h2&gt;&lt;h3 id=&quot;h3-1-1-1-javascript-&quot;&gt;&lt;a name=&quot;1.1.1 JavaScript 库&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1.1 JavaScript 库&lt;/h3&gt;&lt;p&gt;​    JavaScript库：即 library，是一个封装好的特定的集合（方法和函数）。从封装一大堆函数的角度理解库，就是在这个库中，封装了很多预先定义好的函数在里面，比如动画animate、hide、show，比如获取元素等。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;简单理解： 就是一个JS 文件，里面对我们原生js代码进行了封装，存放到里面。这样我们可以快速高效的使用这些封装好的功能了。&lt;/p&gt;
&lt;p&gt;比如 jQuery，就是为了快速方便的操作DOM，里面基本都是函数（方法）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    常见的JavaScript 库：jQuery、Prototype、YUI、Dojo、Ext JS、移动端的zepto等，这些库都是对原生 JavaScript 的封装，内部都是用 JavaScript 实现的，我们主要学习的是 jQuery。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-1-2-jquery-&quot;&gt;&lt;a name=&quot;1.1.2 jQuery的概念&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1.2 jQuery的概念&lt;/h3&gt;&lt;p&gt;​    jQuery总体概况如下 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;jQuery 是一个快速、简洁的 JavaScript 库，其设计的宗旨是“write Less，Do More”，即倡导写更少的代码，做更多的事情。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;j 就是 JavaScript；   Query 查询； 意思就是查询js，把js中的DOM操作做了封装，我们可以快速的查询使用里面的功能。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;jQuery 封装了 JavaScript 常用的功能代码，优化了 DOM 操作、事件处理、动画设计和 Ajax 交互。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;学习jQuery本质： 就是学习调用这些函数（方法）。&lt;/p&gt;
&lt;/li&gt;&lt;li&gt;&lt;p&gt;jQuery 出现的目的是加快前端人员的开发速度，我们可以非常方便的调用和使用它，从而提高开发效率。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/jQuery概述.jpg&quot; alt=&quot;jQuery概述&quot;&gt;&lt;/p&gt;
&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-1-1-3-jquery-&quot;&gt;&lt;a name=&quot;1.1.3 jQuery的优点&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.1.3 jQuery的优点&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;轻量级。核心文件才几十kb，不会影响页面加载速度。&lt;/li&gt;&lt;li&gt;跨浏览器兼容，基本兼容了现在主流的浏览器。&lt;/li&gt;&lt;li&gt;链式编程、隐式迭代。&lt;/li&gt;&lt;li&gt;对事件、样式、动画支持，大大简化了DOM操作。&lt;/li&gt;&lt;li&gt;支持插件扩展开发。有着丰富的第三方的插件，例如：树形菜单、日期控件、轮播图等。&lt;/li&gt;&lt;li&gt;免费、开源。&lt;/li&gt;&lt;/ol&gt;
&lt;h2 id=&quot;h2-1-2-jquery-&quot;&gt;&lt;a name=&quot;1.2. jQuery 的基本使用&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2. jQuery 的基本使用&lt;/h2&gt;&lt;h3 id=&quot;h3-1-2-1-jquery-&quot;&gt;&lt;a name=&quot;1.2.1 jQuery 的下载&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.1 jQuery 的下载&lt;/h3&gt;&lt;p&gt;​    jQuery的官网地址： &lt;a href=&quot;https://jquery.com/，官网即可下载最新版本。&quot;&gt;https://jquery.com/，官网即可下载最新版本。&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt; 各个版本的下载：&lt;a href=&quot;https://code.jquery.com/&quot;&gt;https://code.jquery.com/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    版本介绍：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;1x ：兼容 IE 678 等低版本浏览器， 官网不再更新&lt;/p&gt;
&lt;p&gt;2x ：不兼容 IE 678 等低版本浏览器， 官网不再更新&lt;/p&gt;
&lt;p&gt;3x ：不兼容 IE 678 等低版本浏览器， 是官方主要更新维护的版本&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;h3-1-2-2-jquery&quot;&gt;&lt;a name=&quot;1.2.2. 体验jQuery&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.2. 体验jQuery&lt;/h3&gt;&lt;p&gt;​    步骤：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;引入jQuery文件。&lt;/li&gt;&lt;li&gt;在文档最末尾插入 script 标签，书写体验代码。&lt;/li&gt;&lt;li&gt;$(‘div’).hide() 可以隐藏盒子。&lt;/li&gt;&lt;/ul&gt;
&lt;h3 id=&quot;h3-1-2-3-jquery-&quot;&gt;&lt;a name=&quot;1.2.3. jQuery的入口函数&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.3. jQuery的入口函数&lt;/h3&gt;&lt;p&gt;​    jQuery中常见的两种入口函数：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 第一种: 简单易用。
$(function () {   
    ...  // 此处是页面 DOM 加载完成的入口
}) ; 

// 第二种: 繁琐，但是也可以实现
$(document).ready(function(){
   ...  //  此处是页面DOM加载完成的入口
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​    总结：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;等着 DOM 结构渲染完毕即可执行内部代码，不必等到所有外部资源加载完成，jQuery 帮我们完成了封装。&lt;/li&gt;&lt;li&gt;相当于原生 js 中的 DOMContentLoaded。&lt;/li&gt;&lt;li&gt;不同于原生 js 中的 load 事件是等页面文档、外部的 js 文件、css文件、图片加载完毕才执行内部代码。&lt;/li&gt;&lt;li&gt;更推荐使用第一种方式。&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-1-2-4-jquery-&quot;&gt;&lt;a name=&quot;1.2.4. jQuery中的顶级对象$&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.4. jQuery中的顶级对象$&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;$是 jQuery 的别称，在代码中可以使用 jQuery 代替，但一般为了方便，通常都直接使用 $ 。&lt;/li&gt;&lt;li&gt;$是jQuery的顶级对象，相当于原生JavaScript中的 window。把元素利用$包装成jQuery对象，就可以调用jQuery 的方法。&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-1-2-5-jquery-dom-&quot;&gt;&lt;a name=&quot;1.2.5.  jQuery 对象和 DOM 对象&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.5.  jQuery 对象和 DOM 对象&lt;/h3&gt;&lt;p&gt;​    使用 jQuery 方法和原生JS获取的元素是不一样的，总结如下 : &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用原生 JS 获取来的对象就是 DOM 对象&lt;/li&gt;&lt;li&gt;jQuery 方法获取的元素就是 jQuery 对象。&lt;/li&gt;&lt;li&gt;jQuery 对象本质是： 利用$对DOM 对象包装后产生的对象（伪数组形式存储）。&lt;/li&gt;&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;p&gt;只有 jQuery 对象才能使用 jQuery 方法，DOM 对象则使用原生的 JavaScirpt 方法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/jQuery对象和DOM对象.png&quot; alt=&quot;jQuery对象和DOM对象&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-1-2-6-jquery-dom-&quot;&gt;&lt;a name=&quot;1.2.6.  jQuery 对象和 DOM 对象转换&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.2.6.  jQuery 对象和 DOM 对象转换&lt;/h3&gt;&lt;p&gt;​    DOM 对象与 jQuery 对象之间是可以相互转换的。因为原生js 比 jQuery 更大，原生的一些属性和方法 jQuery没有给我们封装. 要想使用这些属性和方法需要把jQuery对象转换为DOM对象才能使用。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1.DOM对象转换成jQuery对象，方法只有一种
var box = document.getElementById(&amp;#39;box&amp;#39;);  // 获取DOM对象
var jQueryObject = $(box);  // 把DOM对象转换为 jQuery 对象

// 2.jQuery 对象转换为 DOM 对象有两种方法：
//   2.1 jQuery对象[索引值]
var domObject1 = $(&amp;#39;div&amp;#39;)[0]

//   2.2 jQuery对象.get(索引值)
var domObject2 = $(&amp;#39;div&amp;#39;).get(0)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;总结：实际开发比较常用的是把DOM对象转换为jQuery对象，这样能够调用功能更加强大的jQuery中的方法。&lt;/p&gt;
&lt;h2 id=&quot;h2-1-3-jquery-&quot;&gt;&lt;a name=&quot;1.3. jQuery 选择器&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3. jQuery 选择器&lt;/h2&gt;&lt;p&gt;​    原生 JS 获取元素方式很多，很杂，而且兼容性情况不一致，因此 jQuery 给我们做了封装，使获取元素统一标准。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-3-1-&quot;&gt;&lt;a name=&quot;1.3.1. 基础选择器&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3.1. 基础选择器&lt;/h3&gt;&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;$(&amp;quot;选择器&amp;quot;)   //  里面选择器直接写 CSS 选择器即可，但是要加引号 &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​    &lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/基础选择器.png&quot; alt=&quot;基础选择器&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;h3-1-3-2-&quot;&gt;&lt;a name=&quot;1.3.2. 层级选择器&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3.2. 层级选择器&lt;/h3&gt;&lt;p&gt;​    层级选择器最常用的两个分别为：后代选择器和子代选择器。&lt;/p&gt;
&lt;p&gt;​    &lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/层级选择器.png&quot; alt=&quot;层级选择器&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基础选择器和层级选择器案例代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;我是div&amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;nav&amp;quot;&amp;gt;我是nav div&amp;lt;/div&amp;gt;
    &amp;lt;p&amp;gt;我是p&amp;lt;/p&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;我是ul 的&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;我是ul 的&amp;lt;/li&amp;gt;        
        &amp;lt;li&amp;gt;我是ul 的&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            console.log($(&amp;quot;.nav&amp;quot;));
            console.log($(&amp;quot;ul li&amp;quot;));
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-3-3-&quot;&gt;&lt;a name=&quot;1.3.3. 筛选选择器&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3.3. 筛选选择器&lt;/h3&gt;&lt;p&gt;​    筛选选择器，顾名思义就是在所有的选项中选择满足条件的进行筛选选择。常见如下 :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/筛选选择器.png&quot; alt=&quot;筛选选择器&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;案例代码&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;ol&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;多个里面筛选几个&amp;lt;/li&amp;gt;
    &amp;lt;/ol&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            $(&amp;quot;ul li:first&amp;quot;).css(&amp;quot;color&amp;quot;, &amp;quot;red&amp;quot;);
            $(&amp;quot;ul li:eq(2)&amp;quot;).css(&amp;quot;color&amp;quot;, &amp;quot;blue&amp;quot;);
            $(&amp;quot;ol li:odd&amp;quot;).css(&amp;quot;color&amp;quot;, &amp;quot;skyblue&amp;quot;);
            $(&amp;quot;ol li:even&amp;quot;).css(&amp;quot;color&amp;quot;, &amp;quot;pink&amp;quot;);
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另:  jQuery中还有一些筛选方法，类似DOM中的通过一个节点找另外一个节点，父、子、兄以外有所加强。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/relation.png&quot; alt=&quot;筛选方法&quot;&gt;&lt;/p&gt;
&lt;p&gt;偏重于记忆，演示代码略。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-3-4-&quot;&gt;&lt;a name=&quot;1.3.4 知识铺垫&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3.4 知识铺垫&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;jQuery 设置样式&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;$(&amp;#39;div&amp;#39;).css(&amp;#39;属性&amp;#39;, &amp;#39;值&amp;#39;)    &lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;jQuery 里面的排他思想&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 想要多选一的效果，排他思想：当前元素设置样式，其余的兄弟元素清除样式。
$(this).css(“color”,”red”);
$(this).siblings(). css(“color”,””);&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;隐式迭代&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 遍历内部 DOM 元素（伪数组形式存储）的过程就叫做隐式迭代。
// 简单理解：给匹配到的所有元素进行循环遍历，执行相应的方法，而不用我们再进行循环，简化我们的操作，方便我们调用。
$(&amp;#39;div&amp;#39;).hide();  // 页面中所有的div全部隐藏，不用循环操作&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;链式编程&lt;/li&gt;&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 链式编程是为了节省代码量，看起来更优雅。
$(this).css(&amp;#39;color&amp;#39;, &amp;#39;red&amp;#39;).sibling().css(&amp;#39;color&amp;#39;, &amp;#39;&amp;#39;); &lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-3-5-&quot;&gt;&lt;a name=&quot;1.3.5 案例：淘宝服饰精品案例&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.3.5 案例：淘宝服饰精品案例&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;思路分析:&lt;br&gt;1.核心原理：鼠标经过左侧盒子某个小li，就让内容区盒子相对应图片显示，其余的图片隐藏。&lt;br&gt;2.需要得到当前小li 的索引号，就可以显示对应索引号的图片&lt;br&gt;3.jQuery 得到当前元素索引号 $(this).index()&lt;br&gt;4.中间对应的图片，可以通过  eq(index) 方法去选择&lt;br&gt;5.显示元素 show()   隐藏元素 hide()&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h2 id=&quot;h2-1-4-jquery-&quot;&gt;&lt;a name=&quot;1.4.  jQuery 样式操作&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.  jQuery 样式操作&lt;/h2&gt;&lt;p&gt;​    jQuery中常用的样式操作有两种：css() 和 设置类样式方法&lt;/p&gt;
&lt;h3 id=&quot;h3-1-4-1-1-css-&quot;&gt;&lt;a name=&quot;1.4.1. 方法1: 操作 css 方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.1. 方法1: 操作 css 方法&lt;/h3&gt;&lt;p&gt;​    jQuery 可以使用 css 方法来修改简单元素样式； 也可以操作类，修改多个样式。&lt;/p&gt;
&lt;p&gt;​    常用以下三种形式 : &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1.参数只写属性名，则是返回属性值
var strColor = $(this).css(&amp;#39;color&amp;#39;);

// 2.  参数是属性名，属性值，逗号分隔，是设置一组样式，属性必须加引号，值如果是数字可以不用跟单位和引号
$(this).css(&amp;#39;&amp;#39;color&amp;#39;&amp;#39;, &amp;#39;&amp;#39;red&amp;#39;&amp;#39;);

// 3.  参数可以是对象形式，方便设置多组样式。属性名和属性值用冒号隔开， 属性可以不用加引号
$(this).css({ &amp;quot;color&amp;quot;:&amp;quot;white&amp;quot;,&amp;quot;font-size&amp;quot;:&amp;quot;20px&amp;quot;});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​    注意：css() 多用于样式少时操作，多了则不太方便。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-4-2-2-&quot;&gt;&lt;a name=&quot;1.4.2. 方法2: 设置类样式方法&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.2. 方法2: 设置类样式方法&lt;/h3&gt;&lt;p&gt;​    作用等同于以前的 classList，可以操作类样式， 注意操作类里面的参数不要加点。&lt;/p&gt;
&lt;p&gt;​    常用的三种设置类样式方法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// 1.添加类
$(&amp;quot;div&amp;quot;).addClass(&amp;quot;current&amp;quot;);

// 2.删除类
$(&amp;quot;div&amp;quot;).removeClass(&amp;quot;current&amp;quot;);

// 3.切换类
$(&amp;quot;div&amp;quot;).toggleClass(&amp;quot;current&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;​    注意：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;设置类样式方法比较适合样式多时操作，可以弥补css()的不足。&lt;/li&gt;&lt;li&gt;原生 JS 中 className 会覆盖元素原先里面的类名，jQuery 里面类操作只是对指定类进行操作，不影响原先的类名。&lt;/li&gt;&lt;/ol&gt;
&lt;h3 id=&quot;h3-1-4-3-tab-&quot;&gt;&lt;a name=&quot;1.4.3. 案例：tab 栏切换&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.4.3. 案例：tab 栏切换&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;思路分析:&lt;br&gt;1.点击上部的li，当前li 添加current类，其余兄弟移除类。&lt;br&gt;2.点击的同时，得到当前li 的索引号&lt;br&gt;3.让下部里面相应索引号的item显示，其余的item隐藏&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h2 id=&quot;h2-1-5-jquery-&quot;&gt;&lt;a name=&quot;1.5. jQuery 效果&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.5. jQuery 效果&lt;/h2&gt;&lt;p&gt;​    jQuery 给我们封装了很多动画效果，最为常见的如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;显示隐藏：show() / hide() / toggle() ;&lt;/li&gt;&lt;li&gt;划入画出：slideDown() / slideUp() / slideToggle() ; &lt;/li&gt;&lt;li&gt;淡入淡出：fadeIn() / fadeOut() / fadeToggle() / fadeTo() ; &lt;/li&gt;&lt;li&gt;自定义动画：animate() ;&lt;/li&gt;&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;p&gt;动画或者效果一旦触发就会执行，如果多次触发，就造成多个动画或者效果排队执行。&lt;/p&gt;
&lt;p&gt;jQuery为我们提供另一个方法，可以停止动画排队：stop() ;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;h3-1-5-1-&quot;&gt;&lt;a name=&quot;1.5.1. 显示隐藏&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.5.1. 显示隐藏&lt;/h3&gt;&lt;p&gt;​    显示隐藏动画，常见有三个方法：show() / hide() / toggle() ;&lt;/p&gt;
&lt;p&gt;​    语法规范如下:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/show.png&quot; alt=&quot;show&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/hide.png&quot; alt=&quot;hide&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/toggle.png&quot; alt=&quot;toggle&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码演示&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;button&amp;gt;显示&amp;lt;/button&amp;gt;
    &amp;lt;button&amp;gt;隐藏&amp;lt;/button&amp;gt;
    &amp;lt;button&amp;gt;切换&amp;lt;/button&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            $(&amp;quot;button&amp;quot;).eq(0).click(function() {
                $(&amp;quot;div&amp;quot;).show(1000, function() {
                    alert(1);
                });
            })
            $(&amp;quot;button&amp;quot;).eq(1).click(function() {
                $(&amp;quot;div&amp;quot;).hide(1000, function() {
                    alert(1);
                });
            })
            $(&amp;quot;button&amp;quot;).eq(2).click(function() {
              $(&amp;quot;div&amp;quot;).toggle(1000);
            })
            // 一般情况下，我们都不加参数直接显示隐藏就可以了
        });
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-5-2-&quot;&gt;&lt;a name=&quot;1.5.2. 滑入滑出&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.5.2. 滑入滑出&lt;/h3&gt;&lt;p&gt;​    滑入滑出动画，常见有三个方法：slideDown() / slideUp() / slideToggle() ; &lt;/p&gt;
&lt;p&gt;​    语法规范如下:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/slideDown.png&quot; alt=&quot;slideDown&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/slideUp.png&quot; alt=&quot;slideUp&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/slideToggle.png&quot; alt=&quot;slideToggle&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码演示&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;button&amp;gt;下拉滑动&amp;lt;/button&amp;gt;
    &amp;lt;button&amp;gt;上拉滑动&amp;lt;/button&amp;gt;
    &amp;lt;button&amp;gt;切换滑动&amp;lt;/button&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            $(&amp;quot;button&amp;quot;).eq(0).click(function() {
                // 下滑动 slideDown()
                $(&amp;quot;div&amp;quot;).slideDown();
            })
            $(&amp;quot;button&amp;quot;).eq(1).click(function() {
                // 上滑动 slideUp()
                $(&amp;quot;div&amp;quot;).slideUp(500);
            })
            $(&amp;quot;button&amp;quot;).eq(2).click(function() {
                // 滑动切换 slideToggle()
                $(&amp;quot;div&amp;quot;).slideToggle(500);
            });
        });
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;小案例：下拉菜单略（详情参看源码）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;h3-1-5-3-&quot;&gt;&lt;a name=&quot;1.5.3 淡入淡出&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.5.3 淡入淡出&lt;/h3&gt;&lt;p&gt;​    淡入淡出动画，常见有四个方法：fadeIn() / fadeOut() / fadeToggle() / fadeTo() ; &lt;/p&gt;
&lt;p&gt;​    语法规范如下:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/fadeIn.png&quot; alt=&quot;fadeIn&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/fadeOut.png&quot; alt=&quot;fadeOut&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/fadeToggle.png&quot; alt=&quot;fadeToggle&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/fadeTo.png&quot; alt=&quot;fadeTo&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码演示&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;button&amp;gt;淡入效果&amp;lt;/button&amp;gt;
    &amp;lt;button&amp;gt;淡出效果&amp;lt;/button&amp;gt;
    &amp;lt;button&amp;gt;淡入淡出切换&amp;lt;/button&amp;gt;
    &amp;lt;button&amp;gt;修改透明度&amp;lt;/button&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            $(&amp;quot;button&amp;quot;).eq(0).click(function() {
                // 淡入 fadeIn()
                $(&amp;quot;div&amp;quot;).fadeIn(1000);
            })
            $(&amp;quot;button&amp;quot;).eq(1).click(function() {
                // 淡出 fadeOut()
                $(&amp;quot;div&amp;quot;).fadeOut(1000);
            })
            $(&amp;quot;button&amp;quot;).eq(2).click(function() {
                // 淡入淡出切换 fadeToggle()
                $(&amp;quot;div&amp;quot;).fadeToggle(1000);
            });
            $(&amp;quot;button&amp;quot;).eq(3).click(function() {
                //  修改透明度 fadeTo() 这个速度和透明度要必须写
                $(&amp;quot;div&amp;quot;).fadeTo(1000, 0.5);
            });
        });
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-5-4-&quot;&gt;&lt;a name=&quot;1.5.4 自定义动画&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.5.4 自定义动画&lt;/h3&gt;&lt;p&gt;​    自定义动画非常强大，通过参数的传递可以模拟以上所有动画，方法为：animate() ;&lt;/p&gt;
&lt;p&gt;​    语法规范如下:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/animate.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码演示&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;button&amp;gt;动起来&amp;lt;/button&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            $(&amp;quot;button&amp;quot;).click(function() {
                $(&amp;quot;div&amp;quot;).animate({
                    left: 500,
                    top: 300,
                    opacity: .4,
                    width: 500
                }, 500);
            })
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-5-5-&quot;&gt;&lt;a name=&quot;1.5.5 停止动画排队&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.5.5 停止动画排队&lt;/h3&gt;&lt;p&gt;​    动画或者效果一旦触发就会执行，如果多次触发，就造成多个动画或者效果排队执行。&lt;/p&gt;
&lt;p&gt;​    停止动画排队的方法为：stop() ; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;stop() 方法用于停止动画或效果。&lt;/li&gt;&lt;li&gt;stop() 写到动画或者效果的前面， 相当于停止结束上一次的动画。&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;​        总结: 每次使用动画之前，先调用 stop() ,在调用动画。&lt;/p&gt;
&lt;h3 id=&quot;h3-1-5-6-&quot;&gt;&lt;a name=&quot;1.5.6. 事件切换&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.5.6. 事件切换&lt;/h3&gt;&lt;p&gt;​    jQuery中为我们添加了一个新事件 hover() ; 功能类似 css 中的伪类 :hover 。介绍如下&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;语法&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;hover([over,]out)     // 其中over和out为两个函数&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;over:鼠标移到元素上要触发的函数（相当于mouseenter）&lt;/li&gt;&lt;li&gt;out:鼠标移出元素要触发的函数（相当于mouseleave）&lt;/li&gt;&lt;li&gt;如果只写一个函数，则鼠标经过和离开都会触发它&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;hover事件和停止动画排列案例&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;&amp;lt;body&amp;gt;
    &amp;lt;ul class=&amp;quot;nav&amp;quot;&amp;gt;
        &amp;lt;li&amp;gt;
            &amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;微博&amp;lt;/a&amp;gt;
            &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;私信&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;评论&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;@我&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;
        &amp;lt;/li&amp;gt;
        &amp;lt;li&amp;gt;
            &amp;lt;a href=&amp;quot;#&amp;quot;&amp;gt;微博&amp;lt;/a&amp;gt;
            &amp;lt;ul&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;私信&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;评论&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;quot;&amp;gt;@我&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;
        &amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;script&amp;gt;
        $(function() {
            // 鼠标经过
            // $(&amp;quot;.nav&amp;gt;li&amp;quot;).mouseover(function() {
            //     // $(this) jQuery 当前元素  this不要加引号
            //     // show() 显示元素  hide() 隐藏元素
            //     $(this).children(&amp;quot;ul&amp;quot;).slideDown(200);
            // });
            // // 鼠标离开
            // $(&amp;quot;.nav&amp;gt;li&amp;quot;).mouseout(function() {
            //     $(this).children(&amp;quot;ul&amp;quot;).slideUp(200);
            // });
            // 1. 事件切换 hover 就是鼠标经过和离开的复合写法
            // $(&amp;quot;.nav&amp;gt;li&amp;quot;).hover(function() {
            //     $(this).children(&amp;quot;ul&amp;quot;).slideDown(200);
            // }, function() {
            //     $(this).children(&amp;quot;ul&amp;quot;).slideUp(200);
            // });
            // 2. 事件切换 hover  如果只写一个函数，那么鼠标经过和鼠标离开都会触发这个函数
            $(&amp;quot;.nav&amp;gt;li&amp;quot;).hover(function() {
                // stop 方法必须写到动画的前面
                $(this).children(&amp;quot;ul&amp;quot;).stop().slideToggle();
            });
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;h3-1-5-7-&quot;&gt;&lt;a name=&quot;1.5.7. 案例：王者荣耀手风琴效果&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.5.7. 案例：王者荣耀手风琴效果&lt;/h3&gt;&lt;blockquote&gt;
&lt;p&gt;思路分析:&lt;br&gt;1.鼠标经过某个小li 有两步操作：&lt;br&gt;2.当前小li 宽度变为 224px， 同时里面的小图片淡出，大图片淡入&lt;br&gt;3.其余兄弟小li宽度变为69px， 小图片淡入， 大图片淡出&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;​    代码实现略。(详情参考源代码)&lt;/p&gt;
&lt;h2 id=&quot;h2-1-6-&quot;&gt;&lt;a name=&quot;1.6. 今日总结&quot; class=&quot;reference-link&quot; href=&quot;#&quot;&gt;&lt;/a&gt;&lt;span class=&quot;header-link octicon octicon-link&quot;&gt;&lt;/span&gt;1.6. 今日总结&lt;/h2&gt;&lt;p&gt;&lt;img src=&quot;https://www.liuhuadong.cc/imgs-all/07-10JS/03jQuery/images1/总结.png&quot; alt=&quot;总结&quot;&gt;&lt;/p&gt;
</description><pubDate>Tue, 28 Apr 2020 01:57:58 +0800</pubDate></item></channel></rss><!--18.92 ms , 6 query , 2189kb memory , 0 error-->