cosyer's Blog

Blog


  • 首页

  • 友链

  • 留言板

  • 归档

  • 关于

  • 搜索
7月
21
更新于
7月21
2020
工具

XSS学习&实践

发表于 2020-06-24 | 热度 ℃
| 字数统计: 290 (字) | 阅读时长: 1 (分钟)

web安全一直是开发中不可忽视的一部分。而xss作为web开发中最常见的攻击手段,防范是必然的。基于web浏览器tricks,JavaScript的发展,npm等开源项目漏 洞,web注入等会让开发者越来越防不胜防。

插入执行标签

  • script
  • img onerror触发
  • iframe srcdoc触发

标签等提前闭合(截断)

  • 如在富文本, input, textarea, 可编辑div等,0x01,0x02
  • style标签
    1
    2
    3
    <style>
    </style ><script>alert(1)</script>
    </style>
  • 注释提前闭合
    1
    --!><script>alert(1)</script>

阅读全文 »
7月
18
更新于
7月18
2020
知识

webapck4零配置了解一下

发表于 2018-11-26 | 热度 ℃
| 字数统计: 658 (字) | 阅读时长: 3 (分钟)

webpack4 最主要的卖点便是零配置,要想成为一位webpack配置工程师怎么能不开始了解呢?话不多说,让我们开始体验 webpack 4 的一些特性。

entry 和 output

  1. 创建空目录,初始化配置

    1
    2
    3
    mkdir webpack4-quickstart
    cd webpack4-quickstart
    npm init -xyz
  2. 安装相关依赖

    1
    2
    npm i webpack --save-dev
    npm i webpack-cli --save-dev
  • webpack: 即 webpack 核心库。它提供了很多 API, 通过 Node.js 脚本中 require(‘webpack’) 的方式来使用 webpack。
  • webpack-cli:是 webpack 的命令行工具。webpack 4 之前命令行工具是集成在 webpack 包中的,4.0 开始 webpack 包本身不再集成 cli。
  1. package.json添加构建命令
    1
    2
    3
    "scripts":{
    "build":"webpack"
    }

阅读全文 »
7月
17
更新于
7月17
2020
JS

如何理解JS闭包

发表于 2018-06-11 | 热度 ℃
| 字数统计: 780 (字) | 阅读时长: 3 (分钟)

JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。

在JS中函数作为普通对象进行传递


阅读全文 »
7月
17
更新于
7月17
2020
知识

深入了解HTTP

发表于 2019-04-30 | 热度 ℃
| 字数统计: 3,152 (字) | 阅读时长: 12 (分钟)

HTTP 特性

  • 基于TCP-IP协议 应用层协议 默认端口号80
  • 无连接无状态

什么是无状态

  • 状态】的含义就是:客户端和服务器在某次会话中产生的数据
  • 那么对应的【无状态】就意味着:这些数据不会被保留
  • 通过增加cookie和session机制,现在的网络请求其实是有状态的
  • 在没有状态的http协议下,服务器也一定会保留你每次网络请求对数据的修改,但这跟保留每次访问的数据是不一样的,保留的只是会话产生的结果,而没有保留会话

HTTP 报文

请求报文

HTTP 协议是以 ASCII (a s ki)码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。

  • GET 可提交的数据量受到URL长度的限制,HTTP 协议规范没有对 URL 长度进行限制。这个限制是特定的浏览器及服务器对它的限制
  • 理论上讲,POST 是没有大小限制的,HTTP 协议规范也没有进行大小限制,出于安全考虑,服务器软件在实现时会做一定限制
  • 参考上面的报文示例,可以发现 GET 和 POST 数据内容是一模一样的,只是位置不同,一个在 URL 里,一个在 HTTP 包的包体里

阅读全文 »
7月
17
更新于
7月17
2020
CSS

三栏布局总结(左右固定宽度 中间自适应)

发表于 2020-05-09 | 热度 ℃
| 字数统计: 1,055 (字) | 阅读时长: 5 (分钟)

圣杯布局和双飞翼布局(其实是一回事)都是实现的三栏布局。

浮动布局(float + margin)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<div class="container">
<div class="left">Left</div>
<!-- 右栏部分要写在中间内容之前 -->
<div class="right">Right</div>
<div class="main">Main</div>
</div>

body,html,.container{
height: 100%;
padding:0;
margin: 0;
}
/*左边栏左浮动*/
.left{
float:left;
height:100%;
width:200px;
background:#333;
}
/*中间栏自适应*/
.main{
height:100%;
margin:0 200px;
background: red;
}
/*右边栏右浮动*/
.right{
float:right;
height:100%;
width:200px;
background:#333;
}
  • 优点:快捷 简单 兼容性较好
  • 缺点: 有局限性 脱离文档流 需要清除浮动等

阅读全文 »
7月
13
更新于
7月13
2020
知识

css高度坍塌和判断横竖屏

发表于 2018-12-08 | 热度 ℃
| 字数统计: 1,091 (字) | 阅读时长: 4 (分钟)

1.01^365=37.8

两个盒子,一个下边距20px,一个上边距50px,最后为两个盒子之间的距离为多少 50px 解决:根据W3C的标准,在页面中元素都一个隐含的属性叫做Block FormattingContext 简称BFC,该属性可以设置打开或者关闭,默认是关闭的。


阅读全文 »
7月
11
更新于
7月11
2020
JS

实现双向绑定

发表于 2018-11-07 | 热度 ℃
| 字数统计: 3,272 (字) | 阅读时长: 15 (分钟)

主流的双向绑定方法 1.发布-订阅模式 通过使用 get 和 set 的方式获取数据然后更新数据,其原理就是监听页面中某个具体元素的事件,然后将其最新的值手动 set 到 数据中,同时订阅 model 层的改变,然后触发页面的渲染更新

2.脏检测 通过对比数据是否有变更,来决定是否更新视图。最简单的可以通过定时轮询去检测数据的变动。Angular 只有在指定事件触发时进入脏检测:

  • DOM事件,比如用户输入文本点击按钮等(ng-click)
  • XHR响应事件 浏览器 Location 变更
  • Timer事件
  • 执行 $digest() 或 $apply();

脏检查的主要原理是在将数据绑定到 View 的时候,就在监听器列表(scope 作用域中的监听队列 watchList)中插入一条监听器,当触发 UI 事件或者 Ajax 请求时,就会触发脏检查($digest cycle), 在 $digest 流程中,将遍历每个数据变量的 watcher,比较它的新旧值。当新旧值不同时,触发 listener 函数,执行相关的更新逻辑。这个过程将会一直重复,直到所有数据指令的新旧值都相同为止。

脏检查虽然可以达到实现双向绑定,但是当页面中绑定的 watcher 过多时,就会引发性能问题。所以 angular 在进行 $digest 检测时,会限制循环检查的次数最少2次,最多10次,防止无效的检查。

3.数据劫持 通过 ES5 的 Object.defineProperty() 来劫持数据属性的 getter 和 setter, 在数据变动时触发订阅者(watcher),从而触发相应的监听回调更新视图。

  • Observer 对数据的所有属性进行监听其 getter 和 setter
  • Compile 是一个指令解析器,对 MVVM 实例的所有元素指令进行解析,并渲染成 model 中的绑定数据,当数据进行更新时,也能替换为更新后的值。
  • Watcher 作为 Compile 和 Observer 的桥梁,能够订阅数据属性的更新,然后执行相应的监听回调
  • Deps 用于存放监听器数组,主要用来保存 Watcher
  • Updater 执行更新操作,针对不同的指令进行不同的更新操作,如 v-model, v-class, v-html 等类型的指令。
  • MVVM 作为入口函数,整合以上所有的功能。

vue-mvvm

Observer 劫持了所有数据属性的 getter 和 setter,当数据发生改变时,就会通知 deps 中所有 watcher 的更新操作,进而触发页面的重新渲染,这是修改 Model 层从而引发 View 层的重新渲染。 在 Compile 中监听可输入元素的事件,然后将新值更新到 model 的数据中,这是修改 View 层触发的 Model 层的修改。

  • 用户名或者邮箱跟github没有关联上, github认为不是你提交的, 不统计。
  • fork 的项目, 不统计
  • 没有在版本库的master【默认分支】上提交

解读


阅读全文 »
7月
10
更新于
7月10
2020
JS

关于requestAnimationFrame

发表于 2019-09-22 | 热度 ℃
| 字数统计: 1,691 (字) | 阅读时长: 7 (分钟)

在JS中,我们可以使用 setTimeout 和 setIntarval 实现动画,但是 H5 的出现,让我们又多了两种实现动画的方式,分别是 CSS 动画(transition、animation)和 H5的canvas 实现。除此以外,H5还提供了一个专门用于请求动画的API,让 DOM 动画、canvas动画、svg动画、webGL动画等有一个专门的刷新机制。

传统的javascript 动画是通过定时器 setTimeout 或者 setInterval 实现的。但是定时器动画一直存在两个问题

  • 动画的循时间环间隔不好确定(推荐的最佳循环间隔是17ms(大多数电脑的显示器刷新频率是60Hz,1000ms/60))
  • 定时器第二个时间参数只是指定了多久后将动画任务添加到浏览器的UI线程队列中,如果UI线程处于忙碌状态,那么动画不会立刻执行

1. 定义

requestAnimationFrame 方法会告诉浏览器希望执行动画并请求浏览器在下一次重绘之前调用回调函数来更新动画。

1
window.requestAnimationFrame(callback)
  • callback:下一次重绘之前更新动画帧所调用的函数,callback仅有一个参数,为DOMHighResTimeStamp参数,表示requestAnimationFrame()开始执行回调函数的时刻。
  • 返回值:一个 long 类型整数,唯一标志元组在列表中的位置,你可以传这个值给cancelAnimationFrame() 以取消动画。

在使用和实现上, requestAnimationFrame 与 setTimeout 类似。举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let count = 0;
let rafId = null;
/**
* 回调函数
* @param time requestAnimationFrame 调用该函数时,自动传入的一个时间
*/
function requestAnimation(time) {
console.log(time); // 打印执行requestAnimation函数的时刻
// 动画没有执行完,则递归渲染
if (count < 5) {
count++;
// 渲染下一帧
rafId = window.requestAnimationFrame(requestAnimation);
}
}
// 渲染第一帧
window.requestAnimationFrame(requestAnimation);

2.怎样执行

  • 首先判断 document.hidden 属性是否可见(true),可见状态下才能继续执行以下步骤
  • 浏览器清空上一轮的动画函数
  • requestAnimationFrame 将回调函数追加到动画帧请求回调函数列表的末尾 注意:当执行 requestAnimationFrame(callback)的时候,不会立即调用 callback 回调函数,只是将其放入回调函数队列而已,同时注意,每个 callback回调函数都有一个 cancelled 标志符,初始值为 false,并对外不可见。
  • 当页面可见并且动画帧请求callback回调函数列表不为空时,浏览器会定期将这些回调函数加入到浏览器 UI 线程的队列中(由系统来决定回调函数的执行时机)。当浏览器执行这些 callback 回调函数的时候,会判断每个元组的 callback 的cancelled标志符,只有 cancelled 为 false 时,才执行callback回调函数。

3. 优点

  1. requestAnimationFrame 自带函数节流功能,采用系统时间间隔,保持最佳绘制效率,不会因为间隔时间的过短,造成过度绘制,增加页面开销,也不会因为间隔时间过长,造成动画卡顿,不流程,影响页面美观。 浏览器的重绘频率一般会和显示器的刷新率保持同步。大多数采用 W3C规范,浏览器的渲染页面的标准频率也为 60 FPS(frames/per second)即每秒重绘60次,requestAnimationFrame的基本思想是 让页面重绘的频率和刷新频率保持同步,即每 1000ms / 60 = 16.7ms执行一次。 通过 requestAnimationFrame 调用回调函数引起的页面重绘或回流的时间间隔和显示器的刷新时间间隔相同。所以 requestAnimationFrame 不需要像 setTimeout 那样传递时间间隔,而是浏览器通过系统获取并使用显示器刷新频率。例如在某些高频事件(resize,scroll 等)中,使用 requestAnimationFrame 可以防止在一个刷新间隔内发生多次函数执行,这样保证了流程度,也节省了开销
  2. 另外,该函数的延时效果是精确的,没有setTimeout或setInterval不准的情况(JS是单线程的,setTimeout 任务被放进异步队列中,只有当主线程上的任务执行完以后,才会去检查该队列的任务是否需要开始执行,造成时间延时)。 setTimeout的执行只是在内存中对图像属性进行改变,这个改变必须要等到下次浏览器重绘时才会被更新到屏幕上。如果和屏幕刷新步调不一致,就可能导致中间某些帧的操作被跨越过去,直接更新下下一帧的图像。即 掉帧 使用 requestAnimationFrame 执行动画,最大优势是能保证回调函数在屏幕每一次刷新间隔中只被执行一次,这样就不会引起丢帧,动画也就不会卡顿
  3. 节省资源,节省开销 在之前介绍requestAnimationFrame执行过程,我们知道只有当页面激活的状态下,页面刷新任务才会开始,才执行 requestAnimationFrame,当页面隐藏或最小化时,会被暂停,页面显示,会继续执行。节省了 CPU 开销。 注意:当页面被隐藏或最小化时,定时器setTimeout仍在后台执行动画任务,此时刷新动画是完全没有意义的(实际上 FireFox/Chrome 浏览器对定时器做了优化:页面闲置时,如果时间间隔小于 1000ms,则停止定时器,与requestAnimationFrame行为类似。如果时间间隔>=1000ms,定时器依然在后台执行)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 在浏览器开发者工具的Console页执行下面代码。
    // 当开始输出count后,切换浏览器tab页,再切换回来,可以发现打印的值从离开前的值继续输出
    let count = 0;
    function requestAnimation() {
    if (count < 100) {
    count++;
    console.log(count);
    requestAnimationFrame(requestAnimation);
    }
    }
    requestAnimationFrame(requestAnimation);
  4. 能够在动画流刷新之后执行,即上一个动画流会完整执行

4. 实现

我们可以使用 requestAnimationFrame 实现setInterval及 setTimeout

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// setInterval实现
function setInterval(callback, interval) {
let timer
const now = Date.now
let startTime = now()
let endTime = startTime
const loop = () ={
timer = window.requestAnimationFrame(loop)
endTime = now()
if (endTime - startTime >= interval) {
startTime = endTime = now()
callback(timer)
}
}
timer = window.requestAnimationFrame(loop)
return timer
}

let a = 0
setInterval(timer ={
console.log(a)
a++
if (a === 3) window.cancelAnimationFrame(timer)
}, 1000)
// 0
// 1
// 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// setTimeout 实现
function setTimeout(callback, interval) {
let timer
const now = Date.now
let startTime = now()
let endTime = startTime
const loop = () ={
timer = window.requestAnimationFrame(loop)
endTime = now()
if (endTime - startTime >= interval) {
callback(timer)
window.cancelAnimationFrame(timer)
}
}
timer = window.requestAnimationFrame(loop)
return timer
}

let a = 0
setTimeout(timer ={
console.log(a)
a++
}, 1000)
// 0

5. 参考

MDN

7月
10
更新于
7月10
2020
CSS

css绘制几何图形

发表于 2018-08-14 | 热度 ℃
| 字数统计: 2,355 (字) | 阅读时长: 13 (分钟)

CSS能够生成各种形状。正方形和矩形很容易,因为它们是 web 的自然形状。添加宽度和高度,就得到了所需的精确大小的矩形。添加边框半径,你就可以把这个形状变成圆形,足够多的边框半径,你就可以把这些矩形变成圆形和椭圆形。

我们还可以使用 CSS 伪元素中的 ::before 和 ::after,这为我们提供了向原始元素添加另外两个形状的可能性。通过巧妙地使用定位、转换和许多其他技巧,我们可以只用一个 HTML 元素在 CSS 中创建许多形状。

虽然我们现在大都使用字体图标或者svg图片,似乎使用 CSS 来做图标意义不是很大,但怎么实现这些图标用到的一些技巧及思路是很值得我们学习。


阅读全文 »
7月
07
更新于
7月07
2020
JS

ES6Reflect对象

发表于 2019-05-02 | 热度 ℃
| 字数统计: 1,392 (字) | 阅读时长: 6 (分钟)

介绍

Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。这些方法与处理器对象的方法相同。Reflect不是一个函数对象,因此它是不可构造的。

Reflect这个对象在新版本的chrome是支持的, ff比较早就支持Proxy和Reflect了,要让node支持Reflect可以安装harmony-reflect;

Reflect不是构造函数, 要使用的时候直接通过Reflect.method()调用, Reflect有的方法和Proxy差不多, 而且多数Reflect方法原生的Object已经重新实现了。

与大多数全局对象不同,Reflect没有构造函数。你不能将其与一个new运算符一起使用,或者将Reflect对象作为一个函数来调用。Reflect的所有属性和方法都是静态的(就像Math对象)。


阅读全文 »
1…8910…16
陈宇(cosyer)

陈宇(cosyer)

不去做的话永远也做不到。

159 日志
10 分类
51 标签
RSS
GitHub Twitter E-Mail FB Page
推荐阅读
  • Callmesoul
  • JsTips
  • Personal Site
  • Resume
© 2021 陈宇(cosyer)
终于等到你(UV):   |   欢迎再来(PV):
Blog总字数: 312.5k字
苏ICP备17005342号-1