2012 google hosts
2012年3月29日 由 admin 没有评论 »JS带私有变量的类(错误版)
2011年4月1日 由 admin 4 条评论 »4月2日更新:由于本人没有严谨的思考问题,这个代码实例化后私有变量会互相污染,感谢dox.jin的提醒。这篇文章就作为反面代码留给大家吧,我回去再思考有没有更简洁的方式实现。另外dox.jin提供了一个方法,见本文评论。以下是错误版原文:
</span>
<pre>
(function(){
var a = 1;
var b = 2;
var MyClass = function(x, y){
a = x || 0;
b = y || 0;
}
MyClass.prototype = {
c: "c",
d: "d",
geta: function(){
return a;
},
seta: function(i){
a = i;
},
getb: function(){
return b;
},
setb: function(i){
b = i;
}
}
window.MyClass = MyClass;
})()
【转载】关于DOM事件的Bubbling和Capturing
2011年2月17日 由 admin 1条评论 »在浏览器解析事件的时候,有两种触发方式,一种叫做Bubbling(冒泡),另外一种叫做Capturing(捕获)。由上图可以看出来,冒泡的方式效 果就是当一个DOM元素的某事件例如click事件被fire时,依次它的父元素的click事件也被fire(触发),一直传递到最顶层的body元素 为止。而捕获的触发方式正好相反,当某个元素的click事件被触发时,先从最顶层的body元素click事件被触发开始,一直传递到真正被触发的元素 为止。
****************************************************************************
这次我将讨论W3C的标准DOM事件模型和IE独立门户的DOM事件模型到底有多少区别,首先我们可以回想一下目前大多数Js程序员习惯如何绑定事件到 DOM元素上,最常见的就是obj.onclick=handler这种方式(更恶劣的是在Html代码的元素标签中直接加上onclick属性,完全没 达到视图和动作分开的原则)。我们暂时称这种方式的事件添加为Traditional(传统方式)吧,IE有自己的IE Event Module,而火狐等浏览器则遵循的W3C方式的Event Module,下面看看这三者各自的优缺点在哪里——
1、Traditional Module
传统方式的事件模型即直接在DOM元素上绑定事件处理器,例如—
window.onload=function(){…}
obj.onmouseover=function(e){…}
obj.onclick=function(){…}
首先这种方式是无论在IE还是Firefox等其他浏览器上都可以成功运行的通用方式。这便是它最大的优势了,而且在Event处理函数内部的this变量无一例外的都只想被绑定的DOM元素,这使得Js程序员可以大大利用this关键字做很多事情。
至于它的缺点也很明显,就是传统方式只支持Bubbling,而不支持Capturing,并且一次只能绑定一个事件处理器在DOM元素上,无法实现多 Handler绑定。最后就是function参数中的event参数只对非IE浏览器有效果(因为IE浏览器有特制的window.event)。
2、W3C (Firefox.e.g) Event Module
Firefox等浏览器很坚决的遵循W3C标准来制定浏览器事件模型,使用addEventListener和removeEventListener两个函数,看几个例子—
window.addEventListener(‘load’,function(){…},false);
document.body.addEventListener(‘keypress’,function{…},false);
obj.addEventListener(‘mouseover’,MV,true);
function MV(){…}
addEventListener带有三个参数,第一个参数是事件类型,就是我们熟知的那些事件名字去掉前面的’on’,第二个参数是处理函数,可以直接给函数字面量或者函数名,第三个参数是boolean值,表示事件是否支持Capturing。
W3C的事件模型优点是Bubbling和Capturing都支持,并且可以在一个DOM元素上绑定多个事件处理器,各自并不会冲突。并且在处理函数内 部,this关键字仍然可以使用只想被绑定的DOM元素。另外function参数列表的第一个位置(不管是否显示调用),都永远是event对象的引 用。
至于它的缺点,很不幸的就只有在市场份额最大的IE浏览器下不可使用这一点。
3、IE Event Module
IE自己的事件模型跟W3C的类似,但主要是通过attachEvent和detachEvent两个函数来实现的。依旧看几个例子吧—
window.attachEvent(‘onload’,function(){…});
document.body.attachEvent(‘onkeypress’,myKeyHandler);
可以发现它跟W3C的区别是没有第三个参数,而且第一个表示事件类型的参数也必须把’on’给加上。这种方式的优点就是能绑定多个事件处理函数在同一个DOM元素上。
至于它的缺点,为什么如今在实际开发中很少见呢?首先IE浏览器本身只支持Bubbling不支持Capturing;而且在事件处理的function 内部this关键字也无法使用,因为this永远都只想window object这个全局对象。要想得到event对象必须通过window.event方式,最后一点,在别的浏览器中,它显然是无法工作的。
最后我在推荐两个必须知道的IE和W3C标准的区别用法吧—
1、当我们需要阻止浏览器某DOM元素的默认行为的时候在W3C下调用e.preventDefault(),而在IE下则通过window.event.returnValue=false来实现。
2、当我们要阻止事件冒泡的时候,在W3C标准里调用e.stopPropagation(),而在IE下通过设置window.event.cancelBubble=true来实现。
转载自:http://hi.baidu.com/dcyhldcyhl/blog/item/70e94d235e4fffac4723e86a.html
另外还有一篇介绍了详细的事件触发顺序(Capturing >target >Bubbling):http://blog.sina.com.cn/s/blog_66d6c8870100nl76.html
iphone/ipad多点触摸DEMO
2010年11月29日 由 admin 没有评论 »DEMO访问地址:http://directguo.com/code/mtouch_test/
说明:请使用ipad/iphone访问,android没有测试过,不知道是否可行。
『Chrome 音乐盒』更新至1.1。
2010年11月10日 由 admin 28 条评论 »安装地址:https://chrome.google.com/extensions/detail/abgdjjbecjkcjklnfgbcngfgfajmlfln?hl=zh-cn
=============== 功能介绍 ===============
1.后台播放音乐,无独立弹出窗,无广告,无Flash。
2.可自定义播放列表。
3.可以通过搜索将歌曲添加到播放列表。
4.提供谷歌音乐的17个热门歌曲列表。
5.播放列表使用离线储存功能,关闭浏览器之后依然会保存。
=============== 一些说明 ===============
1.请使用Chrome,Chromium因为没有音频解码器而无法播放歌曲。这里有个解决方法,没试过,Chromium用户可以试试:http://www.chromi.org/archives/5498
2.音乐来源是谷歌音乐,有些歌曲因为版权问题可能无法找到。
3.因为版权问题国外IP无法收听音乐。
4.本地歌曲无法在插件中播放,这是Chrome扩展的限制,无能为力。
以下新功能会考虑在后期版本中增加:
1.批量导出下载地址。
2.按歌手和专辑浏览歌曲列表。
3.点击工具栏图标直接暂停和播放,这个我还不清楚能否实现,因为打开弹出框还是必须的。
4.随便听听
5.歌词显示。
*****另外2.0的改动可能会比较大,功能会更丰富,同时界面也会分离简化,不会让大家有那种很复杂的感觉,但是完成这些功能会需要比较多的时间,请大家耐心等待。
=============== 更新日志 ===============
ver 1.1 更新时间:2010/11/15
1.增加三种播放顺序选项。
==========================================
ver 1.0 更新时间:2010/11/12
1.每次打开窗口自动滚动到当前播放项目
2.修改一些css和一些小bug。
==========================================
ver 0.93 更新时间:2010/11/12
1.增加上一首/下一首按钮,按钮点击起来更有实体感
2.固定列表增加到17个,包括了我在谷歌音乐上发现的所有列表。
==========================================
ver 0.92 更新时间:2010/11/11
1.修正全选和刷新列表选择框依然不变的bug。
2.增加“清空搜索结果”按钮。
3.调整一些界面CSS。
4.增加一些未选中歌曲时的播放逻辑。
==========================================
ver 0.91 更新时间:2010/11/10
1.将播放按钮放到右边,方便点击
==========================================
ver 0.9 更新时间:2010/11/10
1.增加播放列表,可以添加/删除,播放列表关闭浏览器不会丢失。
2.增加搜索功能,动态加载搜索结果。
3.增加“华语新歌”榜单。
4.单击播放改为双击,并且同时将此歌添加到播放列表。
5.修正一些bug
==========================================
ver 0.8: 更新时间:2010/11/6
1.第一版为测试版,功能比较简单。
2.只能播放谷歌热榜中的歌曲,200首。
3.基本的播放、暂停、音量调整、时间进度和跳转。
4.后台播放选中的音乐,不需要保持一个弹出窗。
======================================
希望大家在留言中写下您的意见、建议和发现的bug,谢谢。
软件中音乐搜索内容来源于谷歌音乐,歌曲版权为巨鲸及其所在的公司所有
【原创】Chrome扩展一枚『Chrome音乐盒』
2010年11月6日 由 admin 没有评论 »『Chrome音乐盒』特点:
- 小巧、操作简单、无广告
- 真正在后台运行,不是弹出窗
- 音乐为解析谷歌中国音乐频道的热榜信息,下一步加入其他内容
- 第一版为测试版,可能会有一些BUG。
扩展官方地址:https://chrome.google.com/extensions/detail/abgdjjbecjkcjklnfgbcngfgfajmlfln?hl=zh-CN
欢迎大家试用,欢迎在留言处写下您的意见和建议。
使用canvas绘制的俄罗斯方块
2010年10月27日 由 admin 1条评论 »很简单的小游戏,练习一下,尚未加入积分过关等功能。可以在iphone和ipad上玩,不过针对多点触摸还需要优化一下。另外支持离线使用(chrome/ff/opera/safari均有效)
10.28:针对iphone的touch进行了调整,解决了操控问题,稍后继续解决屏幕大小以及旋转屏的问题
———————————————————————
上:转动
下、左、右:移动
空格:直接落下
JavaScript自定义事件
2010年8月19日 由 admin 没有评论 »
function foo1(){
console.log('foo1 is execute');
}
function foo2(){
console.log('foo2 is execute');
}
var ev = document.createEvent('HTMLEvents'); //创建一个HTML事件
ev.initEvent('eat', false, false); //初始化事件
document.addEventListener('eat', foo1, false); //在某个对象上监听事件
document.addEventListener('eat', foo2, false);
document.dispatchEvent(ev); //对某对象触发事件
HTML5 Video标签教学DEMO
2010年8月15日 由 admin 1条评论 »DEMO地址:http://directguo.com/code/html5teach/media.html
(请使用chrome观看,其它浏览器没有测试。)
该DEMO分五个区域:
- 视频区(左上):播放视频
- 控制方法区(右上):操作视频对象的方法(可以编辑代码再执行)
- TimerRanger区(左中):用于显示3中可以获取的时间区域
- 事件检测区(右下):视频播放过程中产生的事件
- 属性值区(左下):视频的各种属性值
部分HTML5功能的教学代码
2010年8月12日 由 admin 没有评论 »
/******************************************************
* @Web Storage
******************************************************/
//一直有效,关闭窗口和重启浏览器后数据依然存在
window.localStorage["key"] = value;
//当前装口有效,关闭窗口和重启浏览器后数据消失
window.sessionStorage["key"] = value;
//不能存放函数,如果是函数会被转换成字符串
//每个域的数据是不能共享的
/******************************************************
* @Web SQL Database
******************************************************/
//1.打开数据库
db = openDatabase("DBTest", "1.0", "HTML5 Database API example", 200000);
//2.判断是否打开成功
if (!db) {
alert("数据库打开失败");
}
else {
//3.执行sql查询
db.transaction(function(tx){
tx.executeSql("SELECT * FROM Table1Test", [], function(tx, result){
console.log(r = result);
for (var i = 0, item = null; i < result.rows.length; i++) {
//提取结果中第i行数据对象,存入item变量,通过item["id"]这种方式获得该行id字段的值
item = result.rows.item(i);
console.log(item);
}
});
});
//4.插入一条记录
db.transaction(function(tx){
tx.executeSql("INSERT INTO Table1Test (id, text) VALUES (?, ?)", [num, document.querySelector('#todoitem').value], function(tx, result){
}, onError);
});
}
//查询函数,data为替代sql语句中?的变量的数组
tx.executeSql("sql", data, successCallback, errorCallback)
//例如
tx.executeSql("INSERT INTO Table1Test (id, text) VALUES (?, ?)", [10,"text"], successCallback, errorCallback)
/******************************************************
* @Web Workers
******************************************************/
//main.js:父进程脚本
var worker = new Worker('extra_work.js');
worker.onmessage = function(event){
alert(event.data);
};
//extra_work.js: 被调用的脚本,子进程
// 这里进行你所需要的计算
postMessage(some_data);//当需要通知父进程时调用,参数传入到父进程的onmessage方法中
/******************************************************
* @Web Sockets
******************************************************/
//连接sockets服务器
var socket = new WebSocket("ws://bloga.jp:80/mychat1");
socket.readyState; //连接状态 0:连接中 1:连接成功 2:连接关闭
//当连接成功时
socket.onopen = function(event){
console.log("connected!");
}
//当从服务器接收到信息时
socket.onmessage = function(event){
console.log(event.data);
}
//当连接关闭时
socket.onclose = function(event){
console.log("closed");
}
/******************************************************
* @Notifications
******************************************************/
window.webkitNotifications.checkPermission();//检查是否允许桌面提示 0:允许 1:禁止。桌面提示的允许状态是按域保存的
window.webkitNotifications.requestPermission();//请求用户允许桌面提示
tip = window.webkitNotifications.createNotification("src/dwd1.png", "提示框的标题", "提示框的内容!!!")
tip.show(); //弹出提示框
tip.close(); //关闭提示框
/******************************************************
* @Geolocation
******************************************************/
navigator.geolocation.getCurrentPosition(function(position){
position.coords //位置坐标
position.coords.longitude //经度
position.coords.latitude //纬度
position.coords.accuracy //精度
position.coords.altitudeAccuracy //高度的精度
position.coords.heading //朝向
position.coords.speed //速度
position.timestamp //获取坐标的时间戳
});
/******************************************************
* @Audio + Video
******************************************************/
//获得video对象,audio对象也可以通过此方法,需要在html中放置video或audio标签
Media = document.getElementById("vvv");
//audio对象可以通过这个方法快速创建,video不可以。
Media = new Audio("http://directguo.com/html5/src/france.ogg")
//方法和属性。video和audio方法和属性基本相同
Media.src = value; //返回或设置当前资源的URL
Media.currentTime = value; //当前播放的位置,赋值可改变位置
Media.startTime; //一般为0,如果为流媒体或者不从0开始的资源,则不为0
Media.duration; //当前资源长度 流返回无限
Media.paused; //是否暂停
Media.ended; //是否结束
Media.autoPlay = value; //是否自动播放 true/false
Media.loop = value; //是否循环播放 true/false
Media.play(); //播放
Media.pause(); //暂停
Media.controls = value; //是否有默认控制条 true/false
Media.volume = value; //音量
Media.muted = value; //静音 true/false
//TimeRanges(区域)对象 :该对象描述的是一个或多个区域,例如已经加载的区域为两个部分:1-5.8秒 6-10秒
TimeRanges.length; //区域段数,例如上述例子,应该返回2
TimeRanges.start(i) //第i段区域的开始位置,单位秒
TimeRanges.end(i) //第i段区域的结束位置,单位秒
//事件
eventTester = function(e){//着里定义了一个简单的事件检测函数来检测如下的事件
Media.addEventListener(e, function(){
console.log((new Date()).getTime(), e);
});
}
eventTester("abort"); //客户端主动终止下载(不是因为错误引起),
eventTester("error"); //请求数据时遇到错误
eventTester("play"); //play()和autoplay开始播放时触发
eventTester("pause"); //pause()触发
eventTester("playing"); //开始回放
eventTester("timeupdate"); //播放时间改变
eventTester("ended"); //播放结束
eventTester("ratechange"); //播放速率改变
eventTester("volumechange"); //音量改变
//详细API请看:http://directguo.com/blog/index.php/2010/07/html5-audio-video-tag/
/******************************************************
* @Canvas2D
******************************************************/
var elem = document.getElementById('myCanvas');
var ctx = elem.getContext('2d');
//画矩形
ctx.fillRect(x,y,width,height); //画一个填充的矩形
ctx.strokeRect(x,y,width,height); //为一个矩形描边
ctx.clearRect(x,y,width,height); //清楚一个矩形的一部分并且设为透明
ctx.rect(x, y, width, height); //画矩形
//画路径
ctx.beginPath();//创建路径的第一步是调用beginPath方法,返回一个存储路径的信息
ctx.closePath();//从当前的点到起始点闭合路径
ctx.stroke();//描边路径
ctx.fill();//填充路径
ctx.lineTo(x, y);//从上一个起点到(x,y)的点画线,上一个起点可以通过moveTo来指定,默认为原先路径的终点
//画圆弧
arc(x, y, r, sa, ea, cw);//x,y圆心坐标,r-半径, sa和ea是圆弧的开始和结束弧度cw为true是逆时针,false为顺时针
//画贝塞尔曲线
quadraticCurveTo(cp1x, cp1y, x, y);//二次贝塞尔曲线
//使用图像
drawImage(image, x, y); //image-图像对象
//更多内容请看:http://adamlu.com/?p=157




