2012 google hosts

2012年3月29日 由 admin 没有评论 »
203.208.46.30 picasaweb.google.com
203.208.46.30 lh1.ggpht.com
203.208.46.30 lh2.ggpht.com
203.208.46.30 lh3.ggpht.com
203.208.46.30 lh4.ggpht.com
203.208.46.30 lh5.ggpht.com
203.208.46.30 lh6.ggpht.com
203.208.46.30 lh6.googleusercontent.com
203.208.46.30 lh5.googleusercontent.com
203.208.46.30 lh4.googleusercontent.com
203.208.46.30 lh3.googleusercontent.com
203.208.46.30 lh2.googleusercontent.com
203.208.46.30 lh1.googleusercontent.com
203.208.46.30 images1-focus-opensocial.googleusercontent.com
203.208.46.30 images2-focus-opensocial.googleusercontent.com
203.208.46.30 images3-focus-opensocial.googleusercontent.com
203.208.46.30 images4-focus-opensocial.googleusercontent.com
203.208.46.30 images5-focus-opensocial.googleusercontent.com
203.208.46.30 images6-focus-opensocial.googleusercontent.com
203.208.46.30 s6.googleusercontent.com
203.208.46.30 s5.googleusercontent.com
203.208.46.30 s4.googleusercontent.com
203.208.46.30 s3.googleusercontent.com
203.208.46.30 s2.googleusercontent.com
203.208.46.30 s1.googleusercontent.com
203.208.46.30 plus.google.com
203.208.46.30 talkgadget.google.com
203.208.46.30 ditu.google.com
203.208.46.30 maps-api-ssl.google.com
203.208.46.30 mail.google.com
203.208.46.30 docs.google.com
203.208.46.30 pop.gmail.com
203.208.46.30 scholar.l.google.com
203.208.46.30 news.google.com
203.208.46.30 video.google.com
203.208.46.29 translate.google.com
203.208.46.30 profiles.google.com

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进行了调整,解决了操控问题,稍后继续解决屏幕大小以及旋转屏的问题

———————————————————————

上:转动
下、左、右:移动
空格:直接落下

游戏地址:http://directguo.com/code/tetris

俄罗斯方块

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分五个区域:

  1. 视频区(左上):播放视频
  2. 控制方法区(右上):操作视频对象的方法(可以编辑代码再执行)
  3. TimerRanger区(左中):用于显示3中可以获取的时间区域
  4. 事件检测区(右下):视频播放过程中产生的事件
  5. 属性值区(左下):视频的各种属性值

部分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