william.chan's blog

done is better than perfect

JavaScript: event.clientX and offsetLeft

clientX, offsetLeft, offsetWidth

clientX, offsetLeft, offsetWidth offsetLeft计算当前元素距离有定位属性(static除外)的先辈元素的距离,如果所有的先辈元素都没有设置定位属性,那么计算的就是当前元素距离窗口左侧的距离。 clientX:当事件被触发时鼠标指针相对于窗口左边界的水平坐标。 offsetLeft:该元素左外边框至窗口左边界的距离。 offsetWid...

JavaScript: 避免事件重复触发

js性能优化

避免事件重复触发 1 2 3 4 5 // 每次事件触发后,先清除之前的事件,再继续执行 floor.$win.on('scroll resize', floor.showFloor = function() { clearTimeout(floor.floorTimer); floor.floorTimer = setTimeout(floor.timeToShow, 250);...

CSS: 在.css文件中对样式进行分组

将分组后的样式折叠起来

vscode 将分组后的样式折叠起来 I had the same issue, and fixed it by doing this: Go to Code -> Preferences -> Settings and change the following entry from auto to indentation 1 "editor.foldingStrategy...

JavaScript: javascript 中x++和++x的不同

++ 含有隐式的赋值

”++”含有隐式的赋值 “++”运算符在操作数之前,称为“前增量”(pre-increment)运算符,它对操作数进行增量计算,并返回计算后的值。 当“++”运算符在操作数之后,称为“后增量”(post-increment)运算符,它对操作数进行增量计算,但返回未做增量计算的(unincrement)值。 1 2 3 var i=1,j=++i;//i和j的值都是2。 va...

JavaScript: es5 中的模块介绍

为模块定义引入包装函数,并保证它的返回值和模块的API保持一致。

为模块定义引入包装函数,并保证它的返回值和模块的API保持一致。 js 模块介绍 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function CoolModule() { var something = "cool"; var another = [1, 2, 3]; function doSomething() { cons...

JavaScript: 区分函数声明和表达式最简单的方法

function 关键字是否位于声明的开始

function 关键字是否位于声明的开始 区分函数声明和表达式最简单的方法 区分函数声明和表达式最简单的方法是看 function 关键字出现在声明中的位 (不仅仅是一行代码,而是整个声明中的位置)。 1 2 3 4 5 6 7 8 // 表达式 (function(){})() var foo = function () {} // 声明 function foo() {} ...

React: react UI组件的业务逻辑

import connect from 'react-redux';

当使用 React + Redux 时,组件如何使用 state 和修改 state UI组件 vs 容器组件 1 2 3 4 5 import connect from 'react-redux'; const List = connect( mapStateToProps, mapDispatchToProps )(Count); React UI组件的业务逻辑 ...

React: 在react中通过ref获取input值

this.refs.user.value, ref='user'

在react中通过ref获取input值 1 2 3 4 5 6 this.refs.user.value this.refs.pwd.value <input type="text" ref="user" /> <input type="password" ref="pwd" />

React: 生命周期流程图

挂载、更新和卸载

React 生命周期流程图

JavaScript: 事件传递的3个阶段

addEventListener、捕获、事件处理阶段和冒泡

事件传递的3个阶段 addEventListener 1 2 obj.addEventListener('click', func, true); // 捕获方式 obj.addEventListener('click', func, false); // 冒泡方式 示意图 捕获阶段、事件处理阶段和冒泡阶段 执行栈和异步队列 执行栈:先执行同步代码,再执行异步代...