JavaScript小型选择器mini源码解析

2009-10-22 评论(6) 分类:技术文章 Tags:

在网上发现一个JavaScript小型选择器—mini,其介绍在这里已经说得挺清楚了,就不再罗嗦了。简单来说,mini选择器只支持以下选择语句:

* `tag`
* `tag > .className`
* `tag > tag`
* `#id > tag.className`
* `.className tag`
* `tag, tag, #id`
* `tag#id.className`
* `.className`
* `span > * > b`

经过调查,以上选择语句已经满足了95%以上的需求。

mini选择器实例代码如下:

var pAnchors = mini('p > a'); // Returns an array.
for (var i = 0, l = pAnchors.length; i < l; ++i) {
    // Do stuff...
}

下载源码查看,发现源码并不难,至少比jquery简单得多,就想试着分析一下它的源码,练练手,之前我是想分析jquery源码的,但发现实在太难了,超出能力范围了,还是先从简单的代码开始吧。

mini选择器大体上,就是先把选择语句最右边的元素先选出来,再根据左边的父元素层层过滤得到符合整个语句的元素。

例如”#a table .red”这个语句的选择过程,就是先选出页面上所有class=”red”的dom元素,再在选出来的元素中判断其父元素是否为table,是则保存,不是则丢弃。这层筛选完后,把结果再进行一次筛选,判断其父元素是否id=”a”,是则保留,不是则丢弃,最后就筛选出了符合”#a table .red”的所有dom元素。

其余细节的解析,我用注释的方式加在代码上了。我发现要把分析代码的过程写出来真是很难,代码是看得懂,但就是表达不出来代码的意思。我现在写出来的那些注释,似乎有点乱,估计别人也挺难看懂,不过当练兵吧,我在写之前并没有完全了解mini的原理,写完后就清晰了,看跟写还是有很大区别的,写出来对自己挺有帮助。

有些地方其实我也不是知道得很清晰,可能会有错误存在。代码里我还有一些细节不理解,有疑问的地方我打上了**号,希望高手看到能告知吧~

这里可以看到,单独选择一个id占了所有选择语句的一半以上,个人感觉mini没有对id进行单独优化,算是不足吧,并且就算只选择一个id,mini(“#id”)返回的也是一个数组,很不方便,实用性不强。

(更多…)

Q版海底俄罗斯

2009-6-13 评论(5) 分类:作品 Tags:

quadrapop

普通版:http://bangswork.googlecode.com/svn/trunk/QuadraPop/index.html

校内应用版:http://apps.xiaonei.com/quadrapop/

关于游戏

某一天突然想做索爱手机里的“Q版海底俄罗斯”游戏,上网搜了,没人做过非手机版的,有点惊讶,难道这个游戏知名度这么低?没人做刚好,我挺想做这个游戏的。下了这个游戏的手机版,搜了JAR破解软件Halo,提取了里面的图片资源,做成FLASH里一个个元件。FLASH很久没碰了,边做边回顾FLASH那些语法特点,倒还挺快熟悉它,有一些模糊印象,重新学起来很轻松。果然编程思想才是主要的,语言无关紧要。

我做起东西来是挺疯狂的,直到把它完成了才算了解心头一事,所以最近坐在电脑前的时间几乎都用在这上面了。小小的一个游戏,做起来还真不容易,bug不断,逻辑复杂,这也是我设计不合理造成的吧,功力还未到家,但最后总算做出来了,但有多少潜在bug还不知道。

整个游戏还没全做完,还差菜单和排行榜部分,就不放上了,之后打算放上校内网,这该是暑假的事了,快要考试,得集中精力学课程了。

关于体会

写个游戏可以体会到编程一些相关的东西,代码刚开始还很注重质量,分出类,但到后来几乎所有的逻辑都写在一个类里了,因为关联度都很高,不知怎么分出来。成了半对象半结构的程序了。

在查找错误的时候面对一坨代码,复杂得要命,才知道设计模式里那么折腾分出那么多个类是干嘛使的。

面对非常偶然出现的错误,很难碰到,又不知道去哪里查错,了解到软件测试应该是怎样的。

写游戏要注重太多细节了,虽然说事先把整体规划好再写会轻松很多,但没达到一定水平实在是做不到,跟建筑一样,砌砖实施容易,设计整个建筑难。

关于目的

有时候做一件事,不需要那么目的明确吧?有人说“做这个干吗”,很早以前也是,初中时高中时,“怎么老是做这些东西(不好好学习)?”。我可以有很多答案,最简单的是,just for fun。如果每做一件事都要想清楚做它干嘛,那也太累了,想做就做。

关于FLASH

编程过程中,对FLASH以及AS3的一些特点有点不爽:

  1. 编辑器差,连选中整段tab都不行,代码提示非常少。
  2. debugger差,程序出错不会提示是哪一行 只会提示是哪一个函数(也可能是我不会用)
  3. removeListener写错不会报错,如果从未设定addEventListener(Event.ENTER_FRAME,move),写removeEventListener(Event.ENTER_FRAME,move); 时也不会报错
  4. 例:addEventListener(Event.ENTER_FRAME,move) 向侦听函数move传参数超麻烦
  5. 在把显示对象添加进舞台前,在现实对象里无法调用stage,麻烦。
  6. 要在某处延迟执行某一语句很麻烦

后续(6月15日)

做完菜单,本来以为OK了,一玩才发现有时暂停结束回来会出错,为了这个BUG,抓狂了好几个小时,就是找不到究竟是哪里错了,而且到现在我还不知道这个bug解决了没有,惨,被一个BUG搞到头晕脑胀,想来还是因为整个游戏结构设计得差,程序写得乱,有时为了实现一些功能就这补些代码那不些代码,改来改去,很乱。这也是能力不足的体现吧。快要考试了,不能再继续这样疯狂地折腾这个了,就先这样吧。算是有成品出来了:http://cnbang.net/QuadraPop/

活动与程序

2008-8-17 评论(1) 分类:随记 Tags:

班里组织去烧烤,觉得搞一次活动跟编一个程序差不多。

活动:行动前写方案,制定流程,考虑各种情况的发生及解决方法。准备时,分配任务给各个人(买东西、通知 等)。

程序:编写前写文档,列出类、模块,考虑各种功能实现时会出现的问题及解决方法。编写时,分配模块给各人完成(美工、页面、程序模块 等)。

活动方案的制定有很多不确定因素,因为是人参与其中。整个过程可以相对不那么严谨。

程序则不确定因素较少,但整个程序逻辑需要严谨。

方案写得越详细,执行的人越容易,发生意外状况的几率也越低。程序也是如此。所以撰写方案和制定文档的人总是最重要的。需要相当的能力,而执行的人有时只需要照着做。

在学生会工作就是如此,大一时由师兄制定方案,分配任务给自己。大二大三开始自己制定方案统筹。

编写程序也是如此,合作做项目时,刚起步时由水平较高的制定文档,分配任务,自己写指定的模块。

貌似社会上大部分工作都是如此完成的。所以,还是能力决定位置的。重要的还是思想,和统筹大局的能力~~具体的实施和技巧是基础~~

这个暑假写程序,不是项目那个,自己做的,大部分时间都花在“想”上,动手写的时间少点。其实只要在写之前写技术文档把所有都列出来,程序就完成一半了,不过我还没达到那水平。。还是边写边想。。。还没试过在写程序之前先写文档。。以后再试试~~

第一个项目

2008-7-13 评论(2) 分类:作品 Tags:

东莞石龙第三中学

学校网站:http://www.dgslsz.com/index.asp

5月4号,琉森转发一条消息,某学校招人做网站,要求挺低,觉得我做得来,就联系了,几经周折,通过了N个人的联系,第二天傍晚,找到那个学校的人,说了具体要求,当晚就开始动工做了。在此先感谢琉森~~~

第一次接项目,他们要求15号之前做好,10天时间,于是很赶,虽然没有熬夜做,但坐在电脑前的时间都贡献出来了,而且课都不想去上了~~~当时每一天都随便记录了下当天完成了什么:

5日晚:首页面PS图

6日白天:首页css  晚上:内页PS+CSS

7日:ASP article catalog getCatalog页面

8日:评论页面/操作   后台 添加文章

9日:编辑文章 审核评论

10日:教学资源 文件上传 校友之窗

11日:早上:博客 友情连接

12日:公告 管理员登陆、检测 编辑器图片错误 首页内容

嘿,最令人头疼的页面设计在第一、二天就搞定了,自我感觉页面还不错。接下来的时间就是专心写代码了。

第一次做后台,但挺顺利,出现最大的问题就是后台的那个编辑器,因为是插件,不是自己写的,所以一有点小错误,就要搞很久,有一天晚上被它烦透了,最后用了治标不治本的方法解决一个小问题,还留有后患~~~

本来是要用一位师兄写的操作数据库的类的,因为那样防SQL注入,安全性高,但当时时间很紧,那个类的代码看了半天没看懂,就觉得,算了。还是用原始的方法吧。

期限是15号,实际上12号就基本上完成了。做到后面其实有点不想再碰了,所以做完后很少测试。。错误是挺多的。后来他们测试的时候跟我说那些错误,我才改过来。

这项目貌似还没结束,他们提出了两点改进的要求,接下来还要继续改。。。不知啥时候才能彻底结束。不知道,做项目的人,有为网站提供技术支持的义务吗?

第一次ACM

2008-5-31 评论(1) 分类:技术文章 Tags:

昨天被人叫去看了一个人的空间,突然有兴趣试试ACM。最近一直在看RIA相关的博客,了解了挺多,但开始怀疑自己有没有在进步。。网页相关方面 是进步了,但编程能力毫无疑问完全没长进,在没有实践的日子里,做下纯编程的东西还是挺好的,算法、编程能力是基础~~做了即使没成绩也有好处没坏处。很 久没编程,昨晚那么一试,竟然试到我睡不着。。本来一个多小时做完没再碰了,但我的脑袋估计是太久没运转了,一下子过度使用,搞到要睡觉的时候还十分活 跃,睡不着。。。这题提交了4次才被Accepted。。看到这个单词挺有成就感的~~呵~~~也许我对这个会三分钟热度,随我喜好了~~呵呵。。

此题是problem 1088:System Overload,类似于以前在课本上看到的“一群孩子围成一圈数数出列”的一道题,自然是简单题~~

#include &lt;iostream&gt;
using namespace std;
int a[150];
int b[150];
int m,n=1,r,p,cn;
void init(){
    for(int i=0;i&lt;150;i++)
        a[i]=0;
    m=0;
    r=0;
    p=0;
}
void popAt(int num,int cn){
    while(num&lt;cn){
        a[num]=a[num+1];
        num++;
    }
    a[cn]=0;
}
int calculate(int n){
    init();
    while(r!=2){
        for(int i=0;i&lt;n;i++)
            a[i]=i+1;
        m++;
        cn=n;
        popAt(0,cn-1);
        cn--;
        p=m;
        while(cn&gt;1){
            while(p&gt;cn)
                p-=cn;
            popAt(p-1,cn-1);
            cn--;
            p+=m-1;
        }
        r=a[0];
    }
    return m;
}
int main()
{
    int k=0;
    while(n!=0){
        cin&gt;&gt;n;
        if(n==0) break;
        if(n&lt;3||n&gt;150) return 0;
        b[k]=calculate(n);
        k++;
    }
    for(int j=0;j&lt;k;j++){
        cout&lt;&lt;b[j]&lt;&lt;endl;
    }
    return 0;
}