最好看的HTML5弹幕播放器送给最好看的宫园薰。
DPlayer来源于我的毕业设计,DPlayer发布后,我的学生生涯也随之结束。
手机满格的电量
过马路时路口亮起的绿灯
下雨时穿着雨靴踩出的水花
读到一首特别喜欢的诗
一抬头就看到的满天繁星
收到朋友寄来的信件
在马路上想起好笑的事情偷偷笑出来
下雨被困好朋友来送伞
做了一个好梦
趴在桌子上温暖的灯光打在脸上
屏幕亮起她的姓名
版权狗退散,妈妈再也不用担心我被侵权了(其实只防君子不防小人)。
类似知乎,在网站复制长度大于42的文本时自动加上这样的版权声明:
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:DIYgod
链接:https://www.anotherhome.net/
来源:Anotherhome
监听copy事件
使用 window.getSelection() 获取选中的文本
使用 clipboardData.setData 操作剪贴板的内容
小狐狸和小兔子是很好很好的朋友。
一起散步的时候,不巧遇到了猎人。
他们转身就跑,都希望猎人更容易发现自己。
小狐狸跑进了蒲公英群,白色的蒲公英漫天飞起。
小兔子逃进玫瑰花园,红色的玫瑰花瓣散落一地。
从此失散在彼此的世界里。
幸运的是,后来,小狐狸遇到了小王子,小兔子遇见了爱丽丝。
GitHub项目主页(喜欢就给个star吧~):
https://github.com/DIYgod/APlayer
Demo:
https://www.anotherhome.net/file/APlayer/
GitHub Trending(热门榜)第8位截图留念2333:
在 Sonic 853 看到的神奇的一幕,一颗赛艇,果断扒来水一贴
原作者:成天不高兴的栗山未来
什么鬼:离开和进入页面时改变title
原理:
使用了HTML5的Page Visibility API
目前页面可见性API有两个属性,一个事件,如下:
document.hidden: Boolean值,表示当前页面可见还是不可见
document.visibilityState: 返回当前页面的可见状态,取值有 hidden visible prerender preview
visibilitychange: 当可见状态改变时候触发的事件
以前只知道可以通过 iframe + onblur/onfocus事件 来检测页面可见性,有了这个 API 真是方便优雅了很多啊
代码:
这是一个2011年在美国上线的网站,IFTTT 是 If This Then That 的缩写。通俗的来讲,IFTTT 的作用就是如果触发了一件事,则执行设定好的另一件事。
结合上图,Recipes 的目的是打通 「this」 和 「that」 两个网络服务,网络服务在这里称为 Channels (频道),前者称为 Trigger Channel (触发器频道),后者称为 Action Channel (动作频道),当触发器频道满足触发条件,那么就会执行动作频道指定的动作。
所以,IFTTT 创建一个「Recipes 流程」的流程如下:选择一个触发器频道,设置它的触发条件,再选择一个动作频道,然后设置它要执行的动作,OK,这样就搞定了。
比如我设置了这样一个Recipes:
整个Recipe的意思是 _”If new feed item from https://www.anotherhome.net/feed, then publish a post to @DIYgod酱”_。
这样等我这篇文章发布之后,一条微博就会自动发送了。
然而还没完,我还有两个涉及微博的 Recipes:
莎士比亚曾经说过:“好记性不如烂笔头。”
2. ECMAScript:提供核心语言功能;DOM:提供访问和操作网页内容的方法和接口;BOM:提供与浏览器交互的方法和接口。
标签的位置:为了避免浏览器在呈现页面时出现明显的延迟,现代Web应用程序一般都把全部JavaScript引用放在<body>元素中页面内容的后面。
延迟脚本:defer属性表明脚本在执行时不会影响页面的构造,脚本会被延迟到整个页面都解析完毕后再运行;只适用于外部脚本文件。
1 | <script defer="defer" src="example.js"></script> |
1 | <script async src="example1.js"></script> |
1 | <!-- HTML 5 --> |
区分大小写:ECMAScript中的一切都区分大小写。
严格模式:在严格模式下,ECMAScript 3 中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误。在顶部添加如下代码:
1 | "use strict" |
typeof操作符,用来检测变量的数据类型。
5种简单数据类型:Undefined、Null、Boolean、Number、String;1种复杂数据类型(引用类型):Object。
Undefined类型:使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。
Null类型:null值表示一个空对象指针;只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。
Boolean类型:其他类型转换为Boolean类型,使用函数Boolean()。
Number类型:其他类型转换为Number类型,常用函数parseInt(),转换字符串时,如果第一个字符不是数字字符或者负号,会返回NaN,第二个参数可选,表示进制
String类型:字符串是不可变的;其他类型转换为String类型,使用函数toString()或String()或加一个空字符串(1+’’)。
Object类型
创建对象的方法:
1 | var o = new Object(); |
创建Object对象的实例并为其添加属性或方法,就可以创建自定义对象;
Object类型是所有它的实例的基础,具有下列属性和方法:
constructor:保留着用于创建当前对象的函数即构造函数;
hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在;
isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型;
propertyIsEnumerable();toLocaleString();
toString():返回对象的字符串表示;
valueOf():返回对象的字符串、数值或布尔值表示;
1 | "23" < "3" // true |
在比较数值和字符串时,字符串都会被被转换成数值,然后再以数值方式与另一个数值比较;如果不能转换成数值,就转换成NaN。
任何操作数与NaN进行比较,结果都是false。
1 | NaN == NaN // false |
1 | "55" == 55 // true |
1 | variable = boolean_expression ? true_value : false_value; |
1 | for (var i = 0; i < 10; i++) { |
1 | for (property in expression) { |
1 | var num = 0; |
1 | function example(name, age) { |
2.从一个变量向另一个变量复制基本类型的值时,会创建这个值的一个副本;从一个变量向另一个变量复制引用类型的值时,复制的是指向存储在堆中的一个对象的指针,复制之后两个变量指向同一个对象。
1 | var o1 = {}; |
1 | function setName(o) { |
执行环境有全局执行环境和函数执行环境之分;每个执行环境都有一个与之关联的变量对象;每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链,作用链的前端是当前执行的代码所在的变量环境,最后一个对象是全局执行环境的变量对象。
查询标识符:从作用域链的前端开始,向上逐级查询,找到后搜索结果停止,没有找到则一直追溯到全局环境的变量对象。
最常用的垃圾搜集方式是标记清除:垃圾回收器在运行时会给存储在内存中的所有变量都加上标记,然后去掉环境中的变量以及被环境中的变量引用的变量的标记,而在此之后还有标记的变量被视为准备删除的变量,因为这些变量无法被访问到了。
优化内存占用:为执行中的代码只保存必要的数据;一旦数据不再有用,最好通过将其值设置为null来释放其引用——解除引用;解除引用的作用是让其值脱离执行环境,以便垃圾搜集器下次运行时将其回收。
1 | // new 操作符法 |
1 | // 点表示法 |
1 | var a1 = new Array(); |
1 | var a = ['a', 'b']; |
检测数组:Array.isArray()(解决了存在两个以上全局执行环境时instanceof检测结果出错的情况)。
栈方法和队列方法:push()添加一项到数组末尾;pop()移除数组末尾一项;shift()移除数组第一项;unshift();添加一项到数组前端。
重排序
reverse():反转数组项的顺序。
sort():默认将数组项转换成字符串然后升序排列。可以接收一个比较函数作为参数。
比较函数接收两个参数,如果第一个参数位于第二个参数之前则返回一个负数,相等则返回0,第二个参数位于第一个参数之前则返回一个负数。
1 | var a = [0, 1, 15, 10, 5]; |
1 | var a1 = ['red', 'green', 'blue']; |
1 | var a = ["red", "green", "blue", "yellow", "black", "brown"]; |
1 | var a = ["red", "green", "blue", "yellow", "black", "brown"]; |
1 | var a = ["red", "purple", "orange", "green", "red", "yellow", "black", "brown"]; |
1 | var a = [1, 2, 3, 4, 5, 4, 3, 2, 1]; |
1 | var a = [1, 2, 3, 2, 1]; |
1 | var d1 = new Date(); |
1 | var start = Date.now(); |
1 | var d2 = new Date(2015, 2, 5, 17, 55, 55); |
pattern部分是正则表达式
flags,标志,标明正则表达式的行为:g 全局模式;i 不区分大小写;m 多行模式
1 | var exp1 = / pattern / flags |
1 | var text = "I'm DIYgod, and this is Anotherhome"; |
1 | var text = "I'm DIYgod, and this is Anotherhome"; |
1 | // 使用函数声明语法 |
1 | function f1 (n1, n2) { |
ECMAScript中没有函数重载。
函数声明与函数表达式的区别:解释器会率先读取函数声明,并使其在执行任何代码之前可用(函数声明提升);函数表达式必须等到解释器执行到它所在行才会真正被解释执行。
1 | console.log(f1(1, 1)); // 2 |
1 | // 明显第二种写法更好一些 |
1 | function outer() { |
1 | function f (n1, n2) { |
1 | window.color = 'red'; |
Boolean类型、Number类型、String类型
暂时跳过
Global对象、Math对象
暂时跳过
[[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。
[[Enumerable]]:表示能否通过 for-in 循环返回属性。
[[Writeable]]:表示能否修改属性的值。
[[Value]]:包含这个属性的数据值。
[[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为数据属性。
[[Enumerable]]:表示能否通过 for-in 循环返回属性。
[[Get]]:在读取属性时调用的函数。
[[Set]]:在写入属性时调用的函数。
1 | function createPerson(name, age, job) { |
1 | function Person(name, age, job) { |
这种方法会经历4个步骤:
创建一个新对象
将构造函数的作用域赋给新对象(this指向这个新对象)
执行构造函数中的代码(为新对象添加属性)
返回新对象
构造函数的问题:每个方法都要在每个实例上重新创建一遍。
1 | console.log(p1.sayName === p2.sayName); // false |
1 | // 组合使用构造函数模式与原型模式 |
只要创建一个新函数,就会根据一组特定的规则为该函数创建一个 prototype 属性,指向原型对象
默认所有原型对象都会获得一个 constructor 属性,指向 prototype 属性所在函数
调用构造函数创建新实例后,实例将有一个 proto 属性,指向构造函数的原型对象,指针叫[[Prototype]],默认原型指向Object
实例与构造函数没有直接关系
读取属性:搜索先从对象实例本身开始,如果没找到,搜索原型对象
使用 isPrototype() 来检测构造函数和实例之间是否有关系
使用 hasOwnProperty() 来检测属性存在于实例中还是原型中
1 | // in操作符会在通过对象能够访问到属性时返回true |
1 | function Person() { |
1 | function SuperType(name) { |
1 | console.log(instance instanceof SuperType); // true |
闭包是有权访问另一个函数作用域中的变量的函数。
(作用域链见4.2)在外部函数内部定义的内部函数将包含外部函数的活动对象添加到它的作用域中;外部函数执行完毕后,其活动对象不会被销毁,因为内部函数的作用域链仍然在引用这个活动对象;外部函数执行完毕后,内部函数仍然可以访问到其定义的所有变量。
1 | function outer () { |
1 | function createFunction () { |
1 | var name = 'The Window'; |
1 | (function () { |
任何在函数中定义的变量,都可以认为是私有变量。
有权访问私有变量和私有函数的公有方法称为特权方法。
1 | function MyObject() { |
…
事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点;IE9、FireFox、Chrome 和 Safari 将事件一直冒泡到 window 对象。
事件捕获:由于老版本的浏览器不支持,因此很少有人使用事件捕获。
“DOM2级事件”规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。
1 | <input type="button" value="Click Me" onclick="alert(value)"> |
如果是一个表单输入元素,则作用域中还会包含访问表单元素的入口,栗子:
1 | <form method="post"> |
缺点:①存在时差问题,解析函数之前就触发事件会引发错误 ②扩展处理程序的作用域链在不同浏览器中会导致不同结果 ③导致HTML和JavaScript代码紧密耦合。
1 | // 绑定事件处理程序 |
以这种方式添加的事件处理程序会在事件流的冒泡阶段被处理。
addEventListener() 和 removeEventListener()
三个参数:要处理的事件名、作为事件处理程序的函数、在捕获阶段调用函数(true)还是在冒泡阶段调用函数(false,默认)
好处是可以添加多个事件处理程序,使用 addEventListener 添加的事件处理程序只能使用 removeEventListener移除,匿名函数无法移除。
attachEvent() 和 detachEvent()
1 | var btn = document.getElementById('myButton'); |
以这种方式添加的事件处理程序会在事件流的冒泡阶段被处理。
在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件有关的信息。只有在事件处理程序执行期间,event对象才会存在,一旦事件处理程序执行完成,event对象就会被销毁。
属性/方法:
currentTarget:正在处理事件的那个元素
target:事件的目标
type:事件类型
cancelable:可以阻止特定事件的默认行为
preventDefault():阻止特定事件的默认行为
stopPropagation():停止事件在DOM层次中的传播,即取消进一步的事件捕获或冒泡
eventPhase:事件出于事件流的阶段 捕获阶段为1 处于目标对象为2 冒泡阶段为3
…
1 | var xhr = new XMLHttpRequest(); |
创建XHR对象:new XMLHttpRequest();
open():启动一个请求以备发送;3个参数:请求类型、请求的URL、是否异步发送请求(同步必须等到服务器响应后再继续执行);不会真正发送请求。
send():发送请求;1个参数:发送的数据;不需要发送数据则必须传入null。
XHR对象的属性:
responseText 返回的文本
status 响应的HTTP状态。
2xx 成功
3xx 重定向,304 Not Modified 表示请求的资源没有被修改,可以直接用浏览器中缓存的版本,302 Found 表示请求的资源现在临时从不同的URI响应请求
4xx 客户端错误,403 Forbidden,404 Not Found
5xx 服务器错误,500 Internal Server Error,503 Service Unavailable。
0:未初始化
1:启动,已调用open()
2:发送,已调用send()
3:接收到部分响应数据
4:接收到全部响应数据
CORS:使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是应该失败。IE中要使用XDR对象实现,其他浏览器XHR对象原生支持。
图像Ping:只能发送GET请求;无法访问服务器的响应文本。
1 | var img = new Image(); |
1 | function myCallBack (data) { |
缺点:安全性不可靠;不容易判断请求失败。
To Be Continued…
任务4(最终挑战)已经发布,任务deadline是6月10日至6月30日。
TASK 0004 内容:https://github.com/baidu-ife/ife/tree/master/task/task0004
我做的:https://github.com/DIYgod/ife-work/tree/master/task0004
在线Demo: https://www.anotherhome.net/file/ife/task0004
本次任务断断续续花费了20天(5.20-6.9)的时间。
下面是我做 TASK 0004 过程中的一些记录。
任务3已经发布,初级班的任务时间是从5月7日至5月18日,中级班为4月30日至5月10日。
TASK 0003 内容:https://github.com/baidu-ife/ife/tree/master/task/task0003
我做的:https://github.com/DIYgod/ife-work/tree/master/task0003
在线Demo: https://www.anotherhome.net/file/ife/task0003/
本次任务累计花费时间10天(5.6-5.16 )
下面是我做 TASK 0003 过程中的一些记录。