JavaScript-项目实战(优学网-ajax请求数据渲染页面+登录注册表单正则)

优学网项目简介

  • 优学网项目主要分为首页+登录注册页+视频播放页内容项目模仿网页
  • 使用html+css实现基本页面布局,完成ajax请求数据进行页面渲染以及表单正则验证的项目练习。
  • 项目源码链接

一、首页

(一) 、轮播图模块

在这里插入图片描述

1、图片轮播–定时器

  1. 通过ajax请求图片json数据, JSON.parse()将获取的数据转成js格式数据
  2. 获取每一张图片、每一个小圆点–for循环
  3. 初始化页面样式,将图片数据添加进 ul,将小圆点span加入p
  4. 设置lunBoUl的宽度=图片宽度*图片张数
  5. 轮播图–每隔一段时间切换图片,当到最后一张后返回第一张
//轮播图--每隔一段时间切换图片,当到最后一张后返回第一张
   var n = 0; //下标变量存储当前是第几张图片,第一张图片下标为0
   var timer = setInterval(function () {
    
    
   n++;
   //ul left移动
   //第一张图   0    0*1317
   //  二张     1   -1*1317
   //  三张图   2   -2*1317
   //图片数组arr,为实现无缝轮播再添加一个第一张图片,最后一张图=第一张图
   if (n >= arr.length + 1) {
    
    
       n = 0;
       lunBoUl.style.left = 0;
   }
   jsKu.move(lunBoUl, 'left', 60, -n * 1317); //lunBoUl为要移动的元素,left移动改变的值,step每一步走多少像素,移动的最终位置
   //遍历小圆点
   for (var i = 0; i < lunBoSpans.length; i++) {
    
    
       lunBoSpans[i].className = '';//小圆点初始样式设为空
   }//再设置当前小圆点的样式
   lunBoSpans[n == arr.length ? 0 : n].className = 'active';
   }, 2000); //每隔2秒轮播一张图
  }

2、鼠标滑入滑出事件

  1. 当鼠标移入div时,停止图片轮播,鼠标移出div,开启定时器图片轮播
  2. 设置定时器唯一标识符–用于清除定时器
//当鼠标移入div时,停止图片轮播,鼠标移出div,开启定时器图片轮播
   lunBoDiv.onmouseenter = function () {
    
    
       clearInterval(timer);//鼠标滑入-关闭定时器
   }
   lunBoDiv.onmouseleave = function () {
    
    //鼠标滑出--开启图片轮播
       timer = setInterval(function () {
    
    
           n++;//无缝轮播:最后一张图与第一张图片相同
       if (n >= arr.length + 1) {
    
    
           n = 0;//若图片轮播到最后一张图时,让n为0回到第一张图
           lunBoUl.style.left = 0;//图片ul的left值设为0
       }
       jsKu.move(lunBoUl, 'left', 60, -n * 1317);
      //遍历小圆点
       for (var i = 0; i < lunBoSpans.length; i++) {
    
    
           lunBoSpans[i].className = '';//小圆点初始样式设为空
       }//再设置当前小圆点的样式
       lunBoSpans[n == arr.length ? 0 : n].className = 'active';
       }, 2000); //每隔2秒轮播一张图
   }

3、左右箭头事件

  1. 左箭头:点击左箭头显示上一张图片,第一张图片的上一张图片是最后一张图片
//左键头事件
   lunBoButtons[0].onclick = function () {
    
    
       n--;
       if (n < 0) {
    
    
           n = arr.length - 1; //arr.length=5第一张图片的上一张图片是最后一张图片
           jsKu.move(lunBoUl, 'left', 130, -n * 1317);
       }else {
    
    
           jsKu.move(lunBoUl, 'left', 60, -n * 1317);
       }
       //遍历小圆点--排他处理--设置当前小圆点样式
       for (var i = 0; i < lunBoSpans.length; i++) {
    
    
           lunBoSpans[i].className = '';//小圆点初始样式设为空
       }//再设置当前小圆点的样式
       lunBoSpans[n == arr.length ? 0 : n].className = 'active';
   }
  1. 右箭头:点击右箭头显示下一张图片,最后一张图片的下一张图片是第一张图片
 //右箭头事件
   lunBoButtons[1].onclick = function () {
    
    
       n++;
       if (n > arr.length - 1) {
    
     //最后一张图片的下一张图片是第一张图片
           n = 0; //arr.length=5第一张图片的上一张图片是最后一张图片                    
           jsKu.move(lunBoUl, 'left', 130, -n * 1317);
      } else {
    
    
           jsKu.move(lunBoUl, 'left', 60, -n * 1317);
      }
       //遍历小圆点--排他处理--设置当前小圆点样式
       for (var i = 0; i < lunBoSpans.length; i++) {
    
    
           lunBoSpans[i].className = '';//小圆点初始样式设为空
       }//再设置当前小圆点的样式
       lunBoSpans[n == arr.length ? 0 : n].className = 'active';
   }

4、小圆点点击事件

  1. 点击每个小圆点可对应显示图片
  2. 小圆点的样式设置要进行排它处理–即所有小圆点样式初始为空,再设置当前被点击的小圆点的样式
 //小圆点事件
   for (var i = 0; i < lunBoSpans.length; i++) {
    
    
       lunBoSpans[i].index = i; //设置自定义属性用来存储每个小圆点的下标
       lunBoSpans[i].onclick = function () {
    
    
           for (var j = 0; j < lunBoSpans.length; j++) {
    
    
               lunBoSpans[j].className = ''; //所有小圆点初始样式设为空
           }
        this.className = 'active';
        jsKu.move(lunBoUl, 'left', 60, -this.index * 1317);
       }
   }

(二) 、热门直播模块

在这里插入图片描述

  1. ajax请求数据渲染右侧直播课程列表信息
  2. 点击直播列表左侧显示对应课程图片
  3. 当鼠标滑入右侧直播列表时改变样式–设置背景色+颜色变色
//热门直播ajax
   var leftImg = document.getElementById('leftImg'); //左侧图片
   var hotUl = document.getElementById('hotUl'); //右侧课程内容ul
   jsKu.ajax({
    
    
       'url': './data/hot.json',
       'success': function (res) {
    
    
            var arr = JSON.parse(res);
            //2.1获取到每一个数组元素的值
            var str = '';
            for (var i = 0; i < arr.length; i++) {
    
    
                // console.log(arr[i]);//{src: "./img/cont-1.jpg", name: "每日好课python+web", time: "2020-05-19 14:00:00"}
                str += '<li class="clearfix"><div><span>' + arr[i].time + '</span></div><h6><a>' + arr[i].name + '</a></h6></li>';
            }
            //2.2初始化页面内容
            hotUl.innerHTML = str; //将数据渲染进hotUl里
            leftImg.innerHTML = '<img src="' + arr[0].src + '">';

            //2.3点击当前内容设置选中样式
            var lis = hotUl.getElementsByTagName('li'); //热门直播hotUl的子元素li
            for (var i = 0; i < lis.length; i++) {
    
    
                lis[i].index = i;
                lis[i].onmouseenter = function () {
    
    
                    //点击当前样式-排他设置
                    for (var j = 0; j < lis.length; j++) {
    
    
                        lis[j].style.backgroundColor = 'white';
                        lis[j].getElementsByTagName('a')[0].className = '';
                    }
                    this.style.backgroundColor = '#ffefe8'; //选中li改变其背景色
                    this.getElementsByTagName('a')[0].className = 'active'; //li里的课程内容字体颜色变化
                    leftImg.innerHTML = '<img src="' + arr[this.index].src + '">';
                }
            }
        }
    });

(三) 、精品课程模块

在这里插入图片描述

  1. ajax请求数据获取课程信息数据
  2. 导航栏项选择显示对应课程信息
  3. 导航栏滑过每一项改变样式–颜色变色+红色下划线
//免费课程ajax
    var select1Ul = document.getElementById('select1Ul'); //获取导航栏Ul
    var select1Lis = select1Ul.getElementsByTagName('li'); //获取导航栏选择的每一项li
    var lesson1Ul = document.getElementById('lesson1Ul'); //获取课程Ul
    var lesson1Lis = document.getElementById('li'); //获取课程每一项li
    jsKu.ajax({
    
    
        'url': './data/lessonContent.json',
        'success': function (res) {
    
    
            var data = JSON.parse(res);
            var freeLessonData = data.freeLesson;
            console.log(freeLessonData); //获取到 免费课程 板块所有的数据,导航栏项-对应课程信息
            //初始化页面内容--默认导航栏项第一个选择-第一个课程信息
            var onlineSell = freeLessonData.onlineSell; //获取第一个课程数据--再渲染页面
            var str = '';
            //遍历每一项数据内容
            for (var i = 0; i < onlineSell.length; i++) {
    
    
                str += '<li><a><img src="' + onlineSell[i].img + '"></a><h6>' + onlineSell[i].title + '</h6><p>¥<span>' + onlineSell[i].price + '</span><i>' + onlineSell[i].time + '</i></p></li>';
            }
            //再将数据渲染进ul
            lesson1Ul.innerHTML = str;
            //初始化--导航栏第一项-样式设置
            select1Lis[0].className = 'active';
            //滑上导航栏每一项--for  显示对应课程内容
            for (var j = 0; j < select1Lis.length; j++) {
    
    
                select1Lis[j].index = j;
                select1Lis[j].onmouseenter = function () {
    
     //滑上导航项获取其课程名--拿到对应课程数据--遍历数据--渲染页面
                    var freeLessonContent = freeLessonData[this.getAttribute('tag')];
                    var str = '';
                    for (var c = 0; c < freeLessonContent.length; c++) {
    
    
                        str += '<li><a><img src="' + freeLessonContent[c].img + '"></a><h6>' + freeLessonContent[c].title + '</h6><p>¥<span>' + freeLessonContent[c].price + '</span><i>' + freeLessonContent[c].time + '</i></p></li>';
                    }
                    lesson1Ul.innerHTML = str;
                    //鼠标滑上导航栏项,对应改变样式
                    //排他
                    for (var li = 0; li < select1Lis.length; li++) {
    
    
                        select1Lis[li].className = '';
                    }
                    this.className = 'active';
                }
            }
        }
    });

二、登录注册页

(一) 、登录模块

在这里插入图片描述

  1. 登录表单验证,当账号和密码都输入正确跳转至首页,首页变成已登录状态–localStorage本地缓存判断
   //登录账户和密码成功登录后-通过localStorage 判断用户是否登录
    var unLogin = document.getElementById('unLogin');
    var login = document.getElementById('login');
    console.log(localStorage, unLogin, login);
    if (localStorage.phone && localStorage.password) //如果本地缓存有值存在,则首页变成已登录状态-个人中心
    {
    
    
        login.style.display = 'block';
        unLogin.style.display = 'none';
    } else {
    
    
        login.style.display = 'none';
        unLogin.style.display = 'block';
    }
  1. 手机号+密码(低中高等级)正则设置
  //2、对用户输入值进行正则验证
    //2.1 手机号正则
    var phoneReg = /^1[3456789]\d{9}$/; //手机号以1开头,第二位数字为[3456789]中任意一个,剩下9位数随机 
    //2.2 密码正则(6-20位) 
    //① 简单密码: 纯数字 或 纯字母
    var easy = /(^\d{6,20}$)|(^[a-zA-Z]{6,20}$)/;
    //② 中级密码: 以字母开头且为数字和字母的组合->不能是纯数字和纯字母要排除->?!(正向否定预查)
    var middle = /(?!^[a-zA-Z]{6,20}$)^[a-zA-Z][0-9a-zA-Z]{5,19}$/;
    //③ 高级密码: 以字母开头 数字+字母+特殊字符的组合->排除纯数字纯字母纯特殊字符、只是数字和字母的组合、只是数字和特殊符号的组合
    var hard = /(?!^[a-zA-Z]{6,20}$)(?!^[a-zA-Z][0-9a-zA-Z]{5,19}$)^[a-zA-Z][0-9a-zA-Z!@#$%&*()_+=';:,.~]{5,19}$/;
  1. 手机号和密码输入正确后 判断表单提交条件
   loginForm.onsubmit = function () {
    
    
        console.log(phone.value, password.value);
        if (phoneReg.test(phone.value) == false) {
    
    
            alert('手机号输入错误');
            return false;
        }
        if (!easy.test(password.value) && !middle.test(password.value) && !hard.test(password.value)) {
    
    
            alert('密码输入错误');
            return false;
        }
        //账号 和 密码 输入正确后即可正确登录--跳转到首页
        localStorage.phone=phone.value;//用本地缓存 存储用户输入的账号和密码值----用来判断用户是否登录
        localStorage.password=password.value;
        //跳转到首页
        location.href='./index.html';
        return false;//阻止点击按钮自动跳转
    }

(二) 、注册模块

在这里插入图片描述

  1. 验证码–随机数函数封装
  // 封装生成随机数代码函数
    function getCode(str, length) {
    
     //传参-str母字符串--length--要生成随机数的长度
        var code = '';
        for (var i = 0; i < length; i++) {
    
     //生成6位随机数
            var num = Math.floor(Math.random() * str.length) //生成0-字符长度个数----随机数--可对应字符串下标获取到元素
            // console.log(str[num]); //获取生成的随机码
            code += str[num];
        }
        return code; //将生成是随机数返回
    }
  1. 对每一个注册表单遍历–进行正则验证
   //遍历注册表单--每个表单-for--失去焦点onchange事件 就进行判断
   //每一个表单输入是否正确--添加标记
   //声明一个数组-存储状态-每个输入框是否输入正确
    var arr = [];
    for (var i = 0; i < inputs.length - 1; i++) {
    
     //遍历所有表单--去除最后一个注册提交表单
        arr.push(false); //标记初始未填写内容--都为false--for-每次遍历就添加一个false--表单验证对-改为true
        console.log(arr);
        inputs[i].index = i; //设置自定义属性--获取到每个表单下标值
        inputs[i].onchange = function () {
    
     //每个表单--不同正则验证
            if (this.index == 0) {
    
     //手机号--验证
                if (phoneReg.test(this.value)) {
    
    
                    tips[0].innerHTML = '√';
                    tips[0].style.color = 'green';
                    arr[this.index] = true;
                    console.log(arr);
                } else {
    
    
                    tips[0].innerHTML = '手机号输入错误';
                }
            } else if (this.index == 1) {
    
     //密码--验证
                if (easy.test(this.value)) {
    
     //密码等级--低
                    tips[1].innerHTML = '密码等级-低';
                    tips[1].style.color = 'green';
                    arr[this.index] = true;
                } else if (middle.test(this.value)) {
    
    
                    tips[1].innerHTML = '密码等级中等';
                    tips[1].style.color = 'green';
                    arr[this.index] = true;
                } else if (hard.test(this.value)) {
    
    
                    tips[1].innerHTML = '密码等级-高';
                    tips[1].style.color = 'green';
                    arr[this.index] = true;
                } else {
    
    
                    tips[1].innerHTML = '密码输入错误';
                }
            } else if (this.index == 2) {
    
     //再次输入确认密码--与创建密码输入值要相同
                if (this.value == inputs[this.index - 1].value) {
    
    
                    tips[2].innerHTML = '√';
                    tips[2].style.color = 'green';
                    arr[this.index] = true;
                } else {
    
    
                    tips[2].innerHTML = '两次密码输入不一致';
                    tips[2].style.color = '#ff4a00';
                }
            } else if (this.index == 3) {
    
     //邮箱验证
                if (email.test(this.value)) {
    
    
                    tips[3].innerHTML = '√';
                    tips[3].style.color = 'green';
                    arr[this.index] = true;
                } else {
    
    
                    tips[3].innerHTML = '邮箱输入错误';
                }
            } else {
    
    
                if (this.value.toLowerCase() == newCode.toLowerCase()) {
    
    
                    codeTip.innerHTML = '√';
                    codeTip.style.color = 'green';
                    arr[this.index] = true;
                } else {
    
    
                    codeTip.innerHTML = '验证码输入错误';
                }
                console.log(this.value);
            }
        }
    }

3.注册表单全都填写正确–注册按钮提交条件判断

   //点击注册按钮 提交用户信息事件
   //用一个数组-存储状态-每个输入框是否输入正确
    inputs[5].onclick = function () {
    
    
        console.log(arr); //获取到每一个表单验证的状态--是否正确--遍历每个状态--全为true才能提交表单
        for (var i = 0; i < arr.length; i++) {
    
    
            if (arr[i] == false) {
    
    
                alert('表单信息有错');
                return false; //信息有错 阻止提交
            }
        }
        //遍历表单转态--都对--注册页跳转至登录页
        location.href = './login.html?1';
        return false; // 不让它自动提交
    }

三、视频播放页

在这里插入图片描述

(一) 、视频播放模块

1、视频设置

1.视频设置–当视频播放完毕之后–自动播放下一个视频

   var n = 0; //设置n--对应播放列表li的下标---0 表示 第一个列表项-第一个视频
   video.onended = function () {
    
    
       n++;
       video.src = playLis[n].getAttribute("_src"); //_src是自定义属性-在数据渲染时添加给li--便于获取到视频的地址
       video.play(); //一个视频完--自动播放下一个视频
       //当前播放列表项的样式设置
       for (var j = 0; j < playLis.length; j++) {
    
    
          playLis[j].className = "";
       }
          playLis[n].className = "active";
   }

2、视频播放列表设置

  1. 播放列表设置–点击不同列表项–播放对应的视频–遍历li–for循环
   for (var i = 0; i < playLis.length; i++) {
    
    
       playLis[i].index = i; //自定义索引--标记每个li的下标
       playLis[i].onclick = function () {
    
    
       video.src = this.getAttribute("_src"); //li--对应--播放视频
       video.play(); //点击播放列表--就自动播放视频
       title.innerHTML = data[this.index].title; //点击不同li,课程描述也要相应改变
       for (var j = 0; j < playLis.length; j++) {
    
    
           playLis[j].className = "";
       }
       this.className = "active";
       }
   }

(二) 、学员评价模块

在这里插入图片描述

1、评价信息数据处理

  1. 评价信息过多一页展示不完–分页处理-一页显示5条数据
  //对评价数据进行处理slice--共34条--一页显示5条数据--向上取整--会有7页数据
  //第一页1  数据下标0 --0 - 4    0*5--1*5--第一页的末尾数据下标是第二页开头的起始下标
  //第二页2         1   5 - 9    1*5--2*5  num*5,(num+1)*5
  //第三页3         2   10- 14   2*5--3*5
  //第四页4         3   15- 29   3*5--5*5
  //初始化页面--学员评价总数34+第一个页0-4的5条评价数据+跳转页面的表单初始值为1+页码总数7
  //初始化渲染页面--第一个页0-4的5条评价数据
   var pageData = data.slice(0, 5); //得到数组形式数据
   var num = 0; //声明num存储数组下标--对应页码的数据--初始值为0
   commentSum.innerHTML = '学员评价数据总数(' + data.length + ')条'; //学员评价数据总数 34条
   pageInp.value = num + 1; //页码表单值=当前分的数据页--初始值--第一页为1
   var pageSum = Math.ceil(data.length / 5); //页码总数=34条评论数据/5每页数据 向上取整--共7页
   pageSpan.innerHTML = pageSum; //页码总数7

2、按钮事件设置

  1. 确定按钮-用户输入页码-跳转显示相应页码数据
  //点击确定--用户输入页码值-页面跳转相应页面
   sure.onclick = function () {
    
    
  //获取用户输入值--要跳转到哪一页
       var userInp = pageInp.value; //data数组数据下标从0开始--->用户输入值至少从1开始
       num = userInp - 1;
  // pageData = data.slice(num * 5, (num + 1) * 5);
  //判断用户输入值 <=0显示第一页数据   >=7显示第7页数据
       if (num >= 0 && num <= Math.ceil(data.length / 5) - 1) {
    
    
           getPageDate(num);//获取数据渲染页面函数
       }else {
    
    
           alert('当前页面数码输入错误');
       }
   }
  1. 上一页、下一页按钮事件
   //点击上一页按钮--跳转页面数据--确定当前页面-在跳转对应页码数据
   prev.onclick = function () {
    
    
       num--;
       if (num <= 0) {
    
    
           num = 0;
       }
       pageInp.value = num + 1;
       getPageDate(num);
   }

   //点击下一页按钮--跳转页面数据
   next.onclick = function () {
    
    
       num++;
       if (num >= Math.ceil(data.length / 5)) {
    
    
           num = Math.ceil(data.length / 5) - 1;
        }
       pageInp.value = num + 1;
       getPageDate(num);
   }

猜你喜欢

转载自blog.csdn.net/qq_41008567/article/details/107116477