360前端星计划4-9


如何写好JS:举例白天黑夜模式

版本1:通过js直接操作css属性。

    缺点:违反各司其职;没有足够的信息(为什么改变)

版本2: js修改className,具体样式交给css

    优点:js代码简洁;className可以体现功能

版本3:纯css实现(因为是纯展示页面)

    实现:

        <input id="light" type="checkbox"></input>  //样式隐藏#light { display: none;}

        <label for="light">  //绑定,使得点击label时相当于点击到了input

        #light:checked + #main {//修改样式

              background-color: #000;

              color: #fff;

           }

    优点:可维护性高

    缺点:兄弟选择器有的浏览器不支持

复杂UI组件设计:轮播图

步骤1:结构设计

    列表结构使用ul\li、

    使用 css 绝对定位将图片重叠在同一个位置、

    切换采用transition

步骤2:API设计

    getSelectedItem():获得选中的元素

    getSelectedItemIndex():获得选中的元素是列表中第几个元素(小圆点)

    slide To() :解决鼠标移动到小圆点时跳转到哪一页

    slide Next():鼠标点击跳转到上一页

    slide Previous():鼠标点击跳转到下一页

实现:(不含交互结构:小圆点,左右切换)

 class Slider{

  constructor(id){

    this.container = document.getElementById(id);

    this.items = this.container.querySelectorAll('.slider-list__item, .slider-list__item--selected');

  }

  getSelectedItem(){

    const selected = this.container.querySelector('.slider-list__item--selected');

    return selected

  }

  getSelectedItemIndex(){

    return Array.from(this.items).indexOf(this.getSelectedItem());

  }

  slideTo(idx){

    const selected = this.getSelectedItem();

    if(selected){

      selected.className = 'slider-list__item';

    }

    const item = this.items[idx];

    if(item){

      item.className = 'slider-list__item--selected';

    }

  }

  slideNext(){

    const currentIdx = this.getSelectedItemIndex();

    const nextIdx = (currentIdx + 1) % this.items.length;

    this.slideTo(nextIdx);

  }

  slidePrevious(){

    const currentIdx = this.getSelectedItemIndex();

    const previousIdx = (this.items.length + currentIdx - 1) % this.items.length;

    this.slideTo(previousIdx); 

  }

}

const slider = new Slider('my-slider');

setInterval(() => {        /*定时轮播*/

  slider.slideNext()

}, 3000)

步骤3:控制流结构

控制结构:小圆点与左右切换按钮    

圆点控制:圆点mouseover时:确定顺序跳转,并且停止定时器;mouseout时恢复定时器

左右切换控制: 停止计时、slide Next()\ slide Previous()、开始计时

自定义事件:(slideTo中定义):实现圆点移动显示,与图片对应

const detail = {index: idx} 

const event = new CustomEvent('slide', {bubbles:true, detail}

this.container.dispatchEvent(event)

圆点绑定事件:

    this.container.addEventListener('slide', evt => {

        const idx = evt.detail.index

        const selected = controller.querySelector('.slide-list__control-buttons--selected');

        if(selected) selected.className = 'slide-list__control-buttons';

        buttons[idx].className = 'slide-list__control-buttons--selected';

      })

优化1:插件/依赖注入:

避免插件和组件的强耦合,降低耦合度。比如直接移除某一块(此时无法去除html)

优化2:改进插件/模版化(只需要维护一处地方即可)

插件由functino变为object(包含两个方法render与action)、封装了HTML和JS,提高可维护性

优化3:组件模型抽象

局部细节控制

例1:逐渐消失的方块

block.onclick = function(evt){

  console.log('hide');

  evt.target.className = 'hide';

  setTimeout(function(){

    document.body.removeChild(block);

  }, 2000);

};

分析:click可以点击多次,remove后会没有节点。则会报错

解决1:限制只能访问一次

block.onclick = function(evt){

  block.onclick = null;

  console.log('hide');

  evt.target.className = 'hide';

  setTimeout(function(){

    document.body.removeChild(block);

  }, 2000);

};

新浏览器方法:block.addEventListener('click',()=>{},{once:true})

只执行一次的方法

抽象一个once函数:

function once(fn){

  return function(...args){

    if(fn){

      let ret = fn.apply(this, args);

      fn = null;

      return ret;

    }

  }

}

节流、防抖函数

消费者:用于连击

reduce方法

toggle

使用生成器

总结

如何写好 JavaScript?

各司其职:JavaScript 尽量只做状态管理

结构、API、控制流分离设计 UI 组件

插件和模板化,并抽象出组件模型

运用过程抽象的技巧来抽象并优化局部 API


常用的HTTP知识

请求、响应报文结构

请求类型

GET获取一个资源内容

POST新增一个资源

PUT更新资源内容

DELETE删除资源

OPTIONS根据返回判断是否有对其请求的权限

HEAD只返回 head,不返回实体内容

PATCH更新部分内容

状态码:

1xx请求已接受,需要继续处理

2xx请求已经正确处理

3xx重定向

4xx客户端错误

5xx服务端错误

URL

受限字符:%/.#?;:$+@&= 以及非US-ASCⅡ字符集字符

cookie

path

domain (hostonly*)

expires  (max-age)

secure

httponly:防止XSS

SameSite:防止CSRF

Content-Type:

(请求头)标识提交数据的类型;(响应头)标识返回内容的类型

    application/x-www-form-urlencoded

    multipart/form-data

    application/json

    text/xml

性能优化:

keep-alive

    HTTP 1.0 原本不支持 Keep-Alive,后来扩充了 Connection: Keep-Alive

    HTTP 1.1 默认支持 Keep-Alive,除非显式指明 Connection: close

减少网络传输大小:压缩

    content-encoding:gzip

缓存

http2/http3

http2:

    二进制传输

    多路复用

    头部压缩

    server push

HTTP3

    基于 QUIC 协议(UDP)

HTTP 抓包工具

Wireshark

Fiddler

Firebug for Firefox

Chrome 开发者工具

IE8+ 自带的开发者工具

HTTP 发包工具

telnet  / curl

Fiddler *

Tamper for Firefox

Postman for Chrome *

Paw for OSX

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

推荐阅读更多精彩内容