hello,JavaScript | 关注学习前端技术,前端开发,前端,JavaScript,css,html,js,前台,ued,视觉设计(这就是seo?)

CAT | 我的日记

七/10

12

用一段ruby脚本把excel自动导出成table结构

require 'win32ole'
$col_map =["","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
class Excel_Info
  attr_accessor :file_name
  attr_accessor :range
  def initialize(file_name)
    @file_name = file_name
    @range = {}
  end
end
 (全文...)

No tags

我是按照我买他们的时间来安排列表的,从这里你也可以看到我是怎么开始学编程的,顺便把我的一些经历说说。

所有的书都是外国人写的,对这点我深感遗憾,国人写的不如我法眼。。。(这话说的)

1.首先是从高中带过来的两本:

一本是《时间简史简装版》一本是《薛定谔的猫》,这两本是我高二时候买的。其实还有一本《时间简史精装版》的,可惜后来被我搞丢了。

这两本都是讲理论物理的,很有意思,而且讲得不深入。。。特别是《薛定谔的猫》我老喜欢了,书籍资料跳转看:

《薛定谔的猫》 http://book.douban.com/subject/1089271/

略。

这个有兴趣的拿去吧,我现在对理论物理无爱了,因为我直到现在这门课还没过。

2.c#

大二之前我不知道啥是编程。。。大二有门课叫做c++,后来我那个暑假想借本书看看啥是c++,然后去了图书馆,我看到好多c啊,c,c++,c#。我不知道他们有啥区别,于是我随便找了一本,后来发现拿的是c#。然后之后就开始我的编程生涯了,从c#开始。

首先是一本重量级的书 《c#2005&.net3.0高级编程》(第5版) ,现在我只有下半本,上半本被人偷了。原价158.00元,现在10块钱处理。这本书很经典哦,主要是很厚,从新街口书店拿到学校,差点没压死我。。。

然后是一本《beginning c# objects–从概念到代码》,这是一本思想重于概念的书,和上面这本书结合起来看最好不过,算是进阶版吧。这本是完整的,18块钱,卡卡

其实我买了很多本c#的书,不过都被我搞丢了。。。

3.php

学了一些c#后,一直没突破,也就给院里做个小软件啥的,都幼稚的要命。后来偶然我不记得啥时候我开始了php旅程,之后php一直跟着我接近一年。。。

php我看过N本书,不过我买的书就可怜的少了,只有一本《php函数参考手册》。php程序员必备,哇咔咔。原价:69.我出 18元。

4.工程方法

学了编程,难免接触点方法学和工程学的东西,毕竟这些东西才是真正的修养,要不一辈子都是一个代码工人而已。

最经典的一本:《代码之美》,如果你不知道这本书有多牛逼,那你真的out了,不多说。原价:99.我出30元。

第二本:《编程之美》,微软那波人写的,很牛逼很好玩,原价:40元,我出20.因为是本好书。

第二本:《系统分析与设计方法》,这本书也很有用。但是我看的很少,我一个学长推荐我看的,我看不懂。。。原价:69,我出20

第三本:《设计模式初学者指南》,这本比较通俗易懂,也是很出名的书。原价:49,我出:15.

第四本:《uml用户指南》,买了没看过,uml太复杂,还是画脑图划得来。原价:49,我出:12.

第五本:《数据结构与算法-java语言版》第二版,我对算法不感冒,看到树那里就看不懂了。罪过啊。原价:59,我出18.

5.电

《无线电合订本 2007 下》,很经典的电子学杂志,里面很多可爱的例子和教程,5元抛了。

6.flash

大三暑假的时候,有个公司说要要我,但是要会flash,于是我花了三个月学flash。之间买了很多书,不过很多都没了,不知道去哪了。

第一本:《flash ActionScript3.0动画教程》很经典的一本书,看了保准不后悔。原价:59,我出 22.

第二本:《游戏关卡设计》,我无爱。5块钱

第三本:《advanced ActionScript3.0 animation》,这是英文版的,装订比书店那种好多了,之所以是英文版是因为没有中文版。我出 18元。

第一个来买的送程序员杂志一本。。。

No tags

四/10

29

奇怪的需求,无聊的解答

记得曾经学c#桌面编程的时候经常有时候要按名字取得某个实例的引用,貌似搞起来挺麻烦.今天群里有个人提出个更变态的需求来.

说他定义了N个数组变量:

var arr_1=new Array();
var arr_2=new Array();
var arr_3=new Array();
var arr_4=new Array();

然后到了某个时候,他想知道自己定义了多少个类似的变量.
哦,真变态,既然需求变态,那我就写了个变态的解决方法:

var count=0
for(var i in window){
    if(i.substr(0,4)=="arr_"){
        count++
    }
}

很无聊吧,很抱歉耽误了你几分钟的时间….

No tags

四/10

11

js延迟解析的小尝试

后来发现我有些想法真的好幼稚,将代码放在textarea里就不会解析了,还搞的这么复杂,我真是out了

所谓延迟解析,不是延时加载,不是延时执行。

文中说的延迟解析是指,页面里的某些js代码不会被解析,只有当在程序中要用到的时候才解析,以便减少解析js的时间和性能浪费。

对于延迟解析,我首先想到的就是把js代码存在放一个隐藏的pre里,之后在引用之后从pre里取出来创建一个script。script内容就是div里的js内容,然后把script附加到html里。

思路没问题,但是有两个基本问题需要解决。

首先是script标签在ie下不能用js往里填充内容(innerHtml,innerText都不行,后来有人说text属性可以添加内容,我还没试过,有空再试)。第二个问题是js代码存放在pre里的时候,里面的大于号小于号等特殊符号会被解析成html。

对于第一个问题,我试过了很多方法,最后不得不放弃动态创建script的方法,虽然这在标准浏览器里是允许的,但是ie里是不允许的。

替代办法可能会想到用document.body.innerHTML+=”<script>alert(“aa”);<\/script>”;

这样写的问题就是script里的js不会被解析.

还有一种方法就是document.write.document.write里的js会被立即解析.

不过document.write一定要在文档解析结束之前调用,否则document.write会清楚页面上的内容.(例如:在onload函数里执行document.write会使网页里德内容被清空)

之后是第二个问题,就是一些js里德特殊符号会被错误解析成html元素.所以需要一种方法让html解析器跳过他们,于是自然而然想到了html注释,

于是出来了下面这个完整的demo代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <style>
            .script{
                display: none;
            }
        </style>
    </head>
    <body>
        TODO write content
        <pre class="script" id="script">
        <!--
        function aa(){
            alert("dd");
        }
        alert("dddd");
        -->
        </pre>
    </body>
</html>
<script>
        //一定要在onload之前调用
        var innerhtml=document.getElementById("script").innerHTML;
        document.write("<script>"+innerhtml.replace("<!--","").replace("-->","")+"<\/script>")
        aa();
</script>

至于这样写有什么用,延迟解析有什么用,我还真没想清楚,今天想了一天能不能把自己的框架做成按需加载(不是动态加载,动态加载浪费连接数,而且操作麻烦,还不如手动引入)延迟解析主要是可以在用到的时候才解析,这点比较让我觉得有点意义.

No tags

四/10

9

创建dom的几种方法

今天我们带来四种方法,排除了字符串串接法,因为这种方法灵活性不太高,而且字符串串接效率堪忧.

我们从两个方面来对比这四种方法:代码量和效率;

首先介绍这四种方法的实现:

我们以一段html代码为例还展示各个方法的使用时代码量.

        <div class="m-window" style="display:none;" id="tpl">
            <div class="wrap">
                <div class="hd">
                    <div class="l"></div>
                    <div class="m">
                        <div class="icon"><img src="$!img_url"/></div>
                        <div class="title">$!title</div>
                    </div>
                    <div class="r"></div>
                </div>
                <div class="bd">
                    <div class="m"></div>
                </div>
            </div>
        </div>

1。普通的createElement方法:

这种方法没有任何技巧可言,而且代码一些就是一大坨,当然从灵活性来讲它当然是最灵活的,但是繁重的代码量让人蛋疼:

/**
     * 这种方法的缺点就是代码太长,而且document.createElement这一个函数名酒好长,而且代码不美观,逻辑容易混乱,从代码中看不出空间上的逻辑
     * 优点是,可以完全控制dom,可以随时添加事件,属性,样式,层级
     */

 

实现代码:

      //createElement逐个创建法,这里为了减少代码量,用了一些紧凑写法,和三个变量,
    //两个变量用来轮流充当父子元素,另一个变量用来在复杂的地方缓冲一下
    var ele,ele1,ele2;
    (ele=document.createElement("div")).className="icon";
    var ele1;
    (ele1=document.createElement("img")).src="img/icon.gif"
    ele.appendChild(ele1)
    var ele1;
    (ele1=document.createElement("div")).className="m";
    ele1.appendChild(ele)
    var ele;
    (ele=document.createElement("div")).className="title";
    ele.innerHTML="窗口demo";
    ele1.appendChild(ele)
    var ele;
    (ele=document.createElement("div")).className="hd";
    (ele2=document.createElement("div")).className="l";
    ele.appendChild(ele2)
    ele.appendChild(ele1);
    var ele1;
    (ele1=document.createElement("div")).className="r";
    ele.appendChild(ele1)
    var ele1;
    (ele1=document.createElement("div")).className="wrap";
    ele1.appendChild(ele);
    var ele;
    (ele=document.createElement("div")).className="bd";
    var ele2;
    (ele2=document.createElement("div")).className="m";
    ele.appendChild(ele2);
    ele1.appendChild(ele)
    var ele;
    (ele=document.createElement("div")).className="m-window";
    ele.appendChild(ele1)
    document.body.appendChild(ele)

a

2.JsonHtml方法

这种方法是我在淘宝的同事zhuangquan的一个dom创建的实现,在淘江湖中有应用.

原理代码如下:

 var JsonHtml={

                compose:function(config,attrIndex){

                    var tag,attr,ref,childs=[];

                    for(var key in config){
                        var value=config[key];
                        switch(key){
                            case "ref"://引用
                                ref=value;
                                break;
                            case '>>'://子元素
                                childs=value;
                                break;
                            default:
                                tag=key;
                                attr=value;
                                break;
                        }
                    }

                    if(!tag)return;

                    //支持dom对象
                    var root=config[tag].nodeName?config[tag]:document.createElement(tag);

                    if(ref)this[ref]=root;

                    //设置属性
                    JsonHtml.setAttr(root,attr,attrIndex);

                    //添加子类
                    if(childs){

                        if(typeof childs=="string"){
                            root.innerHTML=childs;

                        }
                        else{
                            for(var i=0;i<childs.length;i++){
                                var num=childs[i].num||1;
                                for(var j=0;j<num;j++){
                                    //递归
                                    var childEl=arguments.callee.call(this,childs[i]);
                                    if(childEl)root.appendChild(childEl);
                                }
                            }
                        }

                    }

                    return root;
                },
                //设置属性
                setAttr:function(target,attr,attrIndex){
                    var index=attrIndex?attrIndex:0;
                    for(var p in attr){
                        var value=attr[p];
                        switch(p){
                            case "style":
                                JsonHtml.setStyle(target,value);
                                break;
                            case "className":
                                target.className=value;
                                break;
                            default:
                                target.setAttribute?target.setAttribute(p,value):target[p]=value;
                                break;

                        }

                    }

                },
                setStyle:function(target,style){

                    for(var p in style){

                        target.style[p]=style[p];

                    }
                }

            }

创建上面那段html的方法和优缺点总结如下:

 /**
     * JsonHtm
     * 根据一定的Json格式,构造html,并可把元素绑定到当前作用域
     * 便于widget组件构造html代码,并获对元素的引用
     * requires SNS
     * @author zhangquan
     * @date   2009-08-19
     */
    document.body.appendChild(JsonHtml.compose({
        div:{className:"m-window"},">>":[
            {div:{className:"wrap"},">>":[
                    {div:{className:"hd"},">>":[
                            {div:{className:"l"}},
                            {div:{className:"m"},">>":[
                                    {div:{className:"icon"},">>":[
                                            {img:{src:"img/icon.gif"}}
                                        ]},
                                    {div:{className:"title"},">>":"窗口demo"}
                                ]},
                            {div:{className:"r"}}
                        ]},
                    {div:{className:"bd"},">>":[
                            {div:{className:"m"}}
                        ]}
                ]}
        ]
    }))
 //优点:用json表示,可以从后来直接穿过json字符串来拼出dom结构
    //缺点:不能方便滴绑定事件,和随意引用其中的某个dom元素

s

3.我写的一个函数,是代码量最少的,也是除了createElement之外最灵活的.

原理代码:

 /**
             *一次性完成创建和初始化某个dom元素的操作,在特定情况下使用节省代码
             *简单的创建不推荐使用
             *@param {string} tagName 标签名
             *@param {ele} parentNode 父元素也可以用p简写
             *@param {string} innerHTML 内容
             *@param {json} attributes 属性值对
             *@param {json} styles 要赋予的样式
             *@param {json} event 绑定的事件 例如:event={type:"click",func:function(){}}
             */
            var createElement=function(tagName,params,childs){
                var ele=document.createElement(tagName);
                if(params!=undefined){
                    //可以用p也可以用parentNode指定父元素
                    if(params.parentNode||params.p){
                        (params.parentNode||params.p).appendChild(ele)
                    }
                    if(params.innerHTML||params.i){
                        ele.innerHTML=params.innerHTML||params.i;
                    }
                    if(params.className||params.c){
                        ele.className=params.className||params.c;
                    }
                    if(params.attr||params.a){
                        var attr=params.attr||params.a;
                        for(var i in attr){
                            ele[i]=attr[i];
                        }
                    }
                    if(params.styles||params.s){
                        //这是我定义的一个函数,用来混合样式
               //         M.dom.mixinStyle(ele,params.styles||params.s)
                    }
                    if(params.event||params.e){
                        params.event=params.event||params.e;
                        //用来添加事件
            //            M.Event.on(ele,params.event.type,params.event.func);
                    }
                }
                if(childs==undefined) return ele;
                if(childs.length==undefined){
                    ele.appendChild(childs);
                } else{
                    for(var i=0,n=childs.length;i<n;i++){
                        ele.appendChild(childs[i])
                    }
                }
                return ele;
            }

s

创建上面的html结构的代码如下:

 var C=createElement;
    C("div",{c:"m-window",p:document.body},C("div",{c:"wrap"},[
        C("div",{c:"hd"},[
            C("div",{c:"l"}),
            C("div",{c:"m"},[
                C("div",{c:"icon"},C("img",{a:{src:"img/icon.gif"}})),
                C("div",{c:"title",i:"窗口demo"})
            ]),
            C("div",{c:"r"})
        ]),
        C("div",{c:"bd"},C("div",{c:"m"}))
    ]))
 //缺点,没想出来,因为是我写的
    //优点,很明显,代码量最少,而且可以直接往各个元素上加样式属性和事件等等.
    //而且是用函数嵌套创建,可以在任何地方插入一个对dom的引用
    //没有特殊操作,性能较有,就是直接创建,没有特殊的处理,
    //优点太多了,不追叙

s

4.模板创建法:

这种方法把模板放在页面里,然后hidden掉,原理类似php或者其他语言中的模板,效率是最低的,但是重构起来时最简单的.也是我的一个实现:

  var ViewBuilder=function(){
        /**
 *这是一个视图构建类,传进一个模板字符串和数据结构,将其构造成html字符串,此类改进中,因为性能可以提升
 */
        return{
            /**
     *构造函数
     *param s 数据结构,必须符合一定的规则,例如:
     *
                data:{
                    username:"sffffffffffffffffffffffffffffffffffffffffffffs",
                    content:"ss",
                    time:"ss",
                    yes_num:0,
                    no_num:0
                }
     *param tpl_id 存放模板的html元素,值用$!标记,标记跟data里的key相同,顺序不变
     */
            build:function(s,tpl){
                if(s==null||tpl==null){
                    alert("ViewBuilder->build()的参数不完整")
                }

                //获取到模板字符串
                var tpl_str=tpl,reg_str="",count=1,replace_txt="";
                //根据数据构造正则字符串
                for(var data1 in s){
                    reg_str+="([\\s\\S]*?)\\$\\!"+data1+"";
                    count++
                }

                reg_str+="([\\s\\S]*)"
                //构造完毕,生成正则字符串
                var reg=new RegExp(reg_str);
                //在模板字符串里执行这个正则
                reg.exec(tpl_str)
                count=1
                tpl_str=""
                //根据匹配的数据重新构造html
                for(var data in s){
                    tpl_str+=RegExp["$"+count]+s[data]
                    count++
                }
                tpl_str+=RegExp["$"+count]
                //返回html结构的字符串,ok
                return tpl_str

            }
        }
    }()

应用代码:

 var div=document.createElement("div")
    div.className="m-window"
    div.innerHTML=ViewBuilder.build({
        img_url:"img/icon.gif",
        title:"窗口demo"
    },$("tpl").innerHTML)
    document.body.appendChild(div)
    //优点,无论dom多复杂都只需这么些代码
    //多次创建窗口的时候比较方便,方便以后更改dom结构,只需要把模板在html中修改即可,直观快速,这是其他方法所不具备的
    //缺点,和字符串串接法缺点相同

s

然后我对这四种方法做了个性能测试,从性能上看第一种方法的性能是最快的,其他在不同浏览器中都有不同的表现:

chrome:

56563765876876

firefox:

865956867376

ie6:

957897678457

No tags

四/10

8

使用tms的一次出错经历总结

今天在使用tms的时候出现严重错误,造成数据全部丢失,吓了我一身冷汗,下面把起因总结下,以后可以预防这种错误的出现:

1。改tms的时候标准流程是先在本地测试制作页面,然后把代码专成tms,如果不确定可以在tms里做一个测试的页面,测试功能,不能再原页面上测试.

2。之后开始改tms,首先通知运营停止编辑tms,不要发布tms,然后将tms里的内容复制出来做一个备份,注意这里的备份千万不要动,不要直接在备份上改tms,为了防止不小心改了tms备份,应该将其备份之后就在ide里关掉,这样一是关掉了就没机会改备份了,二是如果在ide里不小心改了备份,之后发现不应该改备份,按着ctrl+z回退的时候会会退到第一次打开这个文件时候的状态,而这个状态可能不是你备份的那个状态,有的ide又不提供前进选项,这时候你的备份就丢失了.这就是我早晨编辑tms的时候出的问题.

3。tms里用name属性来标示每次更改,每次更改内容之后name值都会改变.如果你从备份里粘贴一份备份内容到tms的时候,tms提示你**个name将丢失,确定更改?这个时候就要好好考虑下了,为什么name会丢失?如果是你的确删除了一些tms标签,name是可能丢失的,这是正常的情况.但是如果你的备份比当前的内容旧的话,那种name丢失就不正常了,name丢了,里面的内容也就丢了,这时候要仔细考虑下,防止内容丢失.

有时候虽然你知道name丢失不会造成影响,但是如果运营那边说要回滚,因为样式有误之类的,这时候内容也会丢失,这种情况最好自己也备份一份数据,实在不行找工作人员回滚

4。从tms备份一份到本地之后,不能直接在这个备份上改tms,而应该再复制一份,在这份上面改,改好了之后一起复制到tms里.测试无误之后通知运营.

5。改tms就是要仔细啊,不能图省事……

创建dom的几种方法

No tags

三/10

17

精品文章收编,永久置顶

一/10

9

2009年重新设计过的著名的Logo

Logo设计的好坏,关系着一个企业如何树立形象的问题。Logo设计本身就是一个困难的课题,有了著名的Logo,将它重新设计就是一项更加挑战的工作。如果处理不当,他会带来怎样的后果?文中列出了2009年重新设计过的著名Logo,在这里不评判他们的好坏,只是列在这里,供大家来参考。

1、Telcom

image

2、Play Station 3

image

3、Sunny Delight

image

4、Lays

image

5、Sony Ericsson

image

6、Yale

image

7、Sprite

image

8、Segd

image

9、Pfizer

image

10、Opera

image

11、OMCA

image

12、MSN

image

13、Nicklodeon

image

14、Movistar

image

15、Meiji

image

16、Kraft Foods

image

17、Doctor WHO

image

18、Jack in the box

image

19、France

(全文…)

十二/09

30

MOTODEV出了1.1版本了(android开发工具)

MOTODEV是摩托罗拉耗费大量人力打造的android开发工具,支持原生的android开发和二次开发的ophone平台开发,同时提供基于java的开发和JavaScript+html+css的UI开发两种方式.
MOTODEV和原生的android开发工具有什么不同呢,其实MOTODEV就是基于原生的开发工具的二次开发,集成了一些常用配置,因为在配置android开发工具的环境的时候非常麻烦,而且经常出错,很多时候都无法解决,这个工具就是把所有的功能都集成进来,无需配置,安装完了就可以开始开发.方便了不少.而且我发现MOTODEV内置的模拟器比原生的模拟器快很多,启动超级快,运行也比较快

最新版下载地址:http://developer.motorola.com/docstools/motodevstudio/download/

moto的开发文档也不错,虽然是英文,但是看着还算流畅,内容很不错

http://developer.motorola.com/docstools/library/

· · · ·

十二/09

14

第四届D2前端技术论坛邀请函

2009-12-14 23 25 17

今晚收到的邮件,欧耶,咱也去凑个热闹去.

· · ·

Theme Design by devolux.nh2.me