@mantou1229
2017-12-20T03:46:39.000000Z
字数 30199
阅读 1001
前端学习
带控制器的视频标签, 不同浏览器有不同的文件格式要求
所以用 2 个 source 标签指定不同的视频格式
<video width="300" height="200" controls="controls"><source src="movie.mp4"><source src="movie.ogv"></video>
带控制器的音频标签, 不同浏览器有不同的文件格式要求
所以用 2 个 source 标签指定不同的音频格式
<audio id='id-audio-player' controls="controls"><source src="audio.ogg"><source src="audio.mp3"></audio >
audio 基本操作如下
var a = document.querySelector('#id-audio-player')a.play() //播放a.pause() //暂停a.autoplay //自动播放 (设为true)a.src //链接音频文件a.volume //音量(0-1之间的数)a.duration //音频时间长度a.currentTime = 1 //现在播放第几s(设置)a.playbackRate // 播放速率, 默认是 1
设置 viewport
viewport 是 html 的父元素
在手机上需要用下面的语句设置它的尺寸
网易移动端模板
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><script>//设置remdocument.documentElement.style.fontSize = document.documentElement.clientWidth / 7.5(iPhone6相对宽度) + 'px';//通过设计图宽度 / 100 来得出相对宽度 rem//比如iphone5 设计图宽度640 相对宽度 6.4</script>
| 属性 | 说明 |
|---|---|
| width=device-width | 宽度等于设备宽度 |
| height=device-height | 高度等于设备宽度 |
| initial-scale | 初始缩放比例 |
| minimum-scale | 允许用户缩放的最小比例 |
| maximum-scale | 允许用户缩放的最大比例 |
| user-scalable | 是否允许用户缩放 |
响应式设计就是一套 CSS 根据当前的分辨率选择不同的样式
媒体查询主要用来:
- 检测媒体的类型, 比如 screen, tv等
- 检测布局视口的特性, 比如视口的宽高分辨率等
<style>@media all and (min-width: 200px) and (max-width: 300px){body {background: red;}}//网易移动端字体设置@media screen and (max-width: 321px) {body {font-size:16px}}@media screen and (min-width: 321px) and (max-width:400px) {body {font-size:17px}}@media screen and (min-width: 400px) {body {font-size:19px}}</style>
上面代码中, all 是媒体类型, 代表任何设备
and 是逻辑操作
意思是, 对于任何设备, 在宽度在 200-300 的范围内应用这个样式
举例:<
h1id="id-h1" class="class-h1"> 琉璃 < /h1 >
一切标签都可被选择包括html, style等
| 元素 选择器 | 符号 | 优先级 从高到低 |
|---|---|---|
| !important | ! | h1 { color: red !important; } |
| id | # | #id-h1 { color: red; } |
| class | . | .class-h1 { color: red; } |
| 标签 | 无 | h1 { color: red; } |
| 定义 | 优先级 从高到低 |
|---|---|
| ! | !important |
| 内联 | 禁止使用 < h1 > Hello World < /h1 > |
| 中联 | < style > h1{ color: red; } < /style > |
| 外联 | < link rel="stylesheet" href="tag.css" > |
body {background: lightblue; /* 背景色 */margin:0px; /* 外边距 */border:0px; /* 边框 */border-style: solid; /* 边框样式 */padding:0px; /* 内边距 */font-family: Microsoft YaHei; /* 字体 */font-size: 22px; /* 字体大小 */text-align: center; /* 对齐 */}.tanChuang {z-index: 100; /* 顶层 */position: fixed; /* 定位 */top: 0px; /* 顶部 */left: 0px; /* 左部 */width: 100%;height: 100%;opacity: 0.96; /* 透明度 */background: black;color: white;}.tanCenter {position:relative;top: 50%;transform: translateY(-61.8%); /* Y轴距离 */}.circle {width: 50px;height: 50px;border-radius: 50%; /* 圆角 */}background 相关属性和缩写background-color: #233;background-image: url(bg.png);background-repeat: no-repeat;background-attachment: fixed; 背景图片随滚动轴移动方式background: #233 url(bg.png) no-repeat;三种缩写, 分别对应有 4 2 3 个值的时候的解释, padding 同理margin: top right bottom leftmargin: (top/bottom) (right/left)margin: top (right/left) bottomoverflow属性visible 默认auto 需要的时候加滚动条hidden 隐藏多余元素scroll 就算用不着也会强制加滚动条
内联元素 居中 text-align: center
区块元素 居中 margin: 0px auto;
| :link | 未访问 | :hover | 悬停 |
|---|---|---|---|
| :visited | 已访问 | :active | 选定 |
a:link { color: white; text-decoration: none; } /*去下划线*/a:visited{ color: black; }a:hover { color: red; cursor: pointer; } /*鼠标样式*/a:active { color: lightblue; }a.class:visited {color: white;} /* 独立伪类 */
| 值 | 描述 |
|---|---|
| static | 默认 static |
| relative | 相对定位 可相对自身偏移 |
| absolute | 完全绝对定位, 忽略其他所有东西, 往上浮动到 非 static 的元素 |
| fixed | 基于 window 的绝对定位, 不随页面滚动改变 |
非 static 元素可以用 top left bottom right 属性来设置坐标
非 static 元素可以用 z-index 属性来设置显示层次
e.pageX——相对整个页面的坐标
e.clientX——相对可视区域的坐标
e.offsetX——相对当前坐标系的border左上角开始的坐标
| 容器的属性 | 描述 |
|---|---|
flex-direction:row |
属性决定主轴的方向(即项目的排列方向 |
| row,row-reverse | 主轴为水平方向,起点在左(右)端 |
| column,column-reverse | 主轴为垂直方向,起点在上(下)沿 |
flex-wrap:nowrap |
定义如果一条轴线排不下如何换行,默认不换行 |
| wrap,wrap-reverse | 换行,第一行在上(下)方 |
flex-flow |
flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap |
justify-content |
属性定义了项目在主轴上的对齐方式 |
| flex-start,flex-end | 左对齐(默认),右对齐 |
| center,space-between | 居中,两端对齐,项目之间的间隔都相等 |
| space-around | 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍 |
align-items |
属性定义项目在交叉轴上如何对齐 |
| stretch | (默认值)如果项目未设置高度或设为auto,将占满整个容器的高度 |
| flex-start,flex-end | 交叉轴的起(终)点对齐 |
| center,baseline | 交叉轴的中点对齐,项目的第一行文字的基线对齐 |
align-content |
定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用 |
| flex-start,flex-end | 与交叉轴的起(终)点对齐 |
| center | 与交叉轴的中点对齐 |
| space-between | 与交叉轴两端对齐,轴线之间的间隔平均分布 |
| space-around | 每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍 |
| stretch(默认值) | 轴线占满整个交叉轴 |
| 项目的属性 | 描述 |
|---|---|
order:0 |
定义项目的排列顺序。数值越小排列越靠前,默认为0 |
flex-grow:0 |
定义项目的放大比例,默认0即如果存在剩余空间,也不放大 |
flex-grow:1 |
属性都为1,则它们将等分剩余空间(如果有的话) |
flex-grow:2 |
如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍 |
flex-shrink:1 |
定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小 |
flex-shrink:0 |
如果一个项目的属性为0,其他项目都为1,则空间不足时,前者不缩小,负值无效 |
flex-basis:auto |
定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小 |
flex-basis:350px |
可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间 |
flex |
是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。 |
flex:auto,none |
默认值分别是(1 1 auto) 和 (0 0 auto) |
align-self:auto |
允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch.该属性可能取6个值,除了auto,其他都与align-items属性完全一致 |
| 值 | 描述 |
|---|---|
| none | 不显示 |
| block | 独占一行(默认有div p ul ol li h1 h2 h3 h4 h5 h6) |
| inline | 内联元素 无法设置宽高 |
| inline-block | 内联元素 可以设置宽高 |
| BOX | 单位 | 描述 |
|---|---|---|
| margin: | 0px; | 外边距 |
| border: | 0px; | 边框 |
| padding: | 0px; | 内边距 |
| width: | 80% or 0px; | 宽 |
| height: | 100% or 0px; | 高 |
| 动画 | 功能 |
|---|---|
| transform | 2D 变形 |
| transition | css动画(运动时间,运动对象,运动速度,等待时间) |
| animation | 多过程动画效果(具体看链接) |
| 定义 | 插入 < /body > 之前 顺序执行 |
|---|---|
| 中联 | < script >log('Hello World!')< /script > |
| 外联 | < script src="Echo.js" charset="utf-8">< /script > |
| 属性 | 秒懂释义 | 相当于 |
|---|---|---|
| slice( ) | 复制 切片并返回 | 支持负索引 |
| splice(开始,长度,元素) | 删除插入并返回 | 开始的地方插入 |
| concat( array ) | 连接 数组 | |
| includes( str[ ] ) | 检查 是否包含 str[ ] 返回 bool | |
| indexOf() | 返回元素第一次在数组中出现的位置,无返回-1 | |
| length | 返回长度 | 长度可设置以清空 |
| push( ) | 末尾 添加元素 | push(1,2,[1,2]) |
| unshift( ) | 头部 添加元素 | |
| pop( ) | 尾部 删除一个元素 | |
| shift( ) | 头部 删除一个元素 | |
| join( str ) | 返回 字符串 str 分隔 | |
| reverse( ) | 翻转 所有元素 | |
| sort( ) | 排序函数(需提供排序方式函数) | |
| map() | 参数是函数,返回一个新数组 | |
| filter() | 参数是一个过滤函数,返回符合条件的新数组 | |
| toString() | 返回数组的字符串形式 |
| 属性 | 说明 |
|---|---|
| slice( ) | 返回 切片 |
if( == ) |
判断相等需要双等号 |
| includes( str ) | 检查 是否包含 str 返回 bool |
| split( str ) | 以 str 分割字符串 返回 array |
| toLowerCase() | 字母转小写 |
| toUpperCase() | 字母转大写 |
| indexOf( str ) | 查找 是否包含 str 返回 下标 |
| match( str ) | 整个匹配结果以及任何括号捕获的匹配结果的 Array,没有就返回null |
| replace( pattern, str ) | 替换 pattern 为 str ;/pattern/g全部替换 |
| search( pattern ) | 查找 pattern 返回下标 否则返回 -1 |
dict= { '初中生':6, '高中生':7, '大学生':8 }
| 属性 | 说明 |
|---|---|
dict = { key : 'value', } |
创建 |
dict.(key) |
点语法读取 |
dict ['小学生'] = 4 |
添加 |
dict ['小学生'] = 5 |
修改 |
delete dict ['大学生'] |
删除 |
Object.keys( dict ) |
返回 keys |
var Student = function(name, height) {// 用 this.变量名 来创造一个只有类的实例才能访问的变量this.name = namethis.height = height}// 用 new 函数名(参数) 初始化一个类的实例var s1 = new Student('gua', 169)// 可以改变 s1 的属性s1.name = 'xiaogua's1.height = 1.69// 可以创建多个互相独立的实例var s2 = new Student()var s3 = new Student()//可以给类增加一些方法(函数)Student.prototype.greeting = function() {console.log(`hello, I'm ${this.name}`)}// 可以调用实例的方法s1.greeting()ES6类的表示方法class Student {// 初始化的套路constructor(name, height) {this.name = namethis.height = height}// 方法没有 vargreeting() {console.log(`hello, I'm ${this.name}`)}update(name, age) {this.name = namethis.age = age}}class Teacher extends Student {//继承类的用法}
apply call bind //是用来给函数指定 this 用的apply 接受两个参数第一个参数是函数里面的 this第二个参数是要传给函数的参数列表, 类型是 数组(暂定), apply 会把数组拆成一个个的参数传给函数console.log.apply(console, arguments) //直接用call 和 apply 类似, 但是小有区别, 如下第一个参数和 apply 一样第 2, 3, 4, 5, ... 个参数会依次作为参数传给函数console.log.call(console, 1, 2, 3, 4, 5, 6, 7) //直接用bind 函数/*不直接调用*/, 而是返回一个函数让你来调用第一个参数是用来指定函数里面的 this, 和 apply call 一样var log = console.log.bind(console) //不直接用log() //才可调用
| 属性 | 说明 |
|---|---|
| let | 就是限制作用域在 {} 内的 var |
| const | 用来声明一个不可赋值的变量,也是限制作用域在 {} 内的 var |
| Set | 和 Array 相似的数据结构不同之处在于 Set 中的元素都是不重复的 |
| Set | var s = new Set() add 方法添加元素s.add(1) |
| Set | has 方法检查元素是否在 set 中 s.has(1) => true |
| Set | size 属性相当于 length s.size => 2 |
| Set | delete 方法删除一个元素s.delete(1) |
| Map | Object相似 var m = new Map() |
| Map | set 方法增加一个值m.set('name', 'gua') |
| Map | get 属性得到一个值m.get('name') |
| ... | 叫扩展符号, 作用是把数组解开成单独的元素 |
| ... | var a1 = [1, 2, 3] var a2 = [...a1, 4] => [1, 2, 3, 4] |
| ... | 也可以传参var a1 = [1, 2, 3] log(...a1) => '1,2,3' |
| ... | 语法可以实现可变长度的参数, 多余的参数会被放进 args 数组中 |
| ... | var foo = function(a, ...args) {log(a, args.length)} foo(1, 2, 3, 4) |
| 解包 | var [a, b] = [1, 2] [a, b] = [b, a] |
| 箭头 | (参数1, 参数2) => 语句 function(参数1, 参数2) {return 语句} |
var x = JSON.stringify( [1,2,3] ) //编译var y = JSON.parse( x ) //读取
// 将 fs.readFile 的操作封装成 promise,这样就可以使用 promise 的 api 了const readFile = function(filename) {// 一般前端的写法// return new Promise(function(resolve, reject) {})const p = new Promise(function(resolve, reject) {const fs = require('fs')const options = {encoding: 'utf8'}fs.readFile(filename, options, function(error, content) {if (error !== null) {reject(error)} else {resolve(content)}})})return p}// 使用 promise 读取文件就不用写成回调的形式了// 直接按照同步的写法就好了// 可以无限 then, 只要你保证上一个 then 返回了东西即可let promise = readFile('foo.txt')promise.then(function(content) {console.log('debug file content', content)const c = content + ' suffix1'return c}, function(error) {console.log('debug error message', error)}).then(function(c1) {console.log('second then', c1)const c = c1 + ' suffix2'return c}).then(function(c) {console.log('third then', c)})console.log('GUA ****** line 46')// 上面的写法也可以写成下面这样// 把 reject 的操作放在 catch 里面promise.then(function(content) {console.log('debug file content', content)}).catch(function(error) {console.log('debug error message', error)})// 有时候会碰到批量执行异步操作,如果直接用循环 + 调用函数的形式会比较麻烦// 使用 Promise.all 就很方便了// all 方法是直接挂在 Promise 类上的,而 then catch 这些方法是挂在原型上// Promise.all 会把数组里面所有的 promise 对象都执行完// 再往下调用Promise.all(list).then(function(content) {console.log('Promise.all, content', content)})
var file = app.$('videoInput').files[0];// 重命名var aafile = new File([file], "aa.mp4");
| 属性 | 说明 |
|---|---|
| location | 管理 URL(改变 href 属性就可以跳转页面) |
| navigator | 对象是用来查询浏览器的信息的 例如navigator.userAgent |
| history | 对象是用来处理历史纪录的 |
| screen | 管理屏幕 |
| window | 管理浏览器所有的东西 |
| open(‘url’,‘_self/_blank’) | 打开一个新窗口 打开自身或另打开 |
| close() | 关闭窗口 |
| document.body.scrollTop | 滚轮离顶部距离 |
history.length // 历史列表中的 url 数量history.back() // 相当于点击后退按钮history.forward() // 相当于点前进history.go(-2) // 相当于点击两次后退按钮//H5新函数var state = {page: "settings"}history.pushState(state, "settings", "/settings")/*三个参数分别是1.自定义对象2.新页面的标题, 但是现在还没有浏览器实现这个功能3.新页面的地址(/...)用户点击 前进 后退 按钮的时候, 会触发 window 的 popstate事件于是可以在这里操作*/window.addEventListener("popstate", function(event) {var state = event.state;// state 就是 pushState 的第一个参数 被储存console.log('pop state', state)})/*还有一个 replaceState 函数, 它的作用和 pushState 一样, 只是不生成一条历史纪录只能在相同域名下使用*/
<input id="id" type="text" value="Gua">
| 属性 (元素 .class #id) | 说明 |
|---|---|
var omg = document.querySelector( '#id' ) |
获取 DOM对象 |
var omgs = document.querySelectorAll('.classname') |
获取DOM对象组 |
var omgValue = omg.getAttribute( 'value' ) |
获取 属性值 |
omg.setAttribute( 'value' , 'Gua' ) |
修改 属性值 |
omg.hasAttribute( 'value' ) |
查询 是否存在 |
omg.removeAttribute( 'type' ) |
删除 某个属性 |
var allProperty = omg.attributes |
查找 所有属性 |
omg.remove( ) |
整个删除 元素 |
omg.dataset.() |
获取data-()值 |
| var button = document.createElement('button') | 创建 元素 |
| button.innerHTML = '注册用户' | 设置属性 |
omg.appendChild(button) |
给一个元素添加子元素 |
omg.insertAdjacentHTML( 'beforeend', html ) |
插入 HTML |
| insertAdjacentHTML | 标签 描述 |
|---|---|
| beforebegin | 开始标记 前 |
| afterbegin | 开始标记 后 |
| beforeend | 结束标记 前 |
| afterend | 结束标记 后 |
贮藏:localStorage[
'name'] = '馒头'
取出:localStorage['name']
电脑本地储存 5MB Object,只能存字符串,可使用 Json 转字符串
localStorage 没有过期时间, 要用 clear remove 主动删除数据
贮藏:sessionStorage[
'name'] = '馒头'
取出:sessionStorage['name']
sessionStorage 的数据在用户关闭浏览器后将被删除
事件绑定:
区分元素 > 绑定元素 > 触发Event > 操作元素
| 说明 |
|---|
var button = document.querySelector( "#id-div-cont" ) |
| // 获取 元素 |
button.addEventListener( 'click', callback) |
| // 事件 绑定 或 委托 |
| 常用事件 | 说明 |
|---|---|
| 'focus' | 获得 焦点 |
| 'blur' | 失去 焦点 |
| 'click' | 单击 |
| 'dblclick' | 双击 |
| 'mousedown' | 鼠标点下 |
| 'mousemove' | 鼠标移动 |
| 'mouseup' | 鼠标抬起 |
| 'mouseover' | 鼠标悬停 |
| 'mouseout' | 鼠标移开 |
| 'keydown' | 按下 某键 |
| 'ended' | 播放结束 |
| submit | 当<form>提交时触发 |
| change | 当<input><select><textarea>的内容改变时触发 |
| 'animationend' | 动画结束之后 |
| onload | 事件页面加载时发生 |
| onscroll | 页面滚动时发生 |
| onresize | 页面改变大小时发生 |
| 事件 event 参数 | 描述 |
|---|---|
| event.target.parentElement | 父元素 |
| event.target | 元素 |
| event.target.children | 子元素 |
| event.target.parentElement.children | 父子元素 |
var ajaxGet = function( ku ) {var r = new XMLHttpRequest() // 创建 AJAX 对象r.open( 'GET', ku.url, true ) // 设置 请求方法 地址r.onreadystatechange = function() {if (r.readyState === 4) { // 如果 完成ku.callback(r.response) // 注册 响应函数 结果}}r.send() // 发送 请求}// readyState有4种状态 0. 未初始化 1.载入 2.载入完成 3.交互 4.交互完成var ku = {url: '/login' , // 地址callback: function(response) { // 响应函数console.log(response)}}ajaxGet( ku )
var ajax = function( ku ) {var r = new XMLHttpRequest( ) // 创建 AJAX 对象r.open( ku.method, ku.url, true ) // 设置 请求方法 地址r.setRequestHeader('Content-Type', ku.ContentType)r.onreadystatechange = function() {if (r.readyState === 4) { // 完成ku.callback(r.response) // 注册 响应函数 结果}}r.send( ku.data ) // 发送 请求}var ku = {method: 'POST', // 请求方法url: '/login', // 地址ContentType: 'application/json',// 数据格式data: JSON.stringify({ // 发送内容username: 'abc',password: '123',}),callback: function(response) { // 响应函数console.log('result:', response )}}ajax( ku )
请求和返回是一样的数据格式,分为4部分:
1,请求行或者响应行
2,HTTP Header(请求的 Header 中 Host 字段是必须的,其他都是可选)
3,\r\n\r\n(连续两个换行回车符,用来分隔Header和Body)
4,HTTP Body(可选)请求的格式,注意大小写(这是一个不包含Body的请求):
原始数据如下
'GET / HTTP/1.1\r\nhost:g.cn\r\n\r\n'
打印出来如下
GET / HTTP/1.1
Host: g.cn
r\n(空一行)
| 选择器 | |
|---|---|
$( '.class' ) |
匹配所有 符合元素 返回 数组 |
$( ' #id, .class ,div ') |
组选择 |
.find( '#id' ) |
向下查找子元素 |
.closest( '.class' ) |
查找 父元素(一直向上 找到为止) |
| .parent() | 查找 父元素 |
| .next() | 下一个元素 |
| .prev() | 上一个元素 |
| .children() | 查找 子元素 |
| .parent().children() | 查找 父子元素 |
| .siblings() | 查找 父子元素(除过 自己) |
| .first() | 第一个元素 |
| .last() | 最后一个元素 |
| .slice( , ) | 同数组slice()方法一致 |
$('ul.lang li'); // 选出JavaScript、Python和Lua 3个节点$('ul.lang li:first-child'); // 仅选出JavaScript$('ul.lang li:last-child'); // 仅选出Lua$('ul.lang li:nth-child(2)'); // 选出第N个元素,N从1开始$('ul.lang li:nth-child(even)'); // 选出序号为偶数的元素$('ul.lang li:nth-child(odd)'); // 选出序号为奇数的元素
| dom操作修改 | |
|---|---|
| .text( ) | 取值文本(有参数则为赋值) |
| .html( ) | 取值字符串(有参数则为赋值) |
| .show() | 显示 |
| .hide() | 隐藏 |
| .toggle() | 开关 |
| .hasClass( ) | 查询class 返回 ture 或 false |
| .addClass('className') | 添加class |
| .removeClass( ) | 删除class |
| .removeClass( ) | 删除class |
| .data( ) | 获取data属性 |
| .width()//.height() | 查询宽高,填写参数是设置宽高 |
| .attr( , ) | 第一个参数属性名,查询(有第二个参数赋值) |
| .removeAttr( ) | 填入参数移除属性 |
| .prop() | 与attr类似,但是处理checked等bool属性 |
| .val() | 表单元素专属获取和设置(填参数)对应的value属性 |
| .append( ) | 最末尾 |
| .prepend( ) | 最开头 |
| .before( ) | 同级节点 之前 |
| .after( ) | 同级节点 之后 |
| .remove() | 删除 |
| .empty() | 删除(除过 自己) |
//jQuery对象有“批量操作”的特点可调用css对象方便修改对象的CSS$('#test').css('background-color', 'black').css('color', 'red');var div = $('#test-div');div.css('color'); // '#000033', 获取CSS属性div.css('color', '#336699'); // 设置CSS属性div.css('color', ''); // 清除CSS属性//css()方法将作用于DOM节点的style属性,具有最高优先级
| 动画操作 | |
|---|---|
| .show('slow') | 显示(参数时间1000或者时间描述) |
| .hide(3000) | 同上 |
| .toggle() | 开关 |
| .slideUp() | 窗帘效果的关(参数同上) |
| .slideDown() | ....开 |
| .slideToggle() | 开关 |
| .fadeOut() | 淡入(参数同上) |
| .fadeIn() | 淡出 |
| .fadeToggle() | 淡入淡出 |
| .animate({opacity: 0.25,width: '256px'},3000,callback) | 自定义动画,三个参数,1变化对象,2时间,3动画结束回调函数 |
| .delay(1000) | 暂停动画 |
| .data('id') | <div data-id='101'>取data值 |
function hello() {alert('hello!');}a.click(hello); // 绑定事件// 10秒钟后解除绑定:setTimeout(function () {a.off('click', hello);}, 10000);使用off('click')一次性移除已绑定的click事件的所有处理函数无参数调用off()一次性移除已绑定的所有类型的事件处理函数a.on('click', function () {alert('Hello!');})// 两者等价(常用下一种)a.click(function () {alert('Hello!');})//事件委托用法$( '#id-div-cont' ).on( 'click', '.del', Event )// 绑定 父元素 #id-div-cont 监听.del(如果点击的是.del则发生)
each 遍历
var eve = function(i, eve) {console.log(i, eve)}$('.notePad_one').each( eve )
map 遍历 返回值
var a = [1, 2, 3, 4, 5]var eve = function( i ) {return i * i}var b = $.map( a, eve )// 结果 b = [1, 4, 9, 16, 25]//map与each最大区别是返回值
filter 过滤器
var a = [1, 2, 3, 4, 5]var eve = function( i ) {return i % 2 == 1}var b = $.grep( a, eve )// 结果 b = [1, 3, 5]
var request = {url: '/uploads/tags.json',type: 'get',success: function(r) {console.log(r)},error: function() {console.log(arguments)}}$.ajax(request)//基础的jq ajax方法$.ajax({name:value, name:value, ... })// jq get方法$.get("test.php", function(data){console.log(data);})//jq post 方法$.post(URL,{name:'小明'},function(data,status,xhr),dataType)
Bootstrap设置响应式的CSS布局
<!--配置bootstrap需要加入以下设置--><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"><script src=' jQuery'>` bootstrap 必须引用 jq</script>
col-(xs,sm,md,lg)每一个div可以加入多个col-?类 叫做混合布局,会根据屏幕自适应布局.
每一横行都是新的12格,如果父元素8格,子元素还是新的12格
| ClassName | 类效果 |
|---|---|
| col-(xs,sm,md,lg)-(0-12) | 布局:一个屏幕分成12栏网格效果 |
| row | 设置新的一排的布局 |
| container | 内容居中 |
| page-header | 标题下面加一条灰色的线 |
| col-(xs,sm,md,lg)-push-(0-12) | 在col-?尺寸上把主体内容向右推?个网格宽度 |
| col-(xs,sm,md,lg)-pull-(0-12) | 在col-?尺寸上把主体内容向左拉?个网格宽度 |
| clearfix | 修复元素浮动的问题 |
| col-(xs,sm,md,lg)-offset-(0-12) | 在col-?尺寸把主体内容向右偏移?个网格宽度 |
| visible-(xs,sm,md,lg) | 在特定尺寸上显示内容 |
| hidden-(xs,sm,md,lg) | 在特定尺寸上隐藏内容 |
| pull-right(left) | 靠右显示与靠左显示 |
| ClassName | 类效果 |
|---|---|
| navbar | 灰色边框的条 |
| navbar-light(dark) | 亮色背景与暗色背景 |
| navbar-default | 条是灰色背景 |
| navbar-inverse | 条是暗色背景 |
| navbar-fixed-top(bottom) | 导航栏固定在页面顶部(不滚动) |
| navbar-static-top(bottom) | 导航栏固定在页面顶部(随页面滚动) |
| navbar-brand | 给标签添加样式 |
| nav navbar-nav | 给ul添加样式 |
| nav-item | 表示这是导航栏里的一个项目 |
| active | 添加灰色的背景 |
| glyphicon | 使用小图标(用span标签使用) |
| glyphicon glyphicon-search | 搜索小图标 |
| form-control | input添加样式 |
| navbar-from | form样式 |
| navbar-left | 向左浮动 |
| btn | 按钮基本样式 |
| btn-primary | 按钮的一个样式 |
| btn-sm | 按钮大小 |
| navbar-btn | 按钮边距 |
| navbar-left(right) | 元素靠左(靠右) |
| collapse navbar-collaps | 响应式导航栏类(div包围要折叠的导航界面) |
| navbar-toggle | 切换显示隐藏的界面按钮类 |
data-toggle='collapse' data-target='#(div包围元素的id)' |
切换按钮指定2个data属性 |
| navbar-header | 隐藏后显示的界面类 |
| ClassName | 类效果 |
|---|---|
| modal-backdrop in | 添加一层暗色半透明的背景 |
data-toggle='modal' data-target='#(对话框id)' |
给一个按钮绑定开关id对话框功能 |
| modal fade | 过渡的效果 |
| data-dismiss='modal' | 设置关闭对话框功能 |
| tabindex='-1' | 点击tab键优先跳转这个位置 |
| data-backdrop='false' | 关闭自动暗色背景功能 |
| 'show.bs.modal' | 事件名,对话框显示时发生 |
| 'hide.bs.moda' | 事件名,对话框隐藏时发生 |
| ClassName | 类效果 |
|---|---|
| carousel | 旋转木马组件大类 |
data-ride='carousel' data-interval='?000' |
自动播放与?s一次 |
| data-pause='false' | 默认值hover 鼠标悬浮暂停播放 |
| data-wrap='false' | 默认为true 播放结束循环播放 |
| slide | 过度效果 |
| carousel-inner | 放置旋转东西的小类 |
| item | 每一个幻灯片项目都放到一组带item类的容器里 |
| item active | 幻灯片开始播放的那个项目的上添加 |
<a href='#(carousel)的id'... |
为幻灯片添加下一张功能 |
| left(right) carousel-control | 为a标签添加向左(右)转换功能的类 |
| data-slide='prev(next)' | 为a标签添加向左(右)转换功能的设置 |
glyphicon glyphicon-chevron-left(right) |
左右的小图标 |
<ol class='carousel-indicators' |
添加幻灯片对应小圆点 |
<li data-target='#(id)' data-slide-to='(0)' |
0对应第一个项目 |
| active | 默认从添加这个类的项目开始旋转 |
| 'slide.bs.carousel' | 事件,播放时触发 |
| 'slid.bs.carousel' | 事件,播放完成触发 |
lodash 是一个非常实用的 js 工具库 _是表达符号
each
_.each(list(数组或对象), (v, k) => {// each 方法的两个参数// 如果 list 是 列表,那么 v 和 k 分别是指 list 的 element/index// 如果 list 是 对象(字典),那么 v 和 k 分别是指 object 的 value/keyconsole.log('element and index', v, k)})
map (旧数组/对象生成一个新数组)
const list2(新数组) = _.map(list1(旧数组), (v, k) => {const r = v * vreturn r})console.log('list2', list2)
filter (遍历数组/对象,返回符合判断函数中的元素)
var u(符合条件的新数组) =_.filter(us(数组可包含对象), (e) => {var b = e.score > 70(bool值)return b})console.log('filter u', u)
orderBy (按照条件排序,先按score升序,如果有score一样的,再按 name降序)
var users = _.orderBy(us, ['score', 'name'], ['asc'(升序), 'desc'(降序)])console.log('order by users', users)
flatten (减少一层嵌套数组(只减少一层),也就是可以将二维数组拍成一维数组)
var l = [1,[2],[3, [4]],[5, [6], [7]],]var f = _.flatten(l)console.log('flatten result', f)
compact 剔除数组中的假值元素(js 中假值元素分别为false null 0 NaN '' undefined)
var result = _.compact(l(包含假值元素的数组))console.log('compact result', result)**isEqual** isEqual比较两个对象或者数组是否相等var o1 = {'key': 1,}var o2 = {'key': 1,}var result = _.isEqual(o1, o2)console.log('isEqual result', result)
result (获取嵌套对象的值)
var o = {'k1': {'k2': {'k3': {'k4': 'value in nested dict'}}}}var path = 'k1.k2.k3.k4'var result = _.result(o, path)console.log('result nested result', result)
cloneDeep 深拷贝(改变赋值不影响原函数的拷贝)
var o = {'a': [1],'b': [2],}var deep = _.cloneDeep(o)console.log('deep', deep)
random (返回给定范围的随机值)
var a = 10 var b = 20// 返回 a 和 b 之间的一个整数var r1 = _.random(a, b)console.log('random r1', r1)//如果指定第三个参数为 true,这个参数的意思是指 floating ,那么返回的就是一个浮点数var r2 = _.random(a, b, true)console.log('random r2', r2(浮点数))
shuffle (返回打乱顺序后的数组)
var l = [1, 2, 3, 4,]const s = _.shuffle(l)console.log('shuffle l', s)
注意事项
1.确保在初始化根实例之前注册了组件
2. 内部使用vue属性需要使用this
3.要在内联语句处理器中访问原生 DOM 事件。可以用特殊变量$event把它传入方法
4.在数据变化之后立即使用 Vue.nextTick(callback) == this.$nextTick(callback)
| Vue属性 | 说明 |
|---|---|
| el | 绑定的id |
| data | 储存的一些属性 |
| methods | 储存的一些方法(函数) |
| filters | 储存一些过滤函数 |
| computed | 储存一些计算属性函数(存在缓存,一般情况可以用methods替代) |
| watch | 数据改变时触发,允许我们执行异步操作 |
| components | 局部注册组件属性 |
| props | 子组件要显式地用 props 选项声明它期待获得的数据 |
| template | 组件模板 |
| data(组件) | 组件data必须是函数return出的对象 |
| Vue.set(object, key, value) | 将响应属性添加到嵌套的对象上 |
| directives | 注册局部指令 |
| beforeCreate | 在实例初始化之后数据观测之前被调用 |
| created | 实例被创建之后被调用 |
| beforeMount | 在挂载开始之前被调用:相关的 render 函数首次被调用 |
| mounted | el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子 |
| beforeUpdate | 数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前 |
| updated | 由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子 |
| activated | keep-alive 组件激活时调用 |
| deactivated | keep-alive 组件停用时调用 |
| beforeDestroy | 实例销毁之前调用。在这一步,实例仍然完全可用 |
| destroyed | Vue 实例销毁后调用 |
this.$on('事件名字',function(r){console.log(r)})//监听自定义事件 第一个事件名字 第二个参数触发函数this.$emit('事件名字','输入值')//触发自定义事件 第一个参数名字 第二个参数函数参数
常用vue指令
| 指令 | 说明 |
|---|---|
| v-if(show) | true显示 false隐藏 |
| v-else | 跟v-if并列的话,v-if隐藏它显示 |
| v-bind:() | 绑定某个属性,v-bind可隐藏 :() |
| v-text | 纯文本内容显示 |
| v-html | 渲染显示 |
| v-on:click | 绑定点击click事件也可以用@click |
| v-model | input默认值(复选单选按钮,选择列表) 修改后值随之改变 |
| v-once | 渲染的值不发生变化 |
| v-for | ( ,index)in( ) 循环取值 index为序号,也可以是循环整数 |
| v-for | (value,key,index)in(object)也可以循环取值object |
| key | 为vue指定唯一性key值,可以防止切换的重复组件被复用 |
| is | <tr is="my-row"></tr>将tr替换为my-row模板 |
| scope | 值对应一个临时变量名,此变量接收从子组件中传递的 props 对象 |
| ref | 可以使用 ref 为子组件指定一个索引 IDnew Vue({ el: '#id' }).$refs.(ID) |
| inline-template | 组件将把它的内容当作它的模板,而不是把它当作分发内容 |
:duration="{ enter: 500, leave: 800 }" |
定义动画持续时间 |
html代码事例
<div id='app'><div v-if(show)='welcome' v-bind:title='title' v-once><!--1.显示隐藏元素(if是添加show是改变display) 2.v-bind(可省略)绑定title属性为'title' 3.message值不随着改变-->{{ loggedIN? message : '请先登录 '}}<!--loggedIN值为true hello false 请先登录 --></div><div v-else> //v-else-if也可以使用Now you don't</div><!--if为false时显示 --><div v-text='message'></div> <!--message纯文本显示 --><div v-html='message'></div> <!--渲染显示 --><!--触发的事件调用 event.preventDefault()--><form v-on:submit.prevent="onSubmit"></form><form v-on:submit.prevent></form><!-- 点击事件将只会触发一次 --><a v-on:click.once="doThis"></a><!-- 阻止单击事件冒泡,可以串联按照顺序执行 --><a v-on:click.stop.once="doThis"></a><!-- 只当事件在该元素本身(比如不是子元素)触发时触发回调 --><div v-on:click.self="doThat">...</div><!-- 在 "change" 而不是 "input" 事件中更新 --><input v-model.lazy="msg" ><!-- 自动转换输入的字符为数字 --><input v-model.number="age" type="number"><!-- 自动过滤用户输入的首尾空格 --><input v-model.trim="msg"><input v-model='message'><!--input框中默认为message 修改此值即修改data里message值 --><ol><li v-for='comment in comments //(value, key, index) in object)'>{{ comment.content }}</li><!--循环comments数组创建li 可通过app.comments.push({content:'lalala'})添加新的li元素--></ol><!--组件化演示 --><comment v-for='comment in comments' v-bind:comment='comment'></comment> <!--效果同上li --><div>
js代码事例
//定义全局组件化Vue.component('comment', { //声明组件名字template: '<li> {{ comment.content }} </li>', //组件模板// '<slot> :) </slot>' 内容分发//包含slot标签的div没有内容时显示:) 有内容时隐藏props: ['comment'], //组件传入的对象/* prosp: {comment: {type:String,default: 'button', 默认值required: true, 必须有值validator (value) {return value.length > 3 值长度大于 3} prosp的另一种对象形式} 可以过滤传入对象的属性}*/methods: {logMessage() {console.log(this.message)} //组件化中也可以直接定义data与methods}})var vm = new Vue({el: '#app', //选择应用vue的选择器,等效于vm.$mout('#app')methods: {logMessage() {console.log(this.message)}},data: {message: 'hello',title: 'hello', //鼠标放上去显示welcome: true, //true显示这个元素 false隐藏loggedin: false,comments: [{content: 'yayaya1'},{content: 'yayaya2'},{content: 'yayaya3'},]},created: function () {// 实例被创建之后调用console.log('hello word~')}})
<div id="app"><h1>Hello App!</h1><p><!-- 使用 router-link 组件来导航. --><!-- 通过传入 `to` 属性指定链接. --><!-- <router-link> 默认会被渲染成一个 `<a>` 标签 --><router-link to="/foo">Go to Foo</router-link><router-link to="/bar">Go to Bar</router-link><!-- 渲染模板里面根据路由再次嵌套渲染--><router-link to="/user/foo/profile">/user/foo/profile</router-link></p><!-- 路由出口 --><!-- 路由匹配到的组件将渲染在这里 --><router-view></router-view></div>
const Foo = { template: '<div>foo</div>' }const Bar = { template: '<div>bar</div>' }const User = { //动态参数值会被设置到 this.$route.paramstemplate: '<div>User {{ $route.params.id }}</div>'}const User = {template: `<div class="user"><h2>User {{ $route.params.id }}</h2><router-view></router-view></div>`}const router = new VueRouter({routes: [{ path: '/foo', component: Foo },{ path: '/bar', component: Bar },// 动态路径参数 以冒号开头{ path: '/user/:id', component: User,//自路由再次渲染children: [ { path: 'profile', component: UserProfile },{ path: 'posts', component: UserPosts } ]}]})const app = new Vue({router}).$mount('#app') //$mount('#app')相当于 el:'#app'
router.push会向history栈添加一个新的记录点击浏览器后退按钮回到之前的 URL
router.replace与router.push很像,唯一的不同就是,它不会向history添加新记录
router.go参数是一个整数,意思是在 history 记录中向前或者后退多少步
{ path: '/a', redirect: { name: 'foo' }}
重定向的意思是,当用户访问 /a时,URL 将会被替换成 /b,然后匹配路由为 /b
{ path: '/a', component: A, alias: '/b' }
/a 的别名是 /b,意味着,当用户访问 /b 时,URL 会保持为 /b,但是路由匹配则为 /a,就像用户访问 /a 一样
router.beforeEach((to, from, next) => {// 全局注册的钩子 3个参数 去哪 哪来 干嘛})beforeEnter: (to, from, next) => {//组件内部的钩子 效果一样}beforeRouteEnter (to, from, next) //渲染该组件的对应路由被 confirm 前调用 无thisbeforeRouteUpdate (to, from, next) //在当前路由改变,但是该组件被复用时调用beforeRouteLeave (to, from, next) //导航离开该组件的对应路由时调用scrollBehavior (to, from, savedPosition) {// return 期望滚动到哪个的位置}
var fs = require('fs') //加载fs库赋值于fsfs.readdir('.', (err,files) => { // .当前目录..上一级if(err != null) {console.log(err)} else {console.log('files', files)}}) // 读取当前目录下的文件(readdirSync同步版本)fs.rmdir('目录名',(err) => { })//删除目录文件(目录必须为空)fs.unlink(file, (err) => { })// 删除file文件fs.mkdir('目录名字',(err) => { })//创建目录fs.readdir('目录',(err, files) => {})//读取目录内容fs.writeFile('file', '你好 Node.js', (err) => {})// 创建file文件fs.appendFile('file', '你好 python', (err) => {})//添加文件内容fs.readFile('message.txt', 'utf8', (err, data) => {console.log('读取了文件', data)}) // 读取文件fs.rename('原名字','新名字',(err) => {})//重命名文件var fileReadStream = fs.createReadStream('文件名')var fileWriteStream = fs.createWriteStream('文件名')//读取文件流 写入文件流fileReadStream.pipe(fileWriteStream)//pipe好像管道,可以把读取流接入写入流 效果类似write//pipe可以链式使用fileReadStream.pipe(fileWriteStream).pipe(...)var i = 0fileReadStream.on('data',(chunk) => {console.log(`${i++}接受到:${chunk.length}`)fileWriteStream.write(chunk) //写入每次内容}) //读取次数,每次长度fileReadStream.on('end',() => {})//读取结束事件fileReadStream.on('error',(err) => {})//发生错误事件
// 引入 express 并且创建一个 express 实例赋值给 appvar express = require('express')var app = express()app.use(express.static('static'))//封装一个函数var sendHtml = function(path, response) {var fs = require('fs') // path是读取文件var options = { // options解码环境encoding: 'utf-8'}fs.readFile(path, options, function(err, data){console.log(`读取的html文件 ${path} 内容是`, data)response.send(data)})}// 用 get 定义一个给用户访问的网址// request 是浏览器发送的请求// response 是我们要发给浏览器的响应app.get('/', function(request, response) {var path = 'index.html'sendHtml(path, response)})app.get('/todo/all', function(request, response) {var todos = [{id: 1,task: '吃饭',}]var r = JSON.stringify(todos)response.send(r)})app.post('/todo/add', function(request, response) {// request.body 这个函数可以获取前端post的数据})//打开端口服务器// listen 函数的第一个参数是我们要监听的端口// 这个端口是要浏览器输入的// 默认的端口是 80// 所以如果你监听 80 端口的话,浏览器就不需要输入端口了// 但是 1024 以下的端口是系统保留端口,需要管理员权限才能使用var server = app.listen(8081, function () {var host = server.address().addressvar port = server.address().portconsole.log("应用实例,访问地址为 http://%s:%s", host, port)})
//sync-request 用于下载网页var request = require('sync-request')//cheerio 用于解析网页数据var cheerio = require('cheerio')//模块中函数输出module.exports = 函数名
git init //创建git仓库git add (文件名) //添加文件git commit -m "改动说明" //上传改动git status //查询仓库状态git diff () //查询文件变动git log //查询版本改动git log --pretty=oneline //格式化显示版本改动状态git reset --hard HEAD^ //HEAD当前版本 ^上个版本 ^^上2个版本 HEAD-100 上100个版本git reset --hard (版本号(可只写几个开头)) //回滚到指定版本git reflog //记录每次操作git checkout -- () //文件回滚到最后一次add或commit状态git reset HEAD () //撤销最后一次的git addgit rm () //删除文件git checkout -b dev //创建并切换为dev分支git branch //查看所有分支git checkout master //切换分支到mastergit merge dev //合并指定分支(dev)到当前分支git branch -d(D) dev //删除(强制删除)dev分支git stash git stash pop //储存目前工作现场,读取。。。git remote -v //显示远程仓库信息git push (origin branch-name) //本地推送分支到远程仓库git branch --set-upstream (branch-name origin/branch-name)// 建立本地分支和远程分支的关联git tag (name) //打标签git tag //查看所有标签git tag (v1.0) (提交id) //打历史标签git show (name) //显示对应标签说明git tag -a <tagname> -m "blablabla..." //添加标签说明git tag -d (name) //删除本地标签git push origin :refs/tags/<tagname> //删除一个远程标签git push origin <tagname> //推送一个本地标签git push origin --tags //推送全部未推送过的本地标签//忽略某些文件时,需要编写.gitignoregit config --global alias.(co) checkout //配置简化git命令checkout为co
创建gulpfile.js文件
var gulp = require('gulp') //引入gulpgulp.task('images', function () {return gulp.src('images/*.png').pipe(gulp.dest('dist/images'))})//创建images函数,将images下所有png格式图片复制到dist/images文件下var sass = require('gulp-sass') //编译sass为cssvar connect = require('gulp-connect')gulp.task('server', function() {connect.server({root: 'dist'})})//创建本地服务器监视dist文件下内容var concat = require('gulp-concat'); //合并var uglify = require('gulp-uglify'); //压缩js文件var rename = require('gulp-rename'); //重命名文件gulp.task('scripts', function () {return gulp.src(['javascripts/**/*.js','']).pipe(concat('vendor.js')).pipe(uglify()).pipe(gulp.dest('dist/js'));});//合并文件,取名vendor.js压缩后放在dist/js下var minifyCSS = require('gulp-minify-css');// 压缩css文件 minifyCSS()var imagemin = require('gulp-imagemin');//压缩图片体积 imagemin()var browserSync = require('browser-sync').create();// 游览器同步// 静态服务器gulp.task('browser-sync', function() {browserSync.init({server: {baseDir: "./"}});});// 代理gulp.task('browser-sync', function() {browserSync.init({proxy: "你的域名或IP"});});npm install browser-sync --save-dev//安装browser-syncbrowser-sync start --server forest --files "forest/index.html, forest/css/*.css"//监视forest文件夹下文件--tunnel//使外网也可以访问browser-sync start --proxy localhost:9090//监视指定代理服务器// 直接使用browser-syncbrowser-sync start --server --files "css/*.css, *.html"
webpack (原.js) (处理后.js)module.exports = 'zh is boss!' //name.jsvar name = require('./name') //引入name.jsnpm install css-loader // 处理css文件npm install style-loader // 应用css文件require('style!css!./css/*.css') //引入css文件webpack --devtool source-map //生成可source调试的jsnpm install webpack-dev-serve //生成开发用服务器webpack-dev-server --inline --hot //模块热更新监控//配置webpack文件新建一个名为webpack.config.js的文件module.exports = {devtool: 'eval-source-map',//配置生成Source Mapsentry: __dirname + "/app/main.js",//已多次提及的唯一入口文件output: {path: __dirname + "/public",//打包后的文件存放的地方filename: "bundle.js"//打包后输出文件的文件名}devServer: {contentBase: "./public",//本地服务器所加载的页面所在的目录colors: true,//终端中输出结果为彩色historyApiFallback: true,//不跳转inline: true//实时刷新}}
for (var i = 0; i < iterable.length; i++) {iterable[i]}var i = 0while(i<iterable.length) {function语句i += 1}
arr.forEach(function(iteam, index, array)for (i of iterable) { i } // i = 值for (i in iterable) ( iterable[i] } // i = 下标break 结束单次循环continue 语句可以跳过单次循环
var log = function() {console.log.apply(console, arguments)//alert( )}//测试函数情况var ensure = function( def, result, message ) {if( JSON.stringify( def ) !== JSON.stringify( result ) ) {log('错误', message)}}//测试函数正确var e = function(selector) {return document.querySelector(selector)}// 绑定元素var appendHtml = function(element, html) {element.insertAdjacentHTML('beforeend', html)}//加入html字符串var toggleClass = function(element, className) {if (element.classList.contains(className)) {element.classList.remove(className)} else {element.classList.add(className)}}// 开关(className)var removeClassAll = function(className) {var selector = '.' + classNamevar elements = document.querySelectorAll(selector)for (var i = 0; i < elements.length; i++) {var e = elements[i]e.classList.remove(className)}}//批量删除classNamevar bindEvent = function(element, eventName, callback) {element.addEventListener(eventName, callback)}//绑定事件var bindAll = function(selector, eventName, callback) {var elements = document.querySelectorAll(selector)for(var i = 0; i < elements.length; i++) {var e = elements[i]bindEvent(e, eventName, callback)}}//批量绑定事件var time = function( z ) {if (z === undefined) { z = new Date() }var han = '日一二三四五六'var Year = z.getFullYear()var Month = z.getMonth() + 1var Day = z.getDate()var Hour = z.getHours()var Minute = z.getMinutes()var Second = z.getSeconds()var Week = han[z.getDay()]if ( String(Month).length === 1) {Month = '0' + Month}return `${Year}年${Month}月${Day}日 ${Hour}时${Minute}分${Second}秒 星期${Week}`}time( )//时间函数 括号里输入时间对象 否则为当前时间// (new Date()).getTime()把时间转换为当前毫秒计算事件 常用于倒计时//可通过new Date('2017/6/10,10:30:30')的格式来设置时间
| 名称 | 秒懂释义 |
|---|---|
| iterable | 可迭代对象 |
| path | 路径 |
| url | 网址 |
| src | 需暂停加载(比如script img) 引用的意思 |
| href | 不需暂停加载(比如link a ) 跳转的意思 |
| pattern | 正则表达式 |
| property | 属性 |
| arguments | 参数 |
| event | 事件 event.target |
| clientX clientY | 鼠标 |
| 属性 | 说明 | 举栗 |
|---|---|---|
| floor( x ) | 返回 <= x 整数 向下取整 | ( -2.1 ) = -3 |
| ceil( x ) | 返回 >= x 整数 向上取整 | ( -2.1 ) = -2 |
| round( x ) | 返回 x 四舍五入 | ( 5.4 ) = 5 |
| abs( x ) | 返回 x 绝对值 | |
| random( ) | 生成 0 - 1 随机小数 | 随机取数主要操作 |
| parseInt( ) | 取整数 |
| 与 | 或 | 非 |
|---|---|---|
| && | || | !! |
| and | or | not |
a是执行函数 b是时间(例如1000)
| 名称 | 作用 | 例子 |
|---|---|---|
| setInterval | 间隔型 | b秒执行一次setInterval(a,b) |
| setTimeout | 延时型 | 只执行一次 |
| clearInterval | 关闭间隔型 | |
| clearTimeout | 关闭延时型 |
offsetLeft 距离左边的距离 用于做无缝滚动
| 属性 | 说明 |
|---|---|
| typeof( object ) | 判断 类型 |
| String( number ) | 数字 转 字符串 |
| Number( string ) | 字符串 转 数字 |
Pattern/Property| Property | 说明 |
|---|---|
| /i | 无视大小写 |
| /g | 全局匹配 |
| /m | 多行匹配 |
| /img | 组合使用 |
| 正则表达式 | 说明 |
|---|---|
| /[A-Z]|[a-z]/img | 所有字母 |
| /[0-9]/img | 所有数字 |
Pattern, Property )
var name = '馒头'var re = new RegExp( `${name}`, 'img' ) //加变量
| 转义符 | 说明 |
|---|---|
\n |
换行 |
\t |
TAB |
\\ |
反斜杠 |
\' |
单引号 |
\" |
双引号 |
| 注释 | 快捷键 CTRL + / | 单行 |
|---|---|---|
| JavaScript | // JS |
|
| CSS | /* CSS */ |
|
| HTML | <!-- HTML --> |
|
| Python | ``` Python ``` |
# Python |
ASCII:2进制8字节表示 Base64:2进制6字节
| ASCII - Unicode 编码 | 说明 |
|---|---|
'Aa'.charCodeAt( 0 ) === 65 |
0 下标 |
String.fromCharCode( 65 ) === "A" |
65 ASCII码 |
( 10 ).toString( 2 ) === "1010" |
进制转换 |
《Head First HTML 与 CSS》第2版 ;
《JavaScript 语言精粹》;
《JavaScript 高级程序设计》;
《编码》;《计算机程序的构造和解释》;SICP 解题集
《深入理解计算机系统》;
《算法导论》;《编程珠玑》;《程序设计语言》;《代码大全》;