NODE-调试方法

NODE核心自带的STDIO模块,就是类似浏览器端的console.*()系列方法,可像浏览器端调试代码一样,简单对代码进行调试:

输出普通信息:

console.log() 在控制台输出信息,可用来记录一个函数是否执行、函数执行时某些变量的值

输出错误信息:

console.error() 输出错误信息,常配合try catch语句使用

判断代码块的性能:

console.time(‘mytime’)和console.timeEnd(‘mytime’)会输出代码块执行的时间

设置断点:

debugger; 遇到这句断点时,代码都会中止执行,按play可继续代码执行

安装node-inspector调试器

$ npm install -g node-inspector
使用node-inspector 对nodejs代码进行调试,需要环境:webkit内核浏览器

 

[javascript]
// file t6.js
var foo = function(){
var a = 3, b = 5;
var bar = function(){
var b = 7, c = 11;
a += b + c;
}
bar();
}
foo();

[/javascript]

阅读全文

HTML5-WebSocket API 学习

  1. 1. 服务器端 编写serverfile.js文件,建立http服务器和socket连接:
  2. 2. 浏览器端 编写 webSocket.html ,建立与服务器的连接:
  3. 3. 浏览器对WebSocket的支持性

使用nodejs的socket.io和现代浏览器的WebSocket来建立一个聊天室。

服务器端 编写serverfile.js文件,建立http服务器和socket连接:

[javascript]
var http = require(‘http’);
var io = require(‘socket.io’);

// 创建一个服务器
var server = http.createServer(function(request, response){
response.writeHead(200, {‘Content-type’: ‘text/html’});
response.end(‘小赖的WebSocket服务器启动啦!’);
});
// 监听端口
server.listen(9999);

// 创建一个WebSocket
var socket = io.listen(server).set(‘log’, 1);

// 监听连接
server.on(‘connection’, function(client) {
// 监听信息
client.on(‘message’, function(data){
console.log(‘收到客户端发来信息:’, data);
var curTime = new Date().getTime();
client.emit(‘服务器返回信息:’, data + ‘->’ + curTime);

     client.on('disconnect', function(){
         console.log('连接已断开');
     });
 });

});
[/javascript]

创建http服务器,运行http服务器成功:

浏览器端 编写 webSocket.html ,建立与服务器的连接:

[html]
<!DOCTYPE html>
<html>
<head>
<title>WebSocket API</title>
<meta charset="utf-8">
<script src="<span style="text-decoration: underline;">http://localhost:9999/socket.io/socket.io.js</span>"></script&gt;
</head>
<body>
<div id="log">显示log信息…</div>
<input id="msg" type="text" placeholder="请输入信息" />
<button id="send-btn">发送!</button>

<script>
var myWebSocket = {};
myWebSocket.socketio = {
mysocket: null,
initialize: function(){
// 建立连接
myWebSocket.socketio.mysocket = io.connect(‘<span style="text-decoration: underline;">http://localhost:9999</span&gt;’);
// 监听连接
myWebSocket.socketio.mysocket.on(‘connect’, function(){
myWebSocket.socketio.log(‘成功连接到服务器\n’);
});
// 监听信息
myWebSocket.socketio.mysocket.on(‘message’, function(data){
myWebSocket.socketio.log(‘服务器返回数据:’ + data + ‘\n’);
});
// 监听断开连接
myWebSocket.socketio.mysocket.on(‘disconnect’, function(){
myWebSocket.socketio.log(‘已断开连接\n’);
})

         // 点击发送按钮
         document.querySelector('#send-btn').onclick = function(){
             // 发送信息到服务器
             var msg = document.querySelector('#msg').value;
             myWebSocket.socketio.sendMessageToServer(msg);
             document.querySelector('#msg').value = '';
         };
     },
     sendMessageToServer: function(data){
         myWebSocket.socketio.mysocket.secd(data);
         myWebSocket.socketio.log('已发送信息到服务器:' + data +'\n');
     },
     log: function(msg) {
         document.querySelector('#log').innerHTML += msg;
     }
 }

 myWebSocket.socketio.initialize();
 &lt;/script&gt;

</body>
</html>
[/html]

然后在浏览器打开这个网页,终端显示:

这样客户端和服务器就可以通信啦!

输入信息后,点击发送,终端显示:

浏览器则显示:

然后关闭服务器的话,则显示「已断开连接」:

实现广播功能,即一个客户端发送消息,所以和服务器建立了连接的其他客户端都能看到这个消息:
修改serverfile.js文件,注意有『修改』字眼的部分:

[javascript]
var http = require(‘http’);
var io = require(‘<span style="text-decoration: underline;">socket.io</span>’);

// 创建一个服务器
var server = http.createServer(function(request, response){
response.writeHead(200, {‘Content-type’: ‘text/html’});
response.end(‘小赖的WebSocket服务器启动啦!’);
});
// 监听端口
server.listen(9999);

// 创建一个WebSocket

var socket = io.listen(server).set(‘log’, 1);

// 监听连接
socket.on(‘connection’, function(client) {
// 修改:监听信息
client.on(‘customMessage’, function(data){
console.log(‘收到客户端发来信息:’, data);
var curTime = new Date().getTime();

     // 修改:使用广播方法
     client.broadcast.emit('服务器返回customMessage信息:', data + '广播-&gt;' + curTime);

     client.on('disconnect', function(){
         console.log('连接已断开');
     });
 });

});
[/javascript]

修改webSocket.html文件,注意有『修改』字眼的部分:

[html]
<!DOCTYPE html>
<html>
<head>
<title>WebSocket API</title>
<meta charset="utf-8">
<script src="<span style="text-decoration: underline;">http://localhost:9999/socket.io/socket.io.js</span>"></script&gt;
</head>
<body>
<div id="log">显示log信息…</div>
<input id="msg" type="text" placeholder="请输入信息" />
<button id="send-btn">发送!</button>

<script>
var myWebSocket = {};
myWebSocket.socketio = {
mysocket: null,
initialize: function(){
// 建立连接
myWebSocket.socketio.mysocket = io.connect(‘<span style="text-decoration: underline;">http://localhost:9999</span&gt;’);
// 监听连接
myWebSocket.socketio.mysocket.on(‘connect’, function(){
myWebSocket.socketio.log(‘成功连接到服务器<br />’);
});
//修改: 监听customMessage信息
myWebSocket.socketio.mysocket.on(‘broadcastMessage’, function(data){
myWebSocket.socketio.log(‘收到广播信息:’ + data + ‘<br />’);
});
// 监听断开连接
myWebSocket.socketio.mysocket.on(‘disconnect’, function(){
myWebSocket.socketio.log(‘已断开连接\n’);
})

         // 点击发送按钮
         document.querySelector('#send-btn').onclick = function(){
             // 发送信息到服务器
             var msg = document.querySelector('#msg').value;
             myWebSocket.socketio.sendMessageToServer(msg);
             document.querySelector('#msg').value = '';
         };
     },
     sendMessageToServer: function(data){
         // 修改
         myWebSocket.socketio.mysocket.emit('customMessage', data);
         myWebSocket.socketio.log('已发送信息到服务器:' + data +'&lt;br /&gt;');
     },
     log: function(msg) {
         document.querySelector('#log').innerHTML += msg;
     }
 }

 myWebSocket.socketio.initialize();
 &lt;/script&gt;

</body>
</html>
[/html]

然后用多个页面打开webSocket.html,在第一个页面输入消息:

点击发送,其他页面立即收到了消息:

在第二个页面输入信息:

在其他页面收到广播:


哇!WebSocket够强大,可以实现客户端和服务端的通信,而node的socket.io更是封装了它的一系列方法,实现一个web端通信就轻而易举了,但!是!HTML5的这个新特性,你敢用嘛?!

浏览器对WebSocket的支持性

在caniuse.com查询可知,WebSocket在IE10+和其他现代浏览器才支持,低版本的IE不支持WebSocket - -!

不过好消息是,socket.io对不支持WebSocket的浏览器启用了其他策略,使得socket.io甚至能在IE6下运行!

学好node后再回来拓展这个小小聊天室呗^_^
参考资料
参考资料
参考资料

HTML5-file API 学习

为实现图片上传前预览并限制图片大小,貌似只能通过flash和HTML5的API来解决了吧?

今天学习了HTML5的file API,将预览和限制大小的功能应用到了项目里。

练习代码先贴到这,方便自己查阅,日后比较空闲时再回来好好研究那些API的机制吧:)

[html]

<p>请选择图片(可多选):</p>
<input id="file_input" type="file" multiple style="display:none;" onchange="handleFiles(this.files)">
<button id="select-btn">请选择图片</button>
<div id="dropbox" style="width:300px;height:200px;background:#eee;">
或拖动图片到此处
</div>
<ol id="preview-img-list">

</ol>
<button id="send-btn">发送!</button>

[/html]

[javascript]

// 获取文件
var file_input = document.getElementById(‘file_input’);
var select_btn = document.getElementById(‘select-btn’);
var preview_img_list = document.getElementById(‘preview-img-list’);
var dropbox = document.getElementById(‘dropbox’);
var send_btn = document.getElementById(‘send-btn’);

// 选择文件
select_btn.onclick = function(){
file_input.click();
};

send_btn.onclick = function(){
sendFiles();
};

// 监听文件改变
file_input.addEventListener(‘change’, handleFiles, false);
// 监听拖拽事件
dropbox.addEventListener(‘dragenter’, dragenter, false);
dropbox.addEventListener(‘dragover’, dragover, false);
dropbox.addEventListener(‘drop’, drop, false);

// 接受并预览图片
function handleFiles(files){
var len = files.length;
var imageType = /image.*/;
window.URL = window.URL || window.webkitURL;
if (len) {
preview_img_list.innerHTML = ‘’;
for (var i = 0; i < len; i++) {
if( ! files[i].type.match(imageType)) {
// 不是图片 跳过
continue;
}

var li = document.createElement(‘li’);
var img = document.createElement(‘img’);
var p = document.createElement(‘p’);

p.innerHTML = ‘name: ‘ + files[i].name + " <br />size: " + files[i].size + ‘ Bytes’ + "<br/>type: " + files[i].type;

// 将file对象存在当前图片中,用于后续创建上传任务
img.file = files[i];
// 添加一个类,方便选择
img.classList.add(‘obj’);
/方法一:使用URL对象预览图片/
// 使用window.URL.createObjectURL创建 blob URL
img.src = img.src = window.URL.createObjectURL(files[i]);
img.onload = function(e) {
// 使用window.URL.revokeObjectURL释放URL对象,因为图片加载完成后不再需要这个对象
window.URL.revokeObjectURL(this.src);
}
/方法一结束/

/方法二:使用FileReader对象预览图片 /
// var reader = new FileReader();
// reader.onload = (function(aImg) {
// return function(e) {
// aImg.src = e.target.result;
// };
// })(img);
// reader.readAsDataURL(files[i]);
/方法二结束 /

li.appendChild(img);
preview_img_list.appendChild(li);

};
}
}

// 创建上传任务
function sendFiles() {
var imgs = document.querySelectorAll(‘.obj’);
var len = imgs.length;
for (var i = 0; i < len; i++) {
// 第二个参数用于读取图片数据
new FileUpLoad(imgs[i], imgs[i].file);
};
}

function FileUpLoad(img, file) {
var reader = new FileReader();
// 创建一个 throbber 用于显示进度信息
this.ctrl = createThrobber(img);
// 创建一个XMLHttpRequest对象用来上传数据
var xhr = new XMLHttpRequest();
this.xhr = xhr;

var self = this;
// 监听数据上传,更新throbber
this.xhr.upload.addEventListener(‘progress’, function(e){
if (e.lengthComputable) {
var percentage = Math.round((e.loaded * 100) / e.total);
self.ctrl.update(percentage);
}
}, false);
// 上传完成,更新进度到100%,移除throbber 因为不再需要
xhr.upload.addEventListener(‘load’, function(e) {
self.ctrl.update(100);
var canvas = self.ctrl.ctx.canvas;
canvas.parentNode.removeChild(canvas);
}, false);
// 使用POST方式发送数据
xhr.open("POST", "http://demos.hacks.mozilla.org/paul/demos/resources/webservices/devnull.php&quot;);
// 使用一个通用的MIME类型
xhr.overrideMimeType(‘text/plain; charset=x-user-defined-binary’);
reader.onload = function(evt) {
// 以二进制形式发送
xhr.sendAsBinary(evt.target.result);
};
// 将文件转化为二进制字符串形式
reader.readAsBinaryString(file);
}

&nbsp;

function dragenter(e) {
e.stopPropagation();
e.preventDefault();
}
function dragover(e) {
e.stopPropagation();
e.preventDefault();
}
function drop(e) {
e.stopPropagation();
e.preventDefault();

var dt = e.dataTransfer;
var files = dt.files;

handleFiles(files);
}

[/javascript]

 

这个File API 使得浏览器支持预览、图片大小/类型限制、拖拽上传、多图上传。

 

图片预加载和判断图片是否加载完成

使用Image()对象预加载图片:

var imgsSrcArray = [src1, src2, src3, src4, src5];
需要预加载这些图片,以便点击上一张或下一张按钮的时候,能显示对应的图片。
使用JS自带的 Image对象 实现图片预加载:
[javascript]
var images= [];
var len = imgsSrcArray.length;
for(var i = 0; i < len; i++) {
var img = new Image();
img.src = imgsScrArray[i];
images.push(img)
}
[/javascript]

这样就实现了将多个图片进行了预加载,缓存到了images数组里。

使用img.onload,当图片加载完成时执行操作:

[javascript]
img.onload = function(){
// console.log(‘图片加载完成’)
};
[/javascript]

判断图片是否已经加载完成则:需要判断 img.complete属性是否为true:

if (img.complete) {
// 执行操作
}

优化刚刚的预加载函数,封装一个预加载非固定数目图片的函数

[javascript]
var images = [];
function preloadImgs() {
// 利用arguments参数判断需要加载的图片数目
var len = preloadImgs.arguments.length;
for (var i=0; i<len; i++) {
images[i] = new Image();
images[i].src = preloadImgs.arguments[i];
}
}
[/javascript]

// 或传入数组
[javascript]
var images = [];
function preloadImgs(srcArray) {
// 利用arguments参数判断需要加载的图片数目
var len = preloadImgs.arguments.length;
for (var i=0; i<len; i++) {
images[i] = new Image();
images[i].src = srcArray[i];
}
}
[/javascript]

阅读全文

坎坷大学路

今天晚上UC俱乐部开了个分享会,难得停下来倾听别人的成长,几分感触。
WT 分享了ACM竞赛的经验,现在保送到新加坡国立大学硕博连读5年,真是艳羡,不能望其项背。
SZ 分享了Android的开发的体会,而我则给大家介绍了『前端』这个新词汇。

说长也不长,说短亦不短,转眼现在已经大三。
好像一直在瞎忙,忙得忘记停下来回头看看自己遇到了哪些坎,忘记停下来总结总结自己的教训。

这篇文,就算是给自己一个安慰吧。

# 教训

> 教训1:大学生谓之『大』,异于『小』学生,异于『中』学生。
大学生该有『大』的风范,该有高等教育背景下的专业素养,比如:你应该用你的专业视觉去剖析社会现象,而非做盲目从众的五毛党。

> 教训2:大学生谓之『学生』,同于『小』学生,同于『中』学生。大学生的本质仍在于『学习』,可以用不同的学习方式来帮助自己成长,但不能离其宗-你得不断在学习。

按《原本大学》的说法,大学之道,在明明德,在亲民,在止于至善。知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。这『大学』不一定指代我们在读的『大学』,但作为一个成年人,就该有这方面的担当吧。
按胡适先生的说话,我们要有独立之思想,自由之精神。
唉,作为一个自私又功利的个体大学生,我其实没有没有那么高尚,我对自己大学的定义是:
认识自己,认识朋友,认识世界。
这真是一个无比艰难的过程。
# 经验

> 经验1:认识自己在于你如何给自己定位,是想做A,还是做B。
我不比别人聪明,这个智商是硬伤,那就该结合自身,发挥特长,将这仅有的一丁点智商用到极致。
靠几分努力,加几分坚持,慢慢发现你总能打败那些毫不上进的人。而面对那些不能望其项背的牛人,你则必须非常努力,才有可能迎头赶上。

> 经验2:兴趣还真是个最好的老师。
人生短暂仅有几十年,怎么个过法,我可不想听天由命。毕业后,三分之一的时间在职场,三分之一的时间在家庭,还三分之一的时间在————-做梦。我假定我原来很悲哀,只有后面三分之二是快乐的(够自卑了吧)。但如果,我能在职场上做一份感兴趣的工作,那么就可以提高这个快乐值啊,好像人生又会多个三分之一。有兴趣还不够,你还得坚持。

> 经验3:预则立,不预则废。
一直缠绕我的无非就是拖延症了,有时候事一多,情绪上就会闹例假,啥都不想干。
但在死亡Deadline降临之时,我就必须咬紧牙关应付任务。这时候诸葛亮地想一想,这事早点做认真做其实可以做得更好一些。
真是事前猪一样啊。
事多不代表会做的不好(尽管这可能是残酷的结果),你必须根据权重来执行任务,才不会累坏身体搞坏心情。
> 经验4:静心才能成事,多思才能致远。
能安静做一件事情,其实就是在享受一种奢侈。要学会制造、享受这种奢侈。
多思就有多个可能多个方案,不给自己设限,才能给自己留下更多空间。

>经验4:不重要的东西不代表可以不学习。
鬼知道你学的这点皮毛哪一天就真正用上了呢?
这体现在当我以一个比较Open的心态去学习的时候,发现了一个真理:
『The more you know, the more you know you don’s know.』
而恰恰遇上这种未知的可能时,你得逼自己一把去尝试学会新的知识或者工具。
『When you don’t know how to do it, just do it as if you know how to do it.』

唉,机会失去太多。
但,仍有很多可能。

今天终于可以静下来,给自己灌鸡汤打鸡血,满血复活好好干。

你要相信,牛人的高度不是企及。
是你从一开始就放弃了自己。
你知道吗,那些牛人嘲笑你的不是你的水平菜,而是你的态度低。
凭大多数人的努力程度之低,根本轮不到你拼天赋。
你必须非常努力,才能在别人眼里看上去毫不费力。

要不试试?想想如果你一不小心在一个领域坚持了十年,可能你会发现:
1. 那群智商有余但定力不足的人们,玩了几年就坚持不下去了;
2. 前一波的前辈们不是退休了,就是挂了( - - 我真缺德)。
3. 你一不小心坚持了下来,哎呀妈啊,你智商都没用上就实现屌丝逆袭了,这得多励志啊 XD 。』

嗨,小赖,你要知道:
不设限,不止步,不屈服。