JS原生项目

JS原生项目

  • 知识点-思维导图


    js原生项目.png

JS作用

  • 实际项目里js的应用点
    1.获取数据渲染页面
    2.页面上数据的处理
    3.页面跳转时数据的传输
  • 可见,JS的真正作用是处理数据
    下面是我根据导图,结合项目代码进行的一些总结

项目总结

基本知识点

一、面向对象编程方式

  • 我们把要处理的页面当一个对象比如对影片列表处理的时候
var pian = {
// 对影片页面处理,我们创建一个对应的对象pian(直接用拼音哈哈)
    start: function () {
// 开始就执行函数的我们用一个函数来装
        var str = location.href;
        var index = str.indexOf('=') + 1;
        var filmId = str.slice(index);
        var url = 'http://132.232.87.95:3000/api/film/getDetail?filmId='+filmId
        axios.get(url).then(function (res) {
            if (res.data.status == 0) { 
                pian.renderList(res.data.film);
            }
        }).catch(function () { 

        })
    },
    renderList: function (film) {
// 渲染的我们也用一个函数来表示
        document.querySelector('#img').src = film.poster;
        document.querySelector('#name').innerText = film.name;
        document.querySelector('#grade').innerText = film.grade;
        document.querySelector('#category').innerText = film.category;
    }

}
pian.start();
// 一开始就运行这个开头执行的函数
  • 面向对象编程,把编辑的页面当成对象,然后分几个功能层,开始执行和待执行以及触发执行的代码,作用是让代码更有条理不至于乱七八糟的

二、获取dom节点

  • 我们要对页面进行操作,第一步肯定是找到对应的标签,然后对这个标签进行编辑
  • 常用的都会说是document.getElementById和document.getElementsByClassName
document.getElementById       //   根据ID获取节点
document.getElementsByClassName  // 根据class获取节点
  • 但是最推荐的还是document.querySelector
    因为document.querySelector有这个两个的功能
document.querySelector('#')     // 根据ID获取的时候用 #
document.querySelector('.')      //  根据class获取的时候用 .

作用总结

一、for循环

项目里我们渲染页面大部分依靠的都是for循环,这里依靠的是for循环可以遍历数组的特性

  • for循环遍历 for(i=0;i<arr.length;i++){arr[i]} 这个时候arr[i]代表数组arr里的每一个元素,这便是遍历
for (var j = 0;j < films.length;j++) {
      var film = films[j]
      var filmId = film.filmId; 
      var actorsStr = home.actorsToString(film.actors)
      var str = `  <div class="flex-sb mg-t-8 bd-gray pd-b-15 mg-l-17 rel">
                <a class="flex-sb w100pc" href="pian.html?filmId=${filmId}">
                    <img class="h70 w50" src="${film.poster}" alt="">
                    <!-- 电影文字介绍 -->
                    <div class="lh20 fg1 mg-l-15">
                        <div class="flex ai-center">
                            <p class="f14">${film.name}</p>
                            <span class="lable2D f10" style="">2D</span>
                        </div>
                        <div class="f12 gray mg-t-5">
                            <p>观众评分 <span style="color:#fed177;">${film.grade}</span> </p>
                            <p class="display w160">主演: ${film.director}</p>
                            <p><span style="color: orange">${film.nation}</span> | ${film.runtime} 分钟</p>
                        </div>
                    </div>
                    <a class="abs" style="right:0" href=" ">
                        <button class="bg-fff h20 w50 orangr mg-r-18"
                            style="height:24px; border: 1px solid#ef7131; border-radius: 3px;">购票</button>
                    </a>
                </a>
            </div>`
      htmlStr += str
    }
    var $list = document.querySelector('.list')
    $list.innerHTML = htmlStr
  },
  • `` 模板字符串 里面可以存放html代码和变量,经常用于渲染页面
  • 在模板字符串里,我们用后台的数据放到对应内容标签里用${变量}
  • ${xx}在模板字符串``下才有用所以搭配使用
二、if分支语句
  • 在项目里我们经常用到if语句,当用户登录怎样,没登录又怎样,很方便
    这是获取后台数据部分的代码
  • 在渲染列表里我们经常用${xx}来填充节点,达到渲染的效果
getFilmList: function () {
    var url = 'http://132.232.87.95:3000/api/film/getList?page=1'
    axios(url).then(function (res) {
      if (res.data.status == 0) {
        home.renderList(res.data.films)
      } else {
        alert(res.data.msg)
      }
    // 请求成功之后,执行这个函数
    }).catch(function (error) {
      alert(error)
    // 请求失败之后,执行这个函数
    })
  }
  • axios:这里我们用到了axios来获取后台接口的数据
    需要注意的是,先了解接口结构以及里面的数据层,否者即使获取到了也用不了
  • 然后在这里我们就使用了if分支语句进行了一些判断,因为先了解到数据接口里的结构层次,然后我们做一个判断,如果成功就执行我们的渲染函数,并把数据传给函数
  • 获得数据后有些需要特殊处理的,单独建立一个函数来处理,而if语句最常用
// 拼接演员列表字符串
  actorsToString: function (actors) {
    if (!actors) {
      return ''
    } else {
      var str = ''
      for (var i = 0;i < actors.length;i++) {
        var actor = actors[i]
        str += actor.name + ' '
      }
      return str
    }
  • 上面这个拼接演员列表字符串的函数,我们可以把它当成一个封装好的函数,需要拼接演员列表字符串的时候直接拿来用就可以了
三、日期函数的使用
  • 日期函数 new Date()
格式化日期  time为毫秒数
formatDate: function(time) {
    var date = new Date(time);
    var Y = date.getFullYear();
    var M = orderDetails.addZero(date.getMonth() + 1);
    var D = orderDetails.addZero(date.getDate());
    var h = orderDetails.addZero(date.getHours());
    var m = orderDetails.addZero(date.getMinutes());
    var s = orderDetails.addZero(date.getSeconds());
    // var dayStr = `${Y}-${M}-${D} ${h}:${m}:${s}`
    var dayStr = `${Y}-${M}-${D} ${h}:${m}:${s}`;
    return dayStr;
  },
  • 根据毫秒数返回星期
getWeekDay: function(time) {
    var date = new Date(time);
    var day = date.getDay();
    var week = {
      "0": "星期日",
      "1": "星期一",
      "2": "星期二",
      "3": "星期三",
      "4": "星期四",
      "5": "星期五",
      "6": "星期六"
    };
    return week[day];
  },
四、页面跳转传参
  • 传:渲染的时候给链接后面加上如<a href="orderDetails.html?oderId=${orderId}">
`<a href="orderDetails.html?oderId=${orderId}">`
模板字符串中通过在路径后面加?参数名=${参数}实现跳转传参
  • 接收:在一开始的时候在开头函数里通过location.href获取网址然后截取字符串
// 使用location.href 获取当前网址
    var url = location.href;

    // 从字符串url里提取(截取)orderId
    // 使用indexOf找到=的位置(下标) 的后一位
    var index = url.indexOf('=') + 1;

    // 使用slice截取从=后的一位开始后面全部的字符串
    var orderId = url.slice(index);

    orderDetails.getDetails(orderId);
    将截取的参数给获取后台数据的函数
五、正则表达式在项目里的应用
  • 通过正则表达式可以验证电话号码格式以及其他的格式然后结合if分支语句进行判断然后执行对应的函数
// 设置电话号码输入格式
  isKo: function() {
    var phone = document.querySelector("#phone").value;
    if (0 <= phone.length <= 11) {
      if (phone.length == 11) {
        if (/^1[34578]\d{9}$/.test(phone) == false) {
          alert("输出格式错误,请输入正确的电话号码");
        } else {
          login.getCode();
        }
      } else {
        alert("电话号码是11位数");
      }
    } else {
      alert("电话号码是11位数");
    }
  },
  • 正则表达式结合函数replace实现字符串替换的功能
需求:根据接口判断是否登录,然后把接口里的号码赋给phone然后以123*****1234的形式显示
goLogin: function () {
        // document.querySelector('#name').innerText=phone;
        var url = 'http://132.232.87.95:3000/api/user/getUserInfo';
        // 登入接口
        axios.get(url).then(function (res) {
            if (res.data.status === 0) {
            // 判断是否登录
                var $phone = document.querySelector('#phone');
                var phone = res.data.userinfo.mobilePhoneNumber;
          // 赋值给phone
                var phoneStr = phone.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2');
        // 替换成123*****1234的形式 
                // 填充标签
                $phone.innerText = phoneStr;
            } else {
                var $phone = document.querySelector('#phone');
                $phone.innerText = '立即登录';
            }
        }).catch(function () {
             
         })
    }
  • (/^(\d{3})\d{4}(\d{4})/, '1****2');正则里的意思是分成两组,(\d{})代表一组,里面数字表示一组几个数字,然后'1****2'中1表示第一组$2表示第二组,以前3个数字后4个数字中间用****代替,最后效果就是123*****1234
六、发送验证码时的操作细节
  • 倒计时 一般用input标签做
getCode: function() {
    // 获取节点
    var str = document.querySelector("#getcode");
    // 调用函数之后不能在被点击仅限于input标签
    // disabled 的意思是禁止点击
    str.disabled = true;
    // 设置定时器变量名为timer这些基本都是用这个单词的
    var timer = setInterval(function() {
      // 给获取节点里面的value值赋值,赋的值是num自减这样就达到了倒计时的效果
      str.value = --login.num;
      // 设置在数字为零的时候停止
      if (login.num === 0) {
        clearInterval(timer);
        // 为零的时候input的value值变为重新发送
        str.value = "重新发送";
        // 这个时候num的值为0,再次点击会从零开始,所以要重置一下num的值
        login.num = 60;
        // 调用函数之后能在被点击仅限于input标签
        str.disabled = false;
      }
    }, 1000);
  • 作用域
直接在script下的变量为全局变量
/* 声明全局变量
        全局变量,全局都可以使用引用的变量
    */
    var man = {
        name : '勇'
    }
<!-- 把全局变量放在头部,这样的话下面的js才能访问到 
        代码的顺序从上到下
    -->
// 函数里的变量为局部变量 
// add(){}里的变量为局部变量
    function add(){
        var a = 10;
        var b = 5; 
        var sum = a+b;
        console.log(sum);
        // 局部作用域,局部变量,里面可以访问
    }
局部变量外部访问不到,访问就得调用函数

2.全局作用域,在全局作用域下声明的变量是全局变量,在script标签里面(子级)声明的变量为全局变量
    /*自我总结:通过全局变量可以方便js代码的处理,全局变量的可以放在
    头部按顺序来排,(类似这个用到卖座项目里面的话,后台数据的代码由于是属于全局变量
    可以放在home.html的body上面,这样一来home.js文件里的代码块就可以很好的管理)*/

3.局部作用域和局部变量
    // 函数就是一个局部作用域,里面的变量为局部变量
    a.函数内部可以访问函数外部的变量
    b.函数外部不可以访问函数内部的变量
    c.多个作用域用作用域链进行链接
    d.没有块级作用域(区分作用域是以函数作为区分条件)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,168评论 0 3
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,465评论 1 45
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,576评论 0 7
  • 山的那边 月亮永远很圆 鸟儿有蓝色的眼 蘑菇晚上会笑出声来 我的包裹里 装着五彩的鞋带 和勇敢 (这篇是小时候摘抄...
    十月云阅读 610评论 0 50