为IE6写的querySelector

为了尽量实现浏览器兼容,同时又能方便进行节点定位,我就写了这两个函数,对于支持querySelector的浏览器会调用自带的querySelector,如果浏览器不支持,就调用自己实现的函数。

此函数可能有些bug,不过现在我还没遇到,有人要是遇到了给个留言我有空就去修掉。

//支持 #id|.classname|tagname|tagname.classname|tagname#id四种,如果要多层筛选,请重复调用
function querySelectorAll(node,selector){
    if(typeof(document.querySelectorAll)!='undefined'){
        return node.querySelectorAll(selector);
    }
    var tname;
    var citems;
    function findElementsByClassNameInner(n,className){
        var items= n.children;
        for(var i=0;i<items.length;i++){
            if(items[i].className==className){
                citems.push(items[i]);
            }
            findElementsByClassNameInner(items[i],className);
        }
        return citems;
    }
    function findElementsByIDInner(n,id){
        var items= n.children;
        for(var i=0;i<items.length;i++){
            if(items[i].id==id){
                citems.push(items[i]);
            }
            findElementsByIDInner(items[i],id);
        }
        return citems;
    }
    if(selector.charAt(0)=='.'){
        tname=selector.substring(1);
        citems=new Array();
        var items=findElementsByClassNameInner(node,tname);
        return items;
    }
    else if(selector.charAt(0)=='#'){
        var id=selector.substring(1);
        citems=new Array();
        var items=findElementsByIDInner(node,id);
        return items;
    }
    else if((r=selector.match(/(\w+)\.(\w+)/))!=null){
        tagName=r[1].toLowerCase();
        className=r[2];
        citems=new Array();
        var titems=findElementsByClassNameInner(node,className);
        var items=new Array();
        for(i=0;i<titems.length;i++){
            if(titems[i].tagName && titems[i].tagName.toLowerCase()==tagName){
                items.push(titems[i]);
            }
        }
        return items;
    }
    else if((r=selector.match(/(\w+)#(\w+)/))!=null){
        tagName=r[1].toLowerCase();
        id=r[2];
        citems=new Array();
        var titems=findElementsByIDInner(node,id);
        var items=new Array();
        for(i=0;i<titems.length;i++){
            if(titems[i].tagName && titems[i].tagName.toLowerCase()==tagName){
                items.push(titems[i]);
            }
        }
        return items;
    }
    else{
        var items= node.getElementsByTagName(selector);
        return items;
    }
}
//支持 #id|.classname|tagname|tagname.classname|tagname#id四种,如果要多层筛选,请重复调用
function querySelector(node,selector){
    if(node==null) return null;
    if(typeof(document.querySelector)!='undefined'){
        return node.querySelector(selector);
    }
    var items=querySelectorAll(node,selector);
    return items.length==0 ? null:items[0]
}

//调用示例
window.onload=function(){
    //var li=document.querySelectorAll("#Test li.a1");
    var test=querySelector(document.body,"#Test");
    var li=querySelectorAll(test,"li.a1");
    alert(li.length);
}

Continue reading “为IE6写的querySelector”

开始使用git了

以前一直用的svn管理自己的文件,给了自己很大的帮助。版本控制不仅仅可以用在程序开发人员身上,对任何使用计算机的人而言都会有很大的帮助。

不过,svn也有很多的问题,比如说,它会在每个目录下创建一个.svn目录,这个目录内的文件是记录版本信息的,但它在工作目录里几乎到处都是,复制的时候也会一起复制走。虽然svn export可以导出干净的文件,但这个操作首先要浪费时间,而且意味着svn控制中的目录是不干净的,不能随便拷。不过据说新版本的svn也跟git一样改为只有一个控制目录了。

svn还有一个问题就是它不是分布式的,它有一个中心服务器,这个中心服务器控制着整个项目的版本进度,也就是说,当这个中心服务器出了问题,整个项目就处理无法控制版本的情况。而git做得很好,git是分布式的,任何一个机器都是一台版本控制体,其实并没有真正的服务器概念,当文件有变更时,直接提交到本地仓库。想把自己的仓库发送到其他机器上,就叫做推送,想把其他机器上的信息复制过来,就叫拉取。当多台机器都发生变化时,相互推送后会产生不同的分支,可以通过合并操作将两个改动合并到一起去。

觉得git不仅是很强的版本控制软件,甚至可以做同步软件了,不仅可以取代rsync进行文件的备份,甚至比rsync更厉害。为什么?因为rsync是有服务器概念的,而git没有。

蛋疼拿2440做BT下载

一直都很蛋疼想自己做一个ARM的网盘和下载器,电路都画好了,也没有拿去找工厂做,觉得还是要浪费几百块钱啊。所以就把以前自己学ARM的s3c2440板拿来搭了个…..

这个板子只有64MB内存,编译了个openssh上去,发现也就占用1o几兆内存,本来是想编译个lighthttpd和PHP上去跑的,但想想有ssh就够了,以后再自己写个满足需要的HTTP Server安装上去就行了,主要就是上传、下载文件和提交种子文件,所以没必要装这么大的程序上去。

然后编译了个CTorrent,测试了是可以下载BT资源的,还相当好用。

Continue reading “蛋疼拿2440做BT下载”

java版的WebSocket测试服务器

这是一个封装好的WebSocket服务器,通过简单的扩展就可以实现基于websocket的服务。写这个工具的主要目的是为了用于方便websocket应用的前端和服务器同时开发。

比如做HTML5游戏一般都是服务器和客户端同时开发。在开发之前最重要的就是制定通信协议,但游戏客户端在开发时可能需要调用接口,此时如果服务器端还未实现的话,就可能影响客户端的开发工作,用这个就可以解决问题。

可以在开发游戏客户端前,完成通信接口的简单实现,下面是一个调用示例:

import org.json.JSONException;
import org.json.JSONObject;

import com.hoverlees.ws.*;

public class Test implements WebSocketHandler {
	private int id=1;
	public Test(){
		WebSocketServer server;
		server=new WebSocketServer(8766);
		server.setHandler("/", this);
		try {
			server.start();
		} catch (WebSocketServerException e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args){
		new Test();
	}

	@Override
	public void onConnect(WebSocketServer server,WebSocketSession session) {
		System.out.println("用户["+id+"]进入.");
		session.userData=id;
		id++;
		server.sendPacket(session, ("Hello!".getBytes()));
	}
	@Override
	public void onPacket(WebSocketServer server,WebSocketSession session, WebSocketPacket packet) {
		System.out.println("收到用户["+session.userData+"]数据: \""+packet.getStringData()+"\"");
		try{
			JSONObject obj=new JSONObject(packet.getStringData());
			String cmd=obj.getString("cmd");
			if(cmd.equals("add")){
				int sum=obj.getInt("a")+obj.getInt("b");
				server.sendPacket(session, ("a+b="+sum).getBytes());
			}
			else if(cmd.equals("sub")){
				int sub=obj.getInt("a")-obj.getInt("b");
				server.sendPacket(session, ("a-b="+sub).getBytes());
			}
		}catch(JSONException e){
			e.printStackTrace();
		}
	}
	@Override
	public void onDisconnect(WebSocketServer server,WebSocketSession session) {
		System.out.println("用户["+session.userData+"]退出.");
	}
}

Continue reading “java版的WebSocket测试服务器”