嘴馋了,自己弄的。 味道还不错 🙂 🙂
阳江游
为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); }
清远游玩
二人麻将
开始使用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资源的,还相当好用。
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+"]退出."); } }
广州
到广州了,以后就在这边发展了,好好加油。顺便满足一下作为吃货的需求。