手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2010年08月的文章

javascript模版系统

用javascript做模版的话,说来也算是比较方便的,特别是对于PHP开发来说,只要扔一个json数组过来。然后剩下的就可以让javascript来完成了。
搜索一下jQuery的plugin,可以找到大约5~6个模版程序。好象用的比较多的还是jTemplate,上一次司徒正美用javascript写了一个简单的例子,这次又写了一个比较详细的,说是v2,有兴趣的朋友可以尝试一下。。
--start--司徒正美认为模版要处理复杂的玩意,所以写的功能就强大了。
本版本主要是对原模板系统进行提速,去掉消耗巨大的辅助函数。本来想用它与John Resig的 Micro-Templating比较一下速度,发现对方无法处理复杂的模板,残念。

JavaScript代码
  1. //司徒正美 javascript template - http://www.cnblogs.com/rubylouvre/ - MIT Licensed  
  2.      (function () {  
  3.                if(!String.prototype.trim){  
  4.                    String.prototype.trim = function(str) {  
  5.                        return this.replace(/^[\s\xa0]+|[\s\xa0]+$/g, '');  
  6.                    }  
  7.                }  
  8.                var dom = {  
  9.                    quote: function (str) {  
  10.                        str = str.replace(/[\x00-\x1f\\]/g, function (chr) {  
  11.                            var special = metaObject[chr];  
  12.                            return special ? special : '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4)  
  13.                        });  
  14.                        return '"' + str.replace(/"/g, '\\"') + '"';  
  15.                    }  
  16.                },  
  17.                metaObject = {  
  18.                    '\b''\\b',  
  19.                    '\t''\\t',  
  20.                    '\n''\\n',  
  21.                    '\f''\\f',  
  22.                    '\r''\\r',  
  23.                    '\\': '\\\\' 
  24.                }, 
  25.                parser = document.createElement("div"), 
  26.                startOfHTML = "\t__views.push(", 
  27.                endOfHTML = ");\n"; 
  28.            
  29.                //onsite,可选,Boolean,是否就地替换掉模板容器,默认true,如果为false,则返回一个文档碎片,交由用户自己插入到需要的地方 
  30.                dom.ejs = function (obj) { 
  31.                    var onsite = obj.onsite === void 0 , 
  32.                    left = obj.left || "<%", 
  33.                    right =obj.right || "%>", 
  34.                    selector = obj.selector, 
  35.                    isLeft = true, 
  36.                    buff = ["var __views = [];\n"], 
  37.                    fragment = document.createDocumentFragment(), 
  38.                    el = document.getElementById(selector), 
  39.                    ejs = dom.ejs; 
  40.                    if (!el) throw "找不到目标元素"; 
  41.                    var str = el.text.trim(); 
  42.                    if(!ejs[selector]){ 
  43.                        while(str.length){ 
  44.                            var condition = isLeft ? left :right; 
  45.                            var index = str.indexOf(condition); 
  46.                            if(index !== -1){//取左边 
  47.                                var text = str.slice(0,index); 
  48.                                if(isLeft){ 
  49.                                    buff.push(startOfHTML, dom.quote(text.trim()), endOfHTML); 
  50.                                }else{ 
  51.                                    switch (text.charAt(0)) { 
  52.                                        case "#"://处理注释 
  53.                                            break; 
  54.                                        case "="://处理后台返回的变量(输出到页面的); 
  55.                                            buff.push(startOfHTML, text.slice(1), endOfHTML) 
  56.                                            break; 
  57.                                        default: 
  58.                                            buff.push(text, "\n") 
  59.                                    }; 
  60.                                } 
  61.                            }else{ 
  62.                                if(isLeft){ 
  63.                                    buff.push(startOfHTML, dom.quote(str), endOfHTML); 
  64.                                    break; 
  65.                                }else{ 
  66.                                    throw "在字符串{{ "+dom.quote(str)+" }}中找不到右界定符"+right 
  67.                                } 
  68.                            } 
  69.                            str = str.slice(index+2).trim(); 
  70.                            isLeft = !isLeft; 
  71.                        } 
  72.                        ejs[selector] = new Function("json", "with(json){"+buff.join("") + '};return __views.join("");')  
  73.                    }  
  74.                    parser.innerHTML = ejs[selector](obj.json || {});  
  75.                    while (parser.firstChild) {  
  76.                        fragment.appendChild(parser.firstChild)  
  77.                    }  
  78.                    return onsite ? el.parentNode.replaceChild(fragment, el) : fragment;  
  79.                };  
  80.                window.dom = dom;  
  81.   
  82.            })();  

这种使用原生代码写的例子,可以被任何代码所使用,如果你有兴趣也可以看看司徒正美的例子的。原文网址在javascript 模板系统 ejs v2,可以移步一观。

Tags: jquery, template, 模版, 模板

了解自己的短板

本文写的很乱,已经是想到什么写什么了。所以无可读性,纯属自己的记录和想法

不管是在生活中也好,工作中也好,其实都会有自己的短板,只有了解自己的短板才能扬长避短,以便更好发挥自己的特长 。如果尽让别人注意你的短板,而一直忽略了你的长板,那你在工作中也就会处处受阻无法正常发挥自己的能力。

什么是你的短板?交流?心态?算法?数据结构?数据库?又或者是其他?好好的了解,对自己的职业生涯也有好处。抛开技术因素,可能更多的就是心理因素了。

得明白自己想要的东西,才能真正获得自己想要的东西。看了一下Fenng写的去大公司还是去小公司工作?,就是说了那种迷惘的心态。

去大公司还是去小公司,自己究竟是想干什么 ,为了钱,还是为了技术?

所以我现在明白了自己想要做什么 ,才会想到写这个博客。算是做一个纪录罢

Tags: 短板

Discuz Uchome 小技巧

discuz的ajaxpost功能有点强大,但缺点也很明显,如果ajaxpost提交一个FORM,那么返回的时候只能显示showmessage的内容,而不会主动跳转,因此这里就有一个小技巧 了。。

比如默认submit按钮这样操作:onclick="ajaxpost('formid')";之类的,我们可以先这样。。
onclick="$('__formid').innerText='';ajaxpost('formid');checkPostResult();";
含义其实很简单,先把ajaxpost提示信息所在的div内容清空。然后提交。最后,根据返回值来判断。。

JavaScript代码
  1. function checkPostResult(){  
  2.     var cid = setInterval(function(){  
  3.         if( $('__formid').innerText == 'success'){  
  4.                 alert('提交成功');  
  5.                 location.href='xxxxx.php';  
  6.                 clearInterval(cid);  
  7.         }  
  8.     },1000);  
  9. }  

这个处理也很简单,为什么是用setInterval和clearInterval,主要是由于ajax是异步操作,如果不用setInterval方法 ,那么在ajaxpost结束的时候,其实提示信息还没有append到提示信息所在的ID里,所以用setInterval方法先延迟然后循环处理最后再结束提示。。。

clearInterval用的不太对,但短时间内想不到更好的。先这样临时解决喽。

Tags: discuz, uchome, tips

常用函数:copyToClipboard

COPY文字到剪贴板很方便,我是指在IE下面,而其他的就有点复杂了。firefox下面有安全选项的。所以很多人都采用了flash来实现。如果不计flash,那么下面这个函数就十分有用了,可能是转的过多了,也不记得来源是哪里了。如果是原作者看到,请提示一下,一定加上您的链接。

JavaScript代码
  1. function copyToClipboard(txt) {     
  2.     if(window.clipboardData) {     
  3.             window.clipboardData.clearData();     
  4.             window.clipboardData.setData("Text", txt);     
  5.     } else if(navigator.userAgent.indexOf("Opera") != -1) {     
  6.          window.location = txt;     
  7.     } else if (window.netscape) {     
  8.          try {     
  9.               netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");     
  10.          } catch (e) {     
  11.               alert("被浏览器拒绝!\n请在浏览器地址栏输入'about:config'并回车\n然后将'signed.applets.codebase_principal_support'设置为'true'");     
  12.          }     
  13.          var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);     
  14.          if (!clip)     
  15.               return;     
  16.          var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);     
  17.          if (!trans)     
  18.               return;     
  19.          trans.addDataFlavor('text/unicode');     
  20.          var str = new Object();     
  21.          var len = new Object();     
  22.          var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);     
  23.          var copytext = txt;     
  24.          str.data = copytext;     
  25.          trans.setTransferData("text/unicode",str,copytext.length*2);     
  26.          var clipid = Components.interfaces.nsIClipboard;     
  27.          if (!clip)     
  28.               return false;     
  29.          clip.setData(trans,null,clipid.kGlobalClipboard);     
  30.          alert("复制成功!")     
  31.     }     
  32.     

Tags: clipboard, flash, firefox

资料:rsync

服务器同步,最简单的恐怕就是rsync了。如果是同一机房,如果是ubuntu,那就真的是灰常灰常简单啊。apt-get install rsync就over了。当然配置还是需要自己来的。
找的资料居然是百度百科的。好郁闷啊。不过。。。还是COPY一份了(话又说回来,现在百度百科在人肉整理+金钱攻势下,资料也真的是越来越完善了。只是不知道啥时候会把RFC也帮忙全部汉化一下吧。比如大家关心的tcp/ip,http协 议等,是不是也该整个汉化的版本之类的?【或许已经有了只是没有注意过罢了】)
原文:http://baike.baidu.com/view/1183189.htm
rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。它的特性如下:

  1. 可以镜像保存整个目录树和文件系统。
  2. 可以很容易做到保持原来文件的权限、时间、软硬链接等等。
  3. 无须特殊权限即可安装。
  4. 优化的流程,文件传输效率高。
  5. 可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
  6. 支持匿名传输,以方便进行网站镜象。

软件下载
rysnc的主页地址为:http://rsync.samba.org/ ,目前最新版本为3.0.7。可以选择从原始网站下载:http://rsync.samba.org/ftp/rsync/。
安装
Ubuntu安装: sudo apt-get install rsync
RedHat: yum install rsync
编译安装
rsync的编译安装非常简单,只需要以下简单的几步:
[root@www rsync-2.4.6]# ./configure
[root@www rsync-2.4.6]# make
[root@www rsync-2.4.6]# make install
但是需要注意的是必须在服务器A和B上都安装rsync,其中A服务器上是以服务器模式运行rsync,而B上则以客户端方式运行rsync。这样在web服务器A上运行rsync守护进程,在B上定时运行客户程序来备份web服务器A上需要备份的内容。
rsyncd.conf
rsync服务器的配置文件是rsyncd.conf.
以下是一个rsyncd.conf的样本:
# Distributed under the terms ofthe GNU General Public License v2
# Minimal configuration file for rsyncdaemon
# See rsync(1) and rsyncd.conf(5) man pagesfor help
# This line is required by the/etc/init.d/rsyncd script
pid file = /var/run/rsyncd.pid
port = 873
uid = root
gid = root
use chroot = yes
read only = yes
max connections = 5
#This will give you a separate log file
#log file = /var/log/rsync.log
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[test]
path = /home/nemo
list=yes
ignore errors
auth users = root, nemo
secrets file = /etc/rsyncd/rsyncd.secrets
comment = linuxsir home
exclude = tmp/
各个参数具体含义参见man rsyncd.conf
服务器端启动:
usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
可能需要root权限运行.
/etc/rsyncd/rsyncd.conf 是你刚才编辑的rsyncd.conf的位置.
也可以在/etc/rc.d/rc.local里加入让系统自动启动等.
客户端同步:
rsync -参数 用户名@同步服务器的IP::rsyncd.conf中那个方括号里的内容 本地存放路径 如:
rsync -avzP nemo@192.168.10.1::nemo /backup
说明:
-a 参数,相当于-rlptgoD,-r 是递归 -l 是链接文件,意思是拷贝链接文件;-p 表示保持文件原有权限;-t 保持文件原有时间;-g 保持文件原有用户组;-o 保持文件原有属主;-D 相当于块设备文件;
-z 传输时压缩;
-P 传输进度;
-v 传输时的进度等信息,和-P有点关系,自己试试。可以看文档;

扩展阅读: 
  1. http://chenzhuo.blog.51cto.com/150592/269530 rsync配置实例

现在,windows下面也有rsync客户端了。。。

Tags: rsync, linux

Records:45123456789