编程回忆录 - 大杂烩-2 (JS + ajax前后端交互) 上篇

265 阅读1分钟

面试经常遇到的笔试题:

循环:

九九乘法表 - for 循环

for循环思路:通常开始就会声明变量,来接收整个循环拿到的那个结果,再将其打印。

    <!-- 九九乘法表: -->
    <!-- 实现思路:
	1:打印结果:用一个空字符串,接收打印拼接后的结果
	2:打印9行:外层循环从1开始至9停止,可以打印1-9
	3:拼接显示公式:内层内层循环小于外层循环的i值,
	4:加上\n换行符,形成递减阶梯式
	5:在控制台打印拼接后的结果 -->

    <script>
      var str = '';
      for (var i = 1; i <= 9; i++) {
        for (var j = 1; j <= i; j++) {  //牢记第二句话,j <= i
          str += j + 'x' + i + '=' + j * i + '\t';  // 先j后i,然后拿到两者相乘的结果,+\t制表符号
        }
        str += '\n';  //外层循环 \n 换行符
      }
      console.log(str);
      
1x1=1	
1x2=2	2x2=4	
1x3=3	2x3=6	3x3=9	
1x4=4	2x4=8	3x4=12	4x4=16	
1x5=5	2x5=10	3x5=15	4x5=20	5x5=25	
1x6=6	2x6=12	3x6=18	4x6=24	5x6=30	6x6=36	
1x7=7	2x7=14	3x7=21	4x7=28	5x7=35	6x7=42	7x7=49	
1x8=8	2x8=16	3x8=24	4x8=32	5x8=40	6x8=48	7x8=56	8x8=64	
1x9=9	2x9=18	3x9=27	4x9=36	5x9=45	6x9=54	7x9=63	8x9=72	9x9=81	

while 循环语句练习

while循环思想总结: 通常初始值是在一开始的时候就创建了,一般用i表示,代表初始计数器。通常在循环体内对该i值累加,来实现循环驱动。在while进行语句的判断,只有条件不满足就会一直进入循环体,满足即退出。

      // 使用while 打印1 - 100
      // 思路:
      // 1:创建变量接收累加的数值
      // 2:while (条件判断)满足条件即退出
      // 3:循环内让初始值累加,以触发while中的条件判断,循环体中打印1-100

      var i = 1;
      while (i <= 100) {
        console.log(i); // 注意 打印需要写在i++之前,写在后面会将101也打印出来,而i<=100,此时已经退出了,所以还显示了1-101.
        i++;
      }


      // 使用while打印 1-100之间的和
      // 思路:
      // 1:创建一个打印变量,初始值是0。 创建一个循环初始值i, 值是1,用来循环的起步
      // 2:使用while循环 i<= 100之间的条件判断
      // 3:循环体内,将打印变量sum与i值累加
      // 4:i++,是循环计数器,用来启动下一次循环
      // 5:循环体外拿到sum,将结果打印

      var sum = 0;
      var i = 1; // 1:起步
      while (i <= 100) { // 条件判断
        sum += i;
        i++; //2:累加
      }
      console.log(sum); //5050


      // 使用while询问我帅不帅?
      // 思路
      // 1:创建初始变量,去接收prompt弹出框的返回值
      // 2:在循环中对prompt的进行判断,判断值是否不符合判断,再次执行循环体的代码.
      // 3:循环体内的代码:再次用初始变量,再次接收新一轮弹出框的返回值.周而复始.在while循环中进行判断
      // 4:只有不满足条件时,执行到判断语句后,就会直接跳过循环,执行循环之外的打印输出语句.

      var msg = prompt('我帅不帅?');
      while (msg !== '帅') {
        msg = prompt('我帅不帅嘛?');
      }
      alert('其实你也挺帅!');

do while 循环语句练习

do while思路总结: do语句负责循环体输出,while语句用来条件判断。一般都会设置初始值用来累加驱动,或者判断。本质都是为了满足while中的判断条件,如果不满足一直触发do循环中的语句,满足则退出。

      // do while方式:打印1-100
      // 思路:
      // 1:创建变量,也就是初始值,用来驱动累加
      // 2:do语句中,启动变量初始值累加
      // 3:while 语句行中,依旧还是判断语句,不满足就一直 do while,满足即退出
      var i = 1;
      do {
        console.log(i);
        i++;
      } while (i <= 100);

      // do while 方式打印 1-100的累加
      // 思路:
      // 1:创建变量用来求和, 创建变量用来驱动累加
      // 2:do 语句中负责累加,和求和.
      // 3:while语句中依旧用来判断,是否满足条件
      var i = 1;
      var sum = 0;
      do {
        sum += i;
        i++;
      } while (i <= 100);

      console.log(sum); // 5050

      // 使用do while 询问,我帅不帅?
      // 思路:
      // 1:用msg接收prompt的返回值
      // 2:在do语句中进行循环体,循环再次将新的prompt结果,赋值到msg上。
      // 3:while语句中进行判断,判断msg是否和判断的值一致,不满足一直循环,直至满足为止

      var msg = prompt('我帅不帅?');
      do {
        msg = prompt('说我很帅!');
      } while (msg !== '帅');

      alert('谢谢你的夸,你也很帅!');

continue 跳出本次,继续下一次

      // continue 跳出本次,继续下一次循环
      // 假设吃包子,吃到第4个有蟑螂,将第4个扔掉,继续吃完第5个
      // 思路:
      // 循环1-5, 在判断中,如果满足条件,这输出判断语句。使用continue跳出本次,继续循环下一次。

      for (var i = 1; i <= 5; i++) {
        if (i == 4) {
          continue;
        }
        console.log('我正在在吃第' + i + '个包子');
      }

      // 我正在在吃第1个包子
      // 我正在在吃第2个包子
      // 我正在在吃第3个包子
      // 我正在在吃第5个包子

break 打断代码的后续执行

      // break 打断代码的后续执行
      // 吃包子,如果第3个有虫子,没心情吃了,将后面的包子,都给扔到垃圾桶了。
      for (var i = 1; i <= 5; i++) {
        if (i == 3) {
          break;
        }
        console.log('我正在吃第' + i + '个包子');
      }

      // 我正在吃第1个包子
      // 我正在吃第2个包子

数组

数组相关操作练习

// A: 求数组的和以及数组平均值
      // 思路
      // 1: 定义一个数组,创建一个sum变量求和,以及average平均值,起始值都是0, 因为数组的下标也是0
      // 2: 循环数组的长度,在循环体中用sum累加数组中索引的每一项,得到了数组每项相加的和。
      // 3: 使用和 / 数组的长度, 得到的就是average平均值

      var arr = [1, 2, 3, 4, 5];
      var sum = 0;
      var average = 0;
      for (var i = 0; i < arr.length; i++) {
        sum += arr[i];
      }
      average = sum / arr.length;
      console.log(sum + '=====' + average); // 15=====3

      // B:求数组中最大的值
      // 思路
      // 1: 定义一个数组, 假设数组中的第一项就是最大的.
      // 2: 循环数组,在循环体内,判断循环出的数组中每项,是否大于第一项.进行比对
      // 3: 比对后留下的就是最大的,将最大的值,赋值给max,并打印查看

      var arr = [3, 7, 9, 34, 6, 22, 14, 7, 25];
      var max = arr[0];
      for (var i = 0; i < arr.length; i++) {
        if (arr[i] > max) {
          max = arr[i];
        }
      }
      console.log('数组中最大的值是: ' + max); // 数组中最大的值是: 34

      // C: 给空数组中,存放10个值
      // 思路:
      // 1: 以字面量方式创建一个空数组
      // 2:开启for循环,从0开始,循环体内让每一次的i+1, 将+1的结果赋值给arr[i], 实现数组的赋值操作。

      var arr = [];
      for (var i = 0; i <= 10; i++) {
        arr[i] = i + 1; // 数组中的每一项就是,变量i值的累加, arr[i]相当于arr[0]开始, i+1相当于0+1,所以数组arr[0]就是1.
      }
      console.log(arr); // Array(11) [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, … ]

      // D: 筛选数组,将大于10的筛选出来(使用arr.length代替arr[i])
      // 思路:
      // 1:创建一个数组, 和一个字面量方式的空数组变量,用来存储新数组,
      // 2:循环数组的长度, 循环体内判断数组中的每项是否大于10, 将大于的存进刚才的空数组变量中。再打印查看
      var arr = [3, 6, 13, 22, 4, 7, 19, 34, 56, 8, 66];
      var newArr = [];
      for (var i = 0; i < arr.length; i++) {
        if (arr[i] > 10) {
          newArr[newArr.length] = arr[i];
        }
      }
      console.log(newArr); // Array(6) [ 13, 22, 19, 34, 56, 66 ]

      // E: 数组去重, 将数组中的8全部都去掉
      // 思路:
      // 1:创建一个数组和一个空数组。
      // 2:循环数组,循环体内判断循环出来的每一项,不能等于8.将不等于8的数组,放进空数组,形参一个新的数组
      var arr = [1, 5, 8, 6, 99, 3, 8, 14, 56, 8, 23, 6];
      var newArr = [];
      for (var i = 0; i < arr.length; i++) {
        if (arr[i] != 8) {
          // 将不等于8的数字,放进新数组中
          newArr[newArr.length] = arr[i];
        }
      }
      console.log(newArr); // Array(9) [ 1, 5, 6, 99, 3, 14, 56, 23, 6 ]

      //F: 翻转数组
      // 思路
      // 1:新建1个数组,数中中的每一项都是字符串, 和新建一个空数组
      // 2:循环数组的长度-1, 因为数组是从索引0开始的,所有需要-1,减至>= 0, i--递减
      // 3:因为循环语句是倒序的方式,循环之后的结果是可以直接用newArr[newArr.length]来接收该数组的。

      var arr = ['apple', 'banana', 'orange', 'deeppink'];
      var newArr = [];
      for (var i = arr.length - 1; i >= 0; i--) {
        // 该语句是重点, 倒序必须先从数组的最后一项,i--方式,遍历至数组的第一项也就是arr[0]
        newArr[newArr.length] = arr[i];
      }
      console.log(newArr); // Array(4) [ "deeppink", "orange", "banana", "apple" ]

      // G: 数组冒泡排序
      // 思路:
      // 1:创建一个数组
      // 2: 循环数组,从0开始,循环到数组的最后一项,外层循环是为了将数组循环完毕
      // 3:开启二次循环,也是从0开始,每一次循环的值小于数组的长度-i-1, 然后j++
      // 4:判断循环数组的j 是否小于数组的j+1,也就是下一个数组
      // 5:使用temp变量接收数组中的每一项。
      // 6:交换变量,将每一次的下一项大的值,赋值给arr[j]
      // 7:最后最后将arr[j+1]赋值给临时变量
      var arr = [3, 7, 99, 43, 56, 32, 7, 9];
      for (var i = 0; i <= arr.length - 1; i++) {
        // 记住是<=,且是length-1
        for (var j = 0; j <= arr.length - i - 1; j++) {
          //记住是<= length -i -1
          if (arr[j] < arr[j + 1]) {
            // 记住:每一次交换的值arr[j]都小于,下一个要交换的值。
            var temp = arr[j]; // 将交换的小值,赋值给临时变量 temp = 小
            arr[j] = arr[j + 1]; //  将下一个大值给arr[j],就是进行数组交换,交换后的结果就是排序
            arr[j + 1] = temp; // 将小值赋值给arr[j+1]实现排序功能
          }
        }
      }
      console.log(arr); // Array(8) [ 99, 56, 43, 32, 9, 7, 7, 3 ]

数组思路总结: 数组相关的操作还挺多的,重点是记住数组的遍历方式,和赋值方式。忘记了就回来看代码!

函数 function

函数相关练习

      //  函数相关练习  function

      // A: 使用函数声明式,计算1-100之间的和
      // 思路:
      // 1:声明式函数 getSum(), 在函数中其实就是将之前for循环的代码进行了封装,
      // 2:只有在调取该函数的时候,才会输出函数的结果

      function getSum() {
        var sum = 0;
        for (var i = 1; i <= 100; i++) {
          sum += i;
        }
        console.log(sum);
      }
      getSum(); // 5050

      // B: 利用函数求任意 2个数的和
      // 思路:
      // 1: 其实本质还是和for循环一样的, 只是函数接收了2个形参,形参最终在调用该函数的时候被实参替换
      // 2: 就实现了循环的时候,从形参1开始, 结束的时候是在形参2结束. 这样就能计算2个数之间的和啦!

      function getSum(start, end) {
        var sum = 0;
        for (var i = start; i <= end; i++) {
          sum += i;
        }
        console.log(sum);
      }

      getSum(1, 5); // 1+2+3+4+5 = 15

      // C: 求数组中最大的值
      // 思路
      // 1:假设数组中的第一个值是最大的, 循环数组,从1开始,循环之数组的最后一项,
      // 2:判断,如果数组中的每一项都大于第一项, 就像max等于找到的那一项。就是最大值。
      // 3:在调用函数的时候,传递一个数组,因为形参是arr字面意思。将函数的返回结果交给变量,并打印。

      function getMax(arr) {
        var max = arr[0];
        for (var i = 1; i <= arr.length; i++) {
          if (arr[i] > max) {
            max = arr[i];
          }
        }
        return max; // 注意函数的返回结果,必须使用return返回出去
      }
      var res = getMax([1, 4, 7, 9, 12, 3, 7, 3, 6, 5]);
      console.log(res); //这样才能拿到函数的返回结果。
      
       // A: 函数版求数组中最大值
      // arguments类似数组对象,但是不是数组。
      // 思路:
      // 1: 函数中将数组赋值给arguments这个对象,
      // 2:假设数组中的第一个值是最大值。循环数组,判断数组中的每一项是否大于第一项,将最大的那项直接赋值给max
      // 3:函数必须有返回结果,通过return返回, 否则调用函数返回的结果是undefined。
      function getMax() {
        arguments = [1, 2, 3, 6, 5, 2];
        var max = arguments[0];
        for (var i = 0; i < arguments.length; i++) {
          if (arguments[i] > max) {
            max = arguments[i];
          }
        }
        return max;
      }
      var res = getMax();
      console.log(res); // 6

      // B:利用函数翻转数组
      // 思路:
      // 1: 函数的形参是arr,注意循环语句的写法, 从数组的最后一项开始, 遍历至数组的第一项, 然后递减
      // 2:新数组中的数组长度就是,倒序遍历到的每一项。
      // 3:函数的结果,必须使用return返回。

      function reverse(arr) {
        var newArr = [];
        for (var i = arr.length - 1; i >= 0; i--) { //书籍该语句: 必须是等于最后1条,然后>=0, 且递减。
          newArr[newArr.length] = arr[i];
        }
        return newArr;
      }
      var res = reverse([1, 3, 7, 8]);
      console.log(res); // 8 7 3 1

      // C:函数版冒泡排序
      // 思路:
      // 1:函数的形参接收一个数组, 外层循环管趟数,从0开始到最后一项
      // 2:内层循环管冒泡替换, 熟记也是从0开始到最后一项,必须-i-1,
      // 3:开始使用变量交换数组。这个公式需要熟记

      function sort(arr) {
        for (var i = 0; i < arr.length - 1; i++) {
          for (var j = 0; j < arr.length - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
              var temp = arr[j];
              arr[j] = arr[j + 1];
              arr[j + 1] = temp;
            } //冒泡的过程非常有趣,但是该过程需要熟记于心
          }
        }
        return arr;
      }
      var res = sort([1, 5, 9, 6, 2, 4, 7, 3, 5]);
      console.log(res); //Array(9) [ 1, 2, 3, 4, 5, 5, 6, 7, 9 ]

      // D:判断闰年
      // 思路:
      // 1:函数的形参接收的是一个年份, 假设返回值是false
      // 2:判断%4==0 %% year % 100 !== 0 || %400 ==0,说人话就是取余4或者400都是0, 并且不能被100整除
      // 3:如果符合条件,就将布尔值改为true,表示是如年
      // 4:如果不满足条件,则不会进去判断语句中,则会执行语句后面的代码,直接返回false
      // 核心点就是判断语句中对闰年的算法

      function isRun(year) {
        var flag = false;
        if ((year % 4 == 0 && year % 100 !== 0) || year % 400 == 0) {
          flag = true;
        }
        return flag;
      }
      console.log(isRun(2000)); // true
      console.log(isRun(1999)); // false
      
      
         //  函数是可以相互调用的
			// 在fn1中调用fn2,注意fn1,需要自己全局调用才会触发fn1函数。从而在函数中调用fn2.
      function fn1() {
        console.log(11);
        fn2();
      }
      fn1();

      console.log('=================');

      function fn2() {
        console.log(22);
      }

函数声明思路总结:函数的本质就是对一段代码进行封装,通常我们操作的是形参, 但实际是调用函数的时候,用实参替换了形参。而达到一条代码,多次调用和传参,拿到不同结果。

数组和字符串相关练习

 //  A: 猜数字游戏
      // 思路:
      // 1:封装getRandom函数,接收2个形参,min和max。
      // 2:返回向下取整的数组,调用Math.random, 生成随机数字
      // 3:调用函数,传入实参,将函数的调用赋值给变量
      // 4:使用while循环,假设是true。用num接收弹出框的返回结果,
      // 5:通过 else if 判断用户输入的数字和随机数是否一致。大了提示猜大了。小了提示猜小了。
      // 6:最后一种情况,就是猜对的情况,就弹出提示,用户猜对了。使用break打断程序的执行

      function getRandom(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
      }
      var random = getRandom(1, 5);
      while (true) {
        var num = prompt('请输入一个数字');
        if (num > random) {
          alert('您, 猜大了');
        } else if (num < random) {
          alert('您,猜小了');
        } else {
          alert('太棒了, 您猜对了!');
          break;
        }
      }

      // B: 倒计时效果
      // 思路:
      // 1:封装函数,接收一个标准的时间日期格式。
      // 2:获取到时间的总毫秒,和传入实参的用户毫秒数, 用用户的时间-现在的时间,就是2者相差的时间
      // 3:算法格式: 天: /60/60/24, 时/60/60%24, 分/60%60, 秒%60,通过三目运算,给转换的数字补0
      // 4:将计算出的数字拼接字符串返回给该函数,调用该函数,并打印函数的结果
      function countTime(time) {
        var nowDate = +new Date();
        var iptDate = +new Date(time);
        var timer = (iptDate - nowDate) / 1000;
        var day = parseInt(timer / 60 / 60 / 24);
        day = day < 10 ? '0' + day : day;
        var hour = parseInt((timer / 60 / 60) % 24);
        hour = hour < 10 ? '0' + hour : hour;
        var minute = parseInt((timer / 60) % 60);
        minute = minute < 10 ? '0' + minute : minute;
        var second = parseInt(timer % 60);
        second = second < 10 ? '0' + second : second;

        return day + '天' + hour + '时' + minute + '分' + second + '秒';
      }
      var date = countTime('2021-5-1 18:00:00'); // 今天是2021-4-18号,返回的结果是:13天05时12分31秒
      console.log(date);

      // C: 数组的添加删除方法
      // push往数组中的末尾追加项,可以是数字或者字符串,自动生成索引
      var arr = [1, 2, 3];
      arr.push(5, 'hello');
      console.log(arr); // Array(5) [ 1, 2, 3, 5, "hello" ]

      // unshift 在头部插入数据项
      arr.unshift('red');
      console.log(arr); //  Array(4) [ "red", 1, 2, 3 ]

      // pop 删除数组的最后一项
      arr.pop();
      console.log(arr); // Array [ 1, 2 ]

      // shift 从头部删除一项
      arr.shift();
      console.log(arr); // Array [ 2, 3 ]

      // D: 筛选数组
      // 将大于2000的数值,放入到一个新的数组
      // 思路:
      // 循环中,判断数组中的每一项是否大于2000, 将大于2000的使用push存进一个新的数组
      var arr = [1000, 1300, 2000, 2200, 3000, 4000];
      var newArr = [];
      for (var i = 0; i < arr.length; i++) {
        if (arr[i] > 2000) {
          newArr.push(arr[i]);
        }
      }
      console.log(newArr); // Array(3) [ 2200, 3000, 4000 ]

      // E: 使用数组内置方法, 快速进行排序和翻转数组
      // 1: reverse() 翻转数组
      // 2: sort() 排序,支持升序降序

      var arr1 = ['red', 'yellow', 'green'];
      console.log(arr1.reverse()); // Array(3) [ "green", "yellow", "red" ]

      var arr2 = [1, 4, 6, 9, 5, 2, 3];
      arr2.sort(function (a, b) {
        // return a - b; // Array(7) [ 1, 2, 3, 4, 5, 6, 9 ]升序
        return b - a; //  Array(7) [ 9, 6, 5, 4, 3, 2, 1 ] 降序
      });
      console.log(arr2); // 注意sort是一个函数, 接收2个参数, 可以将函数的结果返回给数组。

      // F: 获取数组的索引
      // indexOf 根据数组中项的内容,找出对应的索引号, 从前往后找
      // lastIndexOf  根据数组中项的内容,找出对应的索引号, 从后往前找
      var arr = [' red', 'blue', 'yellow', 'pink'];
      console.log(arr.indexOf('blue')); // 1
      console.log(arr.lastIndexOf('yellow')); // 2

      // G: 数组去重
      // 思路:
      // 封装函数,形参arr接收一个数组,新建一个空数组,遍历数组, 判断数组中的每一项是否已经存在,-1表示不重复
      // 将不重复的装进一个新的数组,使用到了刚才新学的2个API,indexOf和push
      function unique(arr) {
        var newArr = [];
        for (var i = 0; i < arr.length; i++) {
          if (newArr.indexOf(arr[i]) === -1) {
            // 核心点判断是否已经存在该项了,存在就是1也就是true, -1表示false不存在,就添加到空数组中
            newArr.push(arr[i]);
          }
        }
        return newArr;
      }
      var res = unique([1, 2, 3, 5, 7, 7, 9, 6, 5, 2, 7, 8, 5, 3]);
      console.log(res); // Array(8) [ 1, 2, 3, 5, 7, 9, 6, 8 ]

      // H: 数组转换为字符串
      // 思路:利用数组的toString方法将number转换为string
      // 利用join分隔符号也可以起到同样的效果

      var arr = [1, 2, 3];
      console.log(arr.toString()); //1,2,3
      console.log(arr.join('-')); // 1-2-3

      // I: 根据字符串返回位置
      // 思路:indexOf,参数1是要查的字符串,返回该字符串的索引号。 参数2是从第几个索引开始往后查找
      var str = '沧海一声笑,独孤求败!';
      // console.log(str.indexOf('独')); // 6 , 包含了空格,空格也是一个索引项
      console.log(str.indexOf('笑', 2)); // 4, 从索引2开始往后查找, 但是表象是看不出来的

      // J: 字符串中的某个字符出现的次数
      // 思路:
      // 1:使用indexOf查找数组中指定的字符串,新建一个计数器变量,用来统计出现的次数
      // 2:使用while循环,判断o是否!== -1,1表示存在, -1表示不存在。 将已经存在的用sum累加
      // 3:因为indexOf只能查找到第一个, 必须让使用indexOf再次让o,index+1才能继续查找

      var str = 'ldsdsamdsmvdfvmodfv';
      var index = str.indexOf('d'); //找出第一个d出现的位置
      var num = 0;
      while (index !== -1) {
        // 假设有找到d,就让计数器累加,
        num++;
        index = str.indexOf('d', index + 1); //但是index不会累加,需要再次查找该字符串,让index+1.重新赋值给index。
      }
      console.log(num); // 5

      // K:字符串操作方法
      // concat 字符串拼接
      // var str = '这是一首优美的小小情歌';
      console.log(str.concat('very good')); // 这是一首优美的小情歌very good

      // substr 字符串截取,参数一:截取的索引位置, 参数二截取的个数。
      console.log(str.substr(3, 2)); // 首优

      // replace替换 能自动匹配字符串中的该字符,如果该字符串出现多次,只会替换第一个
      // 参数一: 要替换的字符串, 参数二:替换成什么内容
      console.log(str.replace('小', '大')); // 这是一首优美的大小情歌

      // split 能查找到字符串中该字符串,无论出现多次,都会统一被替换成,逗号分隔的每一项。返回的是一个数组,相当于被转换了。
      var str = '@yes@hello@women@test';
      var str = '这是%一首%优美%的旋律';
      console.log(str.split('%')); // Array(4) [ "这是", "一首", "优美", "的旋律" ]
      console.log(str.split('@')); // Array(5) [ "", "yes", "hello", "women", "test" ]

总结:数组和字符串内置了很多方法,让我们快速进行操作,数组Array常用有, 增删:push unshift pop shift,reverse翻转, sort支持函数式排序,indexOf根据数组的项,返回索引。toString将数组转换为字符串,join将数组中的分隔符号替换。

字符串String常用方法有: concat拼接, substr截取, replace替换, split用逗号分隔,返回的是数组。

原生js方式tab栏切换

<div class="tab_containr">
      <ul class="tabs">
        <li><a href="javascript:;">1</a></li>
        <li><a href="javascript:;">2</a></li>
        <li><a href="javascript:;">3</a></li>
      </ul>
      <div class="items">
        <div class="item" style="display: block">
          <span>我是新闻1</span>
        </div>
        <div class="item">
          <span>我是新闻2</span>
        </div>
        <div class="item">
          <span>我是新闻3</span>
        </div>
      </div>
    </div>
    
  var lis = document.getElementsByTagName('li');
      var items = document.getElementsByClassName('item');
      for (var i = 0; i < lis.length; i++) {
        // 循环绑定事件
        lis[i].setAttribute('index', i);
        // 创建索引,根据索引显示对应的新闻 内容
        lis[i].onclick = function () {
          var index = this.getAttribute('index');
          for (var i = 0; i < items.length; i++) {
            items[i].style.display = 'none';
          }
          items[index].style.display = 'block';
        };
      }
      // 思路总结:循环tabs,给每一个tab创建index自定义属性,点击tab时,获取到index,
      // 循环将所有的item隐藏,让对应index的那个item显示出来

鼠标经过显示下拉菜单

    <ul class="news">
      新闻1
      <li><a href="">1</a></li>
      <li><a href="">2</a></li>
      <li><a href="">3</a></li>
    </ul>
    <ul class="news">
      新闻2
      <li><a href="">1</a></li>
      <li><a href="">2</a></li>
      <li><a href="">3</a></li>
    </ul>
    
    <script>
      var ul = document.querySelectorAll('ul');

       // 1:给ul绑定onmousemove事件,鼠标经过显示下拉列表
      for (var i = 0; i < ul.length; i++) {
        ul[i].onmousemove = function () {
          for (var i = 0; i < this.children.length; i++) {
            this.children[i].style.display = 'block';
          }
        };
        // 2:鼠标离开,隐藏下拉列表
        ul[i].onmouseout = function () {
          for (var i = 0; i < this.children.length; i++) {
            this.children[i].style.display = 'none';
          }
        };
      }
    </script>

发布留言案例

  <body>
    <textarea name="" id=""></textarea>
    <button>发布</button>
    <ul></ul>
    <script>
      // 发布留言事件
      // 点击时,判断输入中是否输入内容,弹出对应提示。return 阻止程序的向下执行
      // 反之有输入内容,创建li,设置li的文本内容就是输入框输入的内容,
      // 将li插入到ul中的第一个子元素的位置
      var btn = document.querySelector('button');
      var ipt = document.querySelector('textarea');
      var ul = document.querySelector('ul');

      btn.onclick = function () {
        if (ipt.value === '') {
          alert('请输入内容');
        } else {
          var li = document.createElement('li');
          li.innerHTML = ipt.value;
          ul.appendChild(li, ul.children[0]);
          ipt.value = '';
        }
      };
    </script>
  </body>

跟随鼠标的圆圈

    <style>
      .box {
        width: 50px;
        height: 50px;
        border: 1px solid red;
        border-radius: 50%;
        text-align: center;
        line-height: 50px;
        position: absolute; // 非加不可的一句话,必须先绝对漂浮,才能移动
      }
    </style>
    
  <body>
    <div class="box">123</div>
    <script>
      var box = document.querySelector('.box');
      // 1:监听页面的滚动事件,而不是box的移动事件
      // 2:获取鼠标在页面的位置
      // 3:将鼠标的位置赋值给盒子实现移动
      document.addEventListener('mousemove', function (e) {
        // console.log(123);
        var x = e.pageX;
        var y = e.pageY;
        box.style.left = x - 25 + 'px';
        box.style.top = y - 25 + 'px';
      });
    </script>
  </body>

输入框联动查询快递

 <body>
    <div class="search">
      <div class="con">123</div>
      <input type="text" placeholder="请输入您的快递单号" class="jd" />
    </div>
    <script>
      // 1: 输入框键盘弹起时,并且输入框中有内容,就显示提示框,提示框中的文字必须同步
      var ipt = document.querySelector('input');
      var tip = document.querySelector('.con');
      ipt.addEventListener('keyup', function () {
        // console.log(123);
        if (ipt.value === '') {
          tip.style.display = ' none';
        } else {
          tip.innerHTML = ipt.value;
          tip.style.display = 'block';
        }
      });
      // 2:如果失去焦点就隐藏输入框,反之获取焦点就显示提示框
      ipt.addEventListener('focus', function () {
        if (ipt.value !== '') {
          tip.style.display = 'block';
        }
      });
      ipt.addEventListener('blur', function () {
        tip.style.display = 'none';
      });
    </script>
  </body>

3秒消失广告

  <body>
    <div class="box">我是广告</div>
    <script>
      var box = document.querySelector('.box');
      window.setTimeout(function () {
        box.style.display = 'none';
      }, 3000);
    </script>
  </body>

倒计时效果

  <body>
    <h3>距离51假期倒计时还有:</h3>
    <div class="day"></div>
    <div class="hour"></div>
    <div class="minute"></div>
    <div class="second"></div>

    <script>
      // 1:获取元素
      var day = document.querySelector('.day');
      var hour = document.querySelector('.hour');
      var minute = document.querySelector('.minute');
      var second = document.querySelector('.second');

      // 2:封装补0函数,使用三目运算符进行补零
      function zero(num) {
        return num < 10 ? '0' + num : num;
      }

      // 3:使用setInterval调用函数,1秒刷新一次页面文字
      setInterval(countTime, 1000);

      // 4:封装函数,计算日期, 将计算的结果有补0后,显示在盒子中。实现倒计时效果
      function countTime() {
        var target = +new Date('2021-5-1 18:00:00');
        var nowTime = +new Date();
        var time = (target - nowTime) / 1000;

        var d = parseInt(time / 60 / 60 / 24);
        d = zero(d);
        day.innerHTML = d + '天';

        var h = parseInt((time / 60 / 60) % 24);
        h = zero(h);
        hour.innerHTML = h + '时';

        var m = parseInt((time / 60) % 60);
        m = zero(m);
        minute.innerHTML = m + '分';

        var s = parseInt(time % 60);
        s = zero(s);
        second.innerHTML = s + '秒';
      }
    </script>
  </body>

短信倒计时

    手机号码: <input type="number" /> <button>发送</button>
    <script>
      // 设置默认倒计时是3秒,点击按钮就禁用按钮,开启定时器,1秒倒计时一次,
      // 判断如为0就恢复按钮,并修改文字。反之拼接按钮的文字让倒计时自减
      var btn = document.querySelector('button');
      btn.addEventListener('click', function () {
        var time = 3;
        var timer = setInterval(function () {
          if (time === 0) {
            btn.disabled = false;
            btn.innerHTML = '发送';
          } else {
            btn.innerHTML = '倒计时' + time + '秒';
            time--;
          }
        }, 1000);
      });
    </script>

拖动模态框

  <body>
    <div class="login-header">
      <a id="link" href="javascript:;">点击,弹出登录框</a>
    </div>
    <div id="login" class="login">
      <div id="title" class="login-title">
        登录会员
        <span
          ><a id="closeBtn" href="javascript:void(0);" class="close-login"
            >关闭</a
          ></span
        >
      </div>
      <div class="login-input-content">
        <div class="login-input">
          <label>用户名:</label>
          <input
            type="text"
            placeholder="请输入用户名"
            name="info[username]"
            id="username"
            class="list-input"
          />
        </div>
        <div class="login-input">
          <label>登录密码:</label>
          <input
            type="password"
            placeholder="请输入登录密码"
            name="info[password]"
            id="password"
            class="list-input"
          />
        </div>
      </div>
      <div id="loginBtn" class="login-button">
        <a href="javascript:void(0);" id="login-button-submit">登录会员</a>
      </div>
    </div>
    <!-- 遮盖层 -->
    <div id="bg" class="login-bg"></div>
    
    <script>
      var link = document.querySelector('#link');
      var login = document.querySelector('#login');
      var mask = document.querySelector('#bg');
      var close = document.querySelector('#closeBtn');
      var title = document.querySelector('#title');
      // 1:点击弹出登录框
      link.addEventListener('click', function () {
        login.style.display = 'block';
        mask.style.display = 'block';
      });
      // 2: 点击关闭弹出框
      close.addEventListener('click', function () {
        login.style.display = 'none';
        mask.style.display = 'none';
      });
      // 3: 监听mousedown事件,获取鼠标的位置-盒子的位置.监听页面mousemove拖动事件,将它指向封装好的move事件
      title.addEventListener('mousedown', function (e) {
        var x = e.pageX - login.offsetLeft;
        var y = e.pageY - login.offsetTop;
        document.addEventListener('mousemove', move);
        function move(e) {
          login.style.left = e.pageX - x + 'px';
          login.style.top = e.pageY - y + 'px';
        }
        document.addEventListener('mouseup', function (e) {
          document.removeEventListener('mousemove', move);
        });
      });
      // 修改盒子的坐标,用页面的位置-盒子的位置+px,实现盒子移动
      // 4: 监听文档mouseup松开事件,直接remove该mousemove指定的move函数即可
    </script>
  </body>

仿淘宝固定侧边栏

  <body>
    <div class="slider-bar">
      <span class="goBack">返回顶部</span>
    </div>
    <div class="header w">头部区域</div>
    <div class="banner w">banner区域</div>
    <div class="main w">主体部分</div>
    <script>
      // 1:获取到banner被卷去的offsetTop部分,
      // 2:再获取侧边栏距离顶部的位置,就是bannerTop-侧边栏的卷去的位置
      // 3:获取页面main距离顶部的位置
      var bannerTop = document.querySelector('.banner').offsetTop;
      var sliderTop =
        document.querySelector('.slider-bar').offsetTop - bannerTop;
      var mainTop = document.querySelector('.main').offsetTop;
      var slider = document.querySelector('.slider-bar');
      var goBack = document.querySelector('.goBack');
      // 4:监听scroll滚动事件,如果window的pageYoffset页面卷去的-bannerTop,超出了banner的位置,就固定侧边栏,并设置好侧边栏的位置
      document.addEventListener('scroll', function () {
        if (window.pageYOffset >= bannerTop) {
          slider.style.position = 'fixed';
          slider.style.top = sliderTop + 'px';
          // 5:反之就是小于的情况,就设置侧边栏绝对定位,手动设置300px
        } else {
          slider.style.position = 'absolute';
          slider.style.top = '300px';
        }
        // 6:如果页面滚动大于mainTop就显示返回顶部的按钮,反之就隐藏按钮
        if (window.pageYOffset >= mainTop) {
          goBack.style.display = 'block';
        } else {
          goBack.style.display = 'none';
        }
      });
    </script>
  </body>

动画封装和调用

  <body>
    <button>点击夏雨荷才走</button>
    <div></div>
    <span>夏雨荷</span>
    <script>
      // 1:封装动画函数,参数1元素,参数2目标位置,先清除定时器,保证定时器唯一性
      function animate(obj, target) {
        clearInterval(obj.timer);
        // 2:给参数1绑定timer,指向一个定时器,间隔时间30毫秒,如果元素偏移的位置已经到达目标位置,清除定时器
        obj.timer = setInterval(function () {
          if (obj.offsetLeft >= target) {
            clearInterval(obj.timer);
          } else {
            // 3:判断之外让元素每次偏移1像素
            obj.style.left = obj.offsetLeft + 1 + 'px';
          }
        }, 30);
      }
      // 4:调用刚才封装的animate函数,指定元素和目标位置
      var div = document.querySelector('div');
      animate(div, 300);
      // 5:点击事件,调用动画函数,让span走到目标位置
      var span = document.querySelector('span');
      var btn = document.querySelector('button');
      btn.addEventListener('click', function () {
        animate(span, 300);
      });
    </script>
  </body>

仿京东商品放大镜

  <body>
    <!-- 产品介绍模块 -->
    <div class="product_intro clearfix">
      <!-- 预览区域 -->
      <div class="preview_wrap fl">
        <div class="preview_img">
          <img src="../Desktop/s3.png" alt="" />
          <div class="mask"></div>
          <div class="big">
            <img src="../Desktop/big.jpg" alt="" class="bigImg" />
          </div>
        </div>
      </div>
    </div>
    <script>
      // 显示与隐藏mask和背景图
      // 1:监听window的load事件,等待页面元素加载完毕,
      // 2:监听preview_img的mouseover和nouseout事件,显示与隐藏mask和big
      var preview_img = document.querySelector('.preview_img');
      var mask = document.querySelector('.mask');
      var big = document.querySelector('.big');
      window.addEventListener('load', function () {
        preview_img.addEventListener('mouseover', function () {
          mask.style.display = 'block';
          big.style.display = 'block';
        });
        preview_img.addEventListener('mouseout', function () {
          mask.style.display = 'none';
          big.style.display = 'none';
        });
      });

      // mask移动起来
      // 3:监听preview_img的mousemove事件,通过鼠标位置-自己盒子的位置,获取到xy值
      preview_img.addEventListener('mousemove', function (e) {
        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;
        // 3.1:用获取到x-mask的宽高/2,就是maskX的坐标,
        var maskX = x - mask.offsetWidth / 2;
        var maskY = y - mask.offsetHeight / 2;
        // 3.2:用盒子的宽度-mask的宽度,就是maskMax最大移动距离
        maskMax = this.offsetWidth - mask.offsetWidth;
        // 3.3:判断maskX<=0,mask就等于0,第二种判断maskX>=maskMax,就让mask等于maskMax, y轴同理
        if (maskX <= 0) {
          maskX = 0;
        } else if (maskX >= maskMax) {
          maskX = maskMax;
        }
        if (maskY <= 0) {
          maskY = 0;
        } else if (maskY >= maskMax) {
          maskY = maskMax;
        }
        // 3.4:让遮盖层移动起来,就是maskX+px,
        mask.style.left = maskX + 'px';
        mask.style.top = maskY + 'px';

        // 背景图片开始移动
        // 4:开始移动背景图片:获取背景图片元素,用背景图片-背景盒子获取到背景图片最大移动距离bigMax
        var bigImg = document.querySelector('.bigImg');
        var bigMax = bigImg.offsetWidth - big.offsetWidth;
        // 4.1:用maskX * bigMax / maskMax,就获取到了大图片的xy值
        var bigX = (maskX * bigMax) / maskMax;
        var bigY = (maskY * bigMax) / maskMax;
        // 4.2: 让大图片移动起来,就是-bigX +px, 实现背景图的移动
        bigImg.style.left = -bigX + 'px';
        bigImg.style.top = -bigY + 'px';
      });
    </script>
  </body>

仿淘宝返回顶部

  <body>
    <div class="slider-bar">
      <span class="goBack">返回顶部</span>
    </div>
    <div class="header w">头部区域</div>
    <div class="banner w">banner区域</div>
    <div class="main w">主体部分</div>
    <script>
      // 获取元素距离页面顶部的距离:
      // 1:获取banner距离页面的距离,
      var sliderBar = document.querySelector('.slider-bar');
      var goBack = document.querySelector('.goBack');
      var bannerTop = document.querySelector('.banner').offsetTop;
      // 2:用sliderTop-bannerTop获取到侧边栏距离页面的距离
      var sliderTop =
        document.querySelector('.slider-bar').offsetTop - bannerTop;
      // 3:获取到mainTop到距离页面的距离,
      var mainTop = document.querySelector('.main').offsetTop;

      // 监听页面滚动事件,显示与隐藏返回顶部按钮:
      // 4:文档监听滚动事件,判断window.pageYOffset人工超出了bannerTop,就将sliderBar固定定位,并设置px位置
      document.addEventListener('scroll', function () {
        if (window.pageYOffset >= bannerTop) {
          sliderBar.style.position = 'fixed';
          sliderBar.style.top = sliderTop + 'px';
          // 5:反之绝对定位,设置位置300px
        } else {
          sliderBar.style.position = 'absolute';
          sliderBar.style.top = 300 + 'px';
        }
        // 6:如果页面超出mainTop,就显示返回按钮,反之就隐藏
        if (window.pageYOffset >= mainTop) {
          goBack.style.display = 'block';
        } else {
          goBack.style.display = 'none';
        }
      });

      // 点击goBack返回按钮,调用animate函数,参数1是window,参数2是位置为0.
      goBack.addEventListener('click', function () {
        animate(window, 0);
      });

      // 封装动画函数:
      // 参数1:元素,参数2:目标位置,callback回调函数
      function animate(obj, target, callback) {
        // 先清除定时器,保证页面只有一个定时器
        clearInterval(obj.timer);
        obj.timer = setInterval(function () {
          // 给obj设置定时器,用目标-window.pageYOffset/10得到step步进,
          var step = (target - window.pageYOffset) / 10;
          // 使用三目运算符,判断步进是否大于0,使用Math.ceil或者floor进行取整
          step = step >= 0 ? Math.ceil(step) : Math.floor(step);
          // 判断window是否已经到达target位置,先清除定时器,
          if (window.pageYOffset == target) {
            clearInterval(obj.timer);
          }
          // 使用短路运算符调用callback函数,window.scroll参数1:滚动到0,参数2:滚动的步进
          callback && callback();
          window.scroll(0, window.pageYOffset + step);
        }, 15);
      }
    </script>
  </body>

移动端拖动元素

  <body>
    <div></div>
    <script>
      // 1:新建变量,记录手指初始的位置,和盒子原来的位置
      var startX = 0;
      var startY = 0;
      var x = 0;
      var y = 0;
      var div = document.querySelector('div');
      // 2:监听盒子的touchstart事件,获取手指的初始坐标,以及盒子的位置
      div.addEventListener('touchstart', function (e) {
        startX = e.targetTouches[0].pageX;
        startY = e.targetTouches[0].pageY;
        x = this.offsetLeft;
        y = this.offsetTop;
      });
      // 3:监听盒子的touchmove事件,用移动的手指的位置-之前的位置,赋值给startX
      div.addEventListener('touchmove', function (e) {
        var moveX = e.targetTouches[0].pageX - startX;
        var moveY = e.targetTouches[0].pageY - startY;
        // 4: 让盒子开始移动,就是盒子的位置+移动的位置+px,实现移动。并阻止默认事件的触发。
        this.style.left = x + moveX + 'px';
        this.style.top = y + moveY + 'px';
        e.preventDefault();
      });
    </script>
  </body>

手写PC电商轮播图

  <body>
    <div class="main">
      <div class="focus fl">
        <!-- 左侧按钮 -->
        <a href="javascript:;" class="arrow-l"> &lt; </a>
        <!-- 右侧按钮 -->
        <a href="javascript:;" class="arrow-r"> &gt </a>
        <!-- 核心的滚动区域 -->
        <ul>
          <li>
            <a href="#"><img src="../Desktop/focus.jpg" alt="" /></a>
          </li>
          <li>
            <a href="#"><img src="../Desktop/focus1.jpg" alt="" /></a>
          </li>
          <li>
            <a href="#"><img src="../Desktop/focus2.jpg" alt="" /></a>
          </li>
          <li>
            <a href="#"><img src="../Desktop/focus3.jpg" alt="" /></a>
          </li>
        </ul>
        <!-- 小圆圈 -->
        <ol class="circle"></ol>
      </div>
    </div>
    <script>
      // animate.js
      // 1:封装animate函数,参数1:元素, 参数2:目标位置,参数3:回调函数
      function animate(obj, target, callback) {
        // 2:清除定时器,保证页面只有一个元素,
        clearInterval(obj.timer);
        obj.timer = setInterval(function () {
          // 3:创建定时器,用目标-盒子的坐标/10得到步进
          var step = (target - obj.offsetLeft) / 10;
          // 4:三目运算符:如果步进大于0,用ceil和floor进行取整
          step = step > 0 ? Math.ceil(step) : Math.floor(step);
          // 5:判断元素的位置是否已经到达了目标位置,清除定时器,有回调函数执行回调函数,
          if (obj.offsetLeft == target) {
            clearInterval(obj.timer);
            callback && callback();
          }
          // 6:让盒子的位置发生改变,就是元素的坐标+步进+px,实现盒子移动
          obj.style.left = obj.offsetLeft + step + 'px';
        }, 15);
      }

      // 手写PC轮播图
      // 0:监听load事件,等待页面元素加载完成,再加载js。
      window.addEventListener('load', function () {
        var focus = document.querySelector('.focus');
        var arrowL = document.querySelector('.arrow-l');
        var arrowR = document.querySelector('.arrow-r');
        var focusWidth = focus.clientWidth;
        // 显示与隐藏箭头
        // 1:监听focus的mouseenter和mouseleave事件,显示与隐藏左右按钮,清除和手动调用定时器以及click()函数,实现自动切换
        focus.addEventListener('mouseenter', function () {
          arrowL.style.display = 'block';
          arrowR.style.display = 'block';
          clearInterval(timer);
        });
        focus.addEventListener('mouseleave', function () {
          arrowL.style.display = 'none';
          arrowR.style.display = 'none';
          timer = setInterval(function () {
            arrowR.click();
          }, 1000);
        });

        // 动态创建li,并实现点击切换
        // 3:获取ul和ol,使用for循环ul的子元素长度,动态创建li并给li设置自定义索引index,i. 将创建的li添加到ol中,实现圆点的创建
        // 4:给每个圆点绑定单击事件,开启循环ol中的子长度,将ol中的子元素[i].className全部清除,让自己的类名等于current高亮
        // 5:获取到index变量,使用num接收index,以及circle接收index,达到同步效果,调用animate(ul,-index*focusWidth)切换图片
        var ul = document.querySelector('ul');
        var ol = document.querySelector('ol');
        for (var i = 0; i < ul.children.length; i++) {
          var li = document.createElement('li');
          li.setAttribute('index', i);
          ol.appendChild(li);
          li.addEventListener('click', function () {
            for (var i = 0; i < ol.children.length; i++) {
              ol.children[i].className = '';
            }
            this.className = 'current';
            var index = this.getAttribute('index');
            num = index;
            circle = index;
            animate(ul, -index * focusWidth);
          });
        }
        // 高亮第一个圆点,克隆第一张图片,创建num和circle用来同步,以及节流阀
        // 6:将ol中的第一个子元素的类名默认高亮,使用cloneNode(true)克隆ul中的第一张图片,将克隆的图片添加到ul中的最后
        // 7:创建num为0,circle为0,创建节流阀默认为true,
        ol.children[0].className = 'current';
        var firstImg = ul.children[0].cloneNode(true);
        ul.appendChild(firstImg);
        var num = 0;
        var circle = 0;
        var flag = true;

        // 右点击切换图片,以及圆点的同步
        // 8:右箭头点击事件,如果开启节流阀,首先关闭节流阀,如果num==ul子元素的倒数第二张,修改ul的盒子坐标为0,num=0也是第一个。
        // 9:调用animate函数让ul,以-num的*一张图片的宽度,回调函数中将节流阀再次开启
        // 10:让circle++,如果圆点是最后一张,将circle修改为0,调用封装好的circleChange函数清除圆点的高亮
        arrowR.addEventListener('click', function () {
          if (flag) {
            flag = false;
            if (num == ul.children.length - 1) {
              ul.style.left = 0;
              num = 0;
            }
            num++;
            animate(ul, -num * focusWidth, function () {
              flag = true;
            });
            circle++;
            console.log(circle);
            if (circle == ol.children.length) {
              circle = 0;
            }
            circleChange();
          }
        });

        // 左点击切换图片,以及圆点的同步
        // 11:左点击事件,如果开启了节流阀,先关闭节流阀,如果num是0,将num修改为最后一张图片,并修改ul的坐标,使用-mun*盒子宽度+px1的方式切换一张图片。
        // 12:每次切换让num--,调用animate函数,让ul以-num方式切换,在回调函数中开启节流阀
        // 13:让circle--,如果是第一个圆点,手动赋值为最后一张图片的索引,并使用三目运算符对circle判断是不是<0,如果是就修改为最后一张,反之就是circle原本自己,调用circleChange函数清除元素的高亮。
        arrowL.addEventListener('click', function () {
          if (flag) {
            flag = false;
            if (num == 0) {
              num = ul.children.length;
              ul.style.left = -num * focusWidth + 'px';
            }
            num--;
            animate(ul, -num * focusWidth, function () {
              flag = true;
            });
            circle--;
            if (circle < 0) {
              circle = ol.children.length - 1;
            }
            circle = circle < 0 ? ol.children.length - 1 : circle;
            circleChange();
          }
        });

        // 封装圆点高亮函数,以及开启定时器完成切换图片。
        // 14:封装clicleChange函数,使用循环清除所有ol1的类名免除高亮,让ol中的子元素按照circle将自己的类名高亮
        // 15:创建局部定时器,2秒调用一次click()右点击事件,轮播图完毕。
        function circleChange() {
          for (var i = 0; i < ol.children.length; i++) {
            ol.children[i].className = '';
          }
          ol.children[circle].className = 'current';
        }

        var timer = setInterval(function () {
          arrowR.click();
        }, 1000);
      });
    </script>
  </body>

导航栏筋斗云

    <script>
      function animate(obj, target, callback) {
        // console.log(callback);  callback = function() {}  调用的时候 callback()

        // 先清除以前的定时器,只保留当前的一个定时器执行
        clearInterval(obj.timer);
        obj.timer = setInterval(function () {
          // 步长值写到定时器的里面
          // 把我们步长值改为整数 不要出现小数的问题
          // var step = Math.ceil((target - obj.offsetLeft) / 10);
          var step = (target - obj.offsetLeft) / 10;
          step = step > 0 ? Math.ceil(step) : Math.floor(step);
          if (obj.offsetLeft == target) {
            // 停止动画 本质是停止定时器
            clearInterval(obj.timer);
            // 回调函数写到定时器结束里面
            callback && callback();
          }
          // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10
          obj.style.left = obj.offsetLeft + step + 'px';
        }, 15);
      }

      // 1:监听页面元素加载完毕开始载入js文件,获取到所有li,和current默认初始位置为0
      // 2:循环lis,循环中让每一个li绑定mouseenter事件,调用animate让cloud云,移动到自己偏移的位置
      // 3:鼠标离开时,调用animate让云回到current默认初始位置
      // 4:点击导航菜单,让current接收当前的偏移位置,这样巧妙的将离开时的位置给固定住了。
      window.addEventListener('load', function () {
        var lis = document.querySelectorAll('li');
        var cloud = document.querySelector('.cloud');
        var current = 0;
        for (var i = 0; i < lis.length; i++) {
          lis[i].addEventListener('mouseenter', function () {
            animate(cloud, this.offsetLeft);
          });
          lis[i].addEventListener('mouseleave', function () {
            animate(cloud, current);
          });
          lis[i].addEventListener('click', function () {
            current = this.offsetLeft;
          });
        }
      });
    </script>
  </head>

  <body>
    <div id="c_nav" class="c-nav">
      <span class="cloud"></span>
      <ul>
        <li class="current"><a href="#">首页新闻</a></li>
        <li><a href="#">师资力量</a></li>
        <li><a href="#">活动策划</a></li>
        <li><a href="#">企业文化</a></li>
        <li><a href="#">招聘信息</a></li>
        <li><a href="#">公司简介</a></li>
        <li><a href="#">我是佩奇</a></li>
        <li><a href="#">啥是佩奇</a></li>
      </ul>
    </div>
  </body>

记住用户名

  <body>
    <input type="text" id="username" />
    <input type="checkbox" name="" id="remember" /> 记住用户名
    <script>
      // 1:页面刷新后:如果本地会话中有username,就将uname中的值,赋值为本地会话中的值,并将复选框默认勾选
      var uname = document.querySelector('#username');
      var checkBox = document.querySelector('#remember');
      if (localStorage.getItem('username')) {
        uname.value = localStorage.getItem('username');
        checkBox.checked = true;
      }

      // 2:复选框监听change事件,然后是勾选的就将uname的值设置到本地会话中,属性名为username,反之从本地会话中删除username属性
      checkBox.addEventListener('change', function () {
        if (this.checked) {
          localStorage.setItem('username', uname.value);
        } else {
          localStorage.removeItem('username');
        }
      });
    </script>
  </body>

jQuery


远程引用地址: <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js" ></script>

新浪下拉菜单

 <script>
      // 1:鼠标经过显示下拉菜单:$就相当于load等待页面元素加载是一致的,.nav>li鼠标经过,让它自己的子元素ul显示
      $(function () {
        $('.nav>li').mouseover(function () {
          $(this).children('ul').show();
        });
        // 2:鼠标离开隐藏下拉菜单:.nav>li鼠标离开让自己的子元素隐藏
        $('.nav>li').mouseout(function () {
          $(this).children('ul').hide();
        });
      });
    </script>

tab栏切换

    <div class="tab">
      <div class="tab_list">
        <ul>
          <li class="current">商品介绍</li>
          <li>规格与包装</li>
          <li>售后保障</li>
          <li>商品评价(50000)</li>
          <li>手机社区</li>
        </ul>
      </div>
      <div class="tab_con">
        <div class="item" style="display: block">商品介绍模块内容</div>
        <div class="item">规格与包装模块内容</div>
        <div class="item">售后保障模块内容</div>
        <div class="item">商品评价(50000)模块内容</div>
        <div class="item">手机社区模块内容</div>
      </div>
    </div>
    <script>
      //1:等待页面元素加载完毕,让tab_list中的里、添加点击事件,让它自己添加类样式current高亮,链式编程让自己的兄弟元素,移除类样式current
      $(function () {
        $('.tab_list li').click(function () {
          $(this).addClass('current').siblings('li').removeClass('current');
          // 2:获取到每一个li的index,让tab_con .item查找索引,根据这个索引显示,链式编程让自己的兄弟元素隐藏
          var index = $(this).index();
          $('.tab_con .item').eq(index).show().siblings().hide();
        });
      });
    </script>
  </body>

淘宝精品服饰案例

  <body>
    <div class="wrapper">
      <ul id="left">
        <li><a href="#">女靴</a></li>
        <li><a href="#">雪地靴</a></li>
        <li><a href="#">冬裙</a></li>
        <li><a href="#">呢大衣</a></li>
        <li><a href="#">毛衣</a></li>
        <li><a href="#">棉服</a></li>
        <li><a href="#">女裤</a></li>
        <li><a href="#">羽绒服</a></li>
        <li><a href="#">牛仔裤</a></li>
      </ul>
      <div id="content">
        <div>
          <a href="#"
            ><img src="../Desktop/女靴.jpg" width="200" height="250"
          /></a>
        </div>
        <div>
          <a href="#"
            ><img src="../Desktop/雪地靴.jpg" width="200" height="250"
          /></a>
        </div>
        <div>
          <a href="#"
            ><img src="../Desktop/冬裙.jpg" width="200" height="250"
          /></a>
        </div>
        <div>
          <a href="#"
            ><img src="../Desktop/呢大衣.jpg" width="200" height="250"
          /></a>
        </div>
        <div>
          <a href="#"
            ><img src="../Desktop/毛衣.jpg" width="200" height="250"
          /></a>
        </div>
        <div>
          <a href="#"
            ><img src="../Desktop/棉服.jpg" width="200" height="250"
          /></a>
        </div>
        <div>
          <a href="#"
            ><img src="../Desktop/女裤.jpg" width="200" height="250"
          /></a>
        </div>
        <div>
          <a href="#"
            ><img src="../Desktop/羽绒服.jpg" width="200" height="250"
          /></a>
        </div>
        <div>
          <a href="#"
            ><img src="../Desktop/牛仔裤.jpg" width="200" height="250"
          /></a>
        </div>
      </div>
    </div>
    
    <script>
      // 等待页面元素加载完毕,鼠标经过left 中的li,获取搭配index,让后content 中的div根据index显示,兄弟元素隐藏
      $(function () {
        $('#left li').mouseover(function () {
          var index = $(this).index();
          $('#content div').eq(index).show().siblings('div').hide();
        });
      });
    </script>
  </body>

京剧宫格高亮

  <body>
    <div class="wrap">
      <ul>
        <li>
          <a href="#"><img src="../Desktop/01.jpg" alt="" /></a>
        </li>
        <li>
          <a href="#"><img src="../Desktop/02.jpg" alt="" /></a>
        </li>
        <li>
          <a href="#"><img src="../Desktop/03.jpg" alt="" /></a>
        </li>
        <li>
          <a href="#"><img src="../Desktop/04.jpg" alt="" /></a>
        </li>
        <li>
          <a href="#"><img src="../Desktop/05.jpg" alt="" /></a>
        </li>
        <li>
          <a href="#"><img src="../Desktop/06.jpg" alt="" /></a>
        </li>
      </ul>
    </div>

    <script>
      // 鼠标经过让其他格子变暗:等待页面元素加载完毕,.wrap 里面的li,hover的时候,让自己的兄弟元素fadeTo(400, 0.5)变暗
      $(function () {
        $('.wrap li').hover(
          function () {
            $(this).siblings('li').stop().fadeTo(400, 0.5);
          },
     //鼠标离开让盒子恢复高亮: 链式编程的方式,开启另一个函数,让自己的兄弟元素,fadeTo(400, 1)变亮
          function () {
            $(this).siblings('li').stop().fadeTo(400, 1);
          }
        );
      });
    </script>
  </body>

王者荣耀手风琴案例

 <body>
    <script
      type="text/javascript"
      src="https://cdn.bootcss.com/jquery/3.2.1/jquery.js"
    ></script>

    <div class="king">
      <ul>
        <li class="current">
          <a href="#">
            <img src="../Desktop/images/m1.jpg" alt="" class="small" />
            <img src="../Desktop/images/m.png" alt="" class="big" />
          </a>
        </li>
        <li>
          <a href="#">
            <img src="../Desktop/images/l1.jpg" alt="" class="small" />
            <img src="../Desktop/images/l.png" alt="" class="big" />
          </a>
        </li>
        <li>
          <a href="#">
            <img src="../Desktop/images/c1.jpg" alt="" class="small" />
            <img src="../Desktop/images/c.png" alt="" class="big" />
          </a>
        </li>
        <li>
          <a href="#">
            <img src="../Desktop/images/w1.jpg" alt="" class="small" />
            <img src="../Desktop/images/w.png" alt="" class="big" />
          </a>
        </li>
        <li>
          <a href="#">
            <img src="../Desktop/images/z1.jpg" alt="" class="small" />
            <img src="../Desktop/images/z.png" alt="" class="big" />
          </a>
        </li>
        <li>
          <a href="#">
            <img src="../Desktop/images/h1.jpg" alt="" class="small" />
            <img src="../Desktop/images/h.png" alt="" class="big" />
          </a>
        </li>
        <li>
          <a href="#">
            <img src="../Desktop/images/t1.jpg" alt="" class="small" />
            <img src="../Desktop/images/t.png" alt="" class="big" />
          </a>
        </li>
      </ul>
    </div>

    <script type="text/javascript">
      $(function () {
        // 鼠标经过让自己盒子边框,将小图片隐藏,让自己的大图片显示:
        // 1:等待页面元素加载完毕,.king 里面的li鼠标经过让自己调用animate动画函数让自己宽度224
        // 2:使用find找到small,使用fadeOut让自己的兄弟元素.big元素fadeIn
        $(function () {
          $('.king li').mouseenter(function () {
            $(this)
              .stop()
              .animate({
                width: 224,
              })
              .find('.small')
              .stop()
              .fadeOut()
              .siblings('.big')
              .stop()
              .fadeIn();
              
            // 其余兄弟元素变窄,都显示小图片,淡出大图片
            // 3:让自己的兄弟元素li调用动画函数将宽度改为69,通过find找到small小图片淡入,大图片淡出
            $(this)
              .siblings('li')
              .stop()
              .animate({
                width: 69,
              })
              .find('.small')
              .stop()
              .fadeIn()
              .siblings('.big')
              .stop()
              .fadeOut();
          });
        });
      });
    </script>
  </body>

下一篇:编程回忆录 - 大杂烩-2 (JS + ajax前后端交互) 下篇