url重写后的路径问题

October 17th, 2008

以前用FleaPHP的url_rewrite模式一直有一个很头痛的问题, 就是页面上相关资源的路径问题.

问题大概是这样的, 为了让url更加友好我们使用apache的mod_rewrite将类似

http://localhost/?controller=default&action=index&a=1

这样的路径重写成

http://localhost/default/index/a/1

或者

http://localhost/default/index/a/1.html

这样, 但是如果是这样那么浏览器请求页面相关资源的基地址就发生了改变, 从原来的documentroot下变成了documentroot/default/index/a, 如果你要在页面上显示一个图片 1.jpg, 那么原来本来应该在documentroot/1.jpg下找到的文件却变成了documentroot/default/index/a/1.jpg, 那结果肯定是找不到的.

为了解决这个问题以前用过很多方法, 用的最多的就是使用绝对路径来解决这个问题, 这是有一个前提的, 就是程序一定要放在虚拟机的根目录下, 这样在html中要将所有的资源都是用/开头, /的意思是从根目录下开始寻找, 在localhost下的任何一个程序在任何目录中使用/1.jpg都会被指向documentroot/1.jpg, 这里再强调一个概念, “./”是当前目录, “../”是上级目录, “/”是根目录.

上面这个方法实际上已经可以解决这个问题了, 但是有局限, 就是程序的目录是固定的, 一定要在虚拟机根目录下, 这样或多或少会带来一些麻烦, 至少我觉得调试不方便. 于是又有了第二个解决方案, 也就是上面方案的升级版. 我们在全局定义一个常量 define(‘PRE_DIR’, ‘/’); 这样的话要将程序中所有的资源路径都写成类似 <?php echo PRE_DIR;?>dir/filename.jpg, 这样的话资源会被定为到 /dir/filename.jpg, 如果要将程序放在二级目录 test/下的话, 只要将PRE_DIR的值改成’/test/’就可以了.

其实在这之后又有了升级版, 但是不打算介绍太多, 因为这不是重点, 在手动改目录之后大家就想到要程序自动检测当前目录, 这个以前有做过, 是个不错的想法, 代码不少, 但是找不到了.

还有个东西我觉得比较神奇的, smarty有一个自动替换的插件, 可以自动在所有模板的资源链接前面加前缀, 当然前提是你已经定义了这个前缀, 插件名不记得了, 太久不用找不到了.

还是说重点吧, 昨天bobhero给我提供了一个新的思路, 利用mod_rewrite重新对资源进行定向, 后来到网上找相关的资料, 没有找到, 只找到了一些mod_rewrite的教程什么的. 研究了一下午也没研究出来, 因为url太复杂了, 很多情况都要考虑进去, 正则说什么就写不明白了, 今天早上终于搞定了.

_________.htaccess_____________________

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]*)(\.html)?$ index.php/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]*)/(.*\..*)$ $2

________end of .htaccess_____________

起作用的其实就这些东西,  可能还会有错误, 不过的确生效了.简单解释一下, RewriteCond %{REQUEST_FILENAME} !-f是条件语句, 意思是说如果请求的文件不存在下面的规则才生效. 第一条规则RewriteRule ^([^.]*)(\.html)?$ index.php/$1 [L]是FLEAPHP的重写规则.

下面两条才是为了解决路径问题的, RewriteRule ^([^/]*)/(.*\..*)$ $2的作用大概是这样, 比如url是这样controller/action/page/1,那么该页的style/css.css可能变成了controller/action/page/style/css.css, 这条语句就是要将controller/action/page/style/css.css指向action/page/style/css.css, 而由于某种机制请求每更换一次目录就会再执行一次根目录下的.htaccess中的重写规则, 由于action/page/style/css.css也不存在所以又被定向到page/style/css.css, 同理page/style/css.css也不存在, 再向上 style/css.css, 由于文件存在而不再执行重写规则, 向用户返回style/css.css的内容.

总的来说最后的这个方法除了apache受点累还是很完美的, 这样大概可能每个资源请求都会被重定向4次以上, 目前还不清楚对执行效率有多大的影响.

参考资料:

竹笋炒肉:Apache的Mod_rewrite学习

识别用户是否是通过手机访问

October 9th, 2008

今天花了些时间研究这个问题, 不过目前为止没有找到比较完美的解决方案, 简单说说吧.

现在网上一般有这样几种方法:

第一种是根据浏览器发送的HTTP_USER_AGENT来判断用户是否是通过手机访问网站. 这种方法比较普遍, 可以通过匹配关键字适应大多数手机, 但由于HTTP_USER_AGENT格式并没有标准规范并且不是HTTP协议必须的参数, 所以无法适应所有手机或者所有浏览器, 有些手机甚至不发送HTTP_USER_AGENT.

注: 可以在网上搜到别人搜集的各型号手机和浏览器的HTTP_USER_AGENT

第二种方法是根绝浏览器发送的HTTP_ACCEPT, HTTP_ACCEPT可以判断浏览器支持哪些格式的页面, 比如WAP, HTML, XHTML, XML等, 但对于判断用户是否通过手机访问并不是非常准确, 因为HTTP_ACCEPT不是同样必须的, 多数浏览器并不会在HTTP_ACCEPT中进行过多的描述, 比如一个浏览器如果声明了自己支持wml那它可能支持wml, 但是如果不声明wml并不代表就一定不支持wml.

比如Firefox3的HTTP_ACCEPT是这样的:

text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8 

而黑莓8800的HTTP_ACCEPT是这样的

application/vnd.rim.html, text/html, application/vnd.wap.xhtml+xml, text/vnd.sun.j2me.app-descriptor, image/vnd.rim.png,image/jpeg, application/x-vnd.rim.pme.b, application/vnd.rim.ucs, image$1.gif;anim=1, application/vnd.rim.jscriptc;v=0-8-8, application/x-javascript, application/vnd.rim.css;v=1, text/css;media=handheld, application/vnd.wap.wmlc;q=0.9, application/vnd.wap.wmlscriptc;q=0.7, text/vnd.wap.wml;q=0.7, */*;q=0.5 

还有一种方法有人说可以判断用户的IP, 原理也简单, 因为在国内GPRS上网是通过代理连接的, 所以用户的IP可能是固定的几个, 但是我并不确定手机不能够通过其他方式上网, 比如3G, 或者说我用手机模拟器登录的时候就有可能出错, 或者说如果我用手机当猫那么会将我通过电脑进行的访问当作手机来处理.

还有一种方法我觉得很不错, 如果浏览器支持javascript的话, 可以判断显示器的尺寸, 没有人会用一个19寸大的手机吧?

说来说去, 还是没有找到完美的解决方法, 不过综合这几种方法写了一个函数.

/**
 * 是否是通过手机访问
 *
 * @return bool 是否是移动设备
 */
function isMobile()
{
    // 如果有HTTP_X_WAP_PROFILE则一定是移动设备
    if (isset($_SERVER['HTTP_X_WAP_PROFILE'])) {
        return true;
    }

    $keywords = array('nokia', 'sony', 'ericsson', 'mot',
        'samsung', 'sgh' ,'lg', 'sie-',
        'philips', 'panasonic', 'alcatel', 'lenovo',
        'cldc', 'midp', 'wap', 'mobile');
    // 从HTTP_USER_AGENT中查找手机浏览器的关键字
    if (preg_match("/(" . implode('|', $keywords) . ")/i",
        strtolower($_SERVER['HTTP_USER_AGENT']))) {
        return true;
    }

    if (isset($_SERVER['HTTP_ACCEPT'])) {
        // 如果只支持wml并且不支持html那一定是移动设备
        // 如果支持wml和html但是wml在html之前则是移动设备
        if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false)
        && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false
        || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml')
        < strpos($_SERVER['HTTP_ACCEPT'], 'text/html')))) {
            return true;
        }
    }

    return false;
}

好陌生

September 12th, 2008

颠簸了一晚, 终于到家了, 我已经半年多没回来了, 这次回来, 不再是一个大学生了, 成了一个漂泊在外的打工仔, 在外面的时候总是想着, 可回来了又感觉好陌生。

今早刚下火车, 车站门口是一帮出租车司机和旅店的人在拉客, 我拿了好多东西, 虽然很重, 但是我没有打车, 家离车站不是很远, 五六百米的样子。

刚走出车站就发现变化好大, 家附近的楼房拆了不少, 又在盖新的了, 回家的小路依然是那么安静, 走进家门, 已经3点10分了, 好累, 在车上一直不敢休息, 身边那个人刚上车没多久钱就被偷了, 但是到家了又好兴奋, 和妈妈聊了一会就睡了。

一下子就睡到了11点, 以前的同学们都还没有毕业, 这次回来没有朋友, 没有死党, 只能家看看电视, 洗洗衣服, 和妈妈聊聊天。

 吃完晚饭, 出来逛逛, 变化好大, 走出没多远就发现都是各种陌生的店面, 老字号也是有的, 还是那么红火, 家里附近的路边都堆着地砖, 好像在修路, 沿着最繁华的街道走, 才发现整条路都在施工, 地上好大个坑, 好像是要建地下商场。

路过广场, 那里好冷清, 感觉怪怪的, 现在这个季节好像不应该是这样的, 天气好冷, 街上的人都穿着外套。

一直走到以前上高中的地方, 从娱乐场所比较多的地方走过, 发现真的不一样了, 可能是初中高中错过了太多的东西, 看着身边穿着时尚的年轻人, 感觉我不属于这里。

街上人好少, 路过了好多我走了之后才开的网吧, 每家网吧都那么热闹, 里面的年轻人玩着各种各样的游戏, 想想自己的过去, 真的好多感慨, 如果当初能懂事一点, 现在一定不是这个样子。

昨天在车上看了一路的书, symfony, 感觉前面的路好长, 好迷茫, 回到这个陌生的地方, 让我不知何去何从。 除了朋友和家人, 好像这里已经没有什么值得我留恋的了, 一切都这么陌生, 与我的世界格格不入。 外面的生活好艰难, 每件事仿佛都不是那么如意, 我属于哪里? 我该去哪里?

使用PHP收发邮件

September 9th, 2008

这两天都在测试邮件, 搞得头都大了, 现在技术问题都已经解决了, 记录一下.

发送邮件一直都是一个难题, 以前没用过mail函数, 因为多数的环境下都不支持, 曾经改写过Discuz的邮件类, 也用过像PHPMailer这样的邮件发送库来解决邮件发送的问题, 但实际上用的都是SMTP. 昨天bobhero在公司内网服务器上配置了sendmail, 简单配置了之后可以使用smtp, imap和pop3. 但按照网上的教程配置了之后php的mail()函数一直都无法发送邮件, 在搜索引擎上寻找很久没有结果, 最后bobhero重新编译了配置文件, 终于成功.

编译命令

make -C /etc/mail

收邮件要比发邮件复杂的多, 网上资源巨少, 好不容易有几篇英文的帖子和我情况类似也没有解决办法.

接受邮件使用php的imap库, 遇到的问题主要在imap_open()上

连接163使用

imap_open("{pop3.163.com:110/pop3}INBOX", $username, $password);

取得的7bit数据使用imap_qprint()解码.

连接gmail使用

imap_open("imap.gmail.com:993/imap/ssl", $username, $password);

最难弄的就是连接本地的imap服务器, Outlook是可以从服务器上收取邮件的, 但是php就是收不到并返回错误Certificate failure for 102.com: Self-signed certificate or untrusted authority: OU=IMAP server, CN=imap.example.com, E=postmaster@example.com, 使用telnet链接也没有问题, 从昨天下午研究到今天中午也没解决这个错误, 网上搜不到解决办法, 最后实在没办法了, 用IP Sniffer截php.exe的数据包, 然后用telnet进行模拟, 发现php.exe在和imap服务器链接成功之后使用了TLS(一个什么传输安全协议), 刚想放弃就在php.net上看到原来imap_open()还有一个参数是/notls, 我的天, 终于得救了.

imap_open("{localhost:143/imap/notls}INBOX", $username, $password);

研究期间发现telnet很好玩, 可以用telnet检查某项服务是否开启, 比如smtp, telnet 192.168.1.102 25, 如果服务是开启的就会建立一个连接, 可以用指令进行smtp 的相关操作, 而指令内容也就是smtp协议的相关内容, 其他协议pop, imap等等都可以这么玩.

相关端口:

smtp 协议 25端口

imap 协议 143端口

imap/ssl 993端口

imap/ssl/novalidate-cert 995端口

nntp协议 119端口

相关资源:

中国协议分析网 http://www.cnpaf.net/

RFC文档 http://www.faqs.org/rfcs/

保留用户输入的错误数据

September 6th, 2008

最近公司项目比较闲, 所以很多时间都在整理代码, 这几天就又有了一个这样的需求, 当用户提交了错误的信息, 提示错误并保留用户输入的数据。

起初第一个想法就是使用COOKIE, 后来又考虑使用$_SESSION, 其实两者无明显区别,大概流程是这样的, 每个请求的前面都加入下面的逻辑:

if(有保存的数据){

    if(数据是不是本动作产生的){

        如果是则取得数据

    }

    清空保存的数据

}

if(是一个POST请求){

    保存用户的请求数据

}

这样处理的话消息处理需要中间页跳转,就是说错误提示是一个单独的页面,这样基本可以做到将数据保存到下一个请求。这个方法后来在显示上比较麻烦,就是需要判断有没有取得的数据,有的话输出没有的话不输出, 如果使用模板引擎的话处理起来更加复杂, 于是又提出了另一种解决方案。

将表单和处理程序放在一起(可能是一个function , MVC中应该是一个action中),这样的话需要显示表单或者处理数据要准备一套结构相同的数据传给页面,然后由本页显示错误消息, 不需要使用COOKIE.

function actionCreate(){

    if(是POST请求){

        过滤数据

        验证数据并生成错误

        if(没有错误){

            向数据库插入数据

        }else{

            将错误数据提交给显示层

        }

    }else if(是GET请求并且必要参数正确){

        从数据库取得显示数据提交给显示层

    }else{
        返回一个参数错误
    }

    $this->display('create.html');

}

可以说这个方法是比较完美的, 目前来说没有什么不足之处, 但是有很多细节是需要注意的, 比如form的action要提交给自身并且携带参数, 虽然参数无作用, 但可以用来刷新页面(window.location.href=window.location.href), 显示层刷新页面的功能是必须的, 因为如果是修改操作那么输入错误之后将会保留错误的信息。

接下来还可以通过控制错误消息的结构识别错误是由哪一个表单项产生的, 如果需要还可以对错误进行自动修改等等。

工作不是生活的全部

August 29th, 2008

昨天看腿墨的一篇文章, 里面有这么一个章节,看过之后很有感触.

工作不是生活的全部

你是不是经常在晚上和周末加班?如果你花费所有的时间在工作上,那你用什么时间去消费你赚的钱呢?不要因为放下手边额外的工作而有罪恶感,休闲时间和工作时间同等重要。从工作中得到满足感的确是令人高兴的事情,但是我们只是埋头工作的话,我们的生活会失去应有的平衡。

这说的的确很有道理, 有时候觉得每天的生活就是在工作, 特别是毕业之后, 学习的机会更少了. 我经常和朋友抱怨工作这样那样的不顺利, 这样那样的辛苦, 但后来才发现原来根本不用这样, 工作只是一种赚钱的手段而已.

对我来说, 工作只能让我有东西吃, 有衣服穿, 有地方住, 除了学习之外工作只是为了赚钱, 再抽象一点说就是在用痛苦交换幸福.

我想工作可能不能帮助任何人实现他们的梦想, 除非他们的梦想是给别人打工然后回家养活老婆孩子, 工作也不可能代替任何人的生活, 家庭, 感情, 梦想, 这些东西工作永远都不可能替代, 工作只是多数人在为少数人的生活, 家庭和梦想在努力而已.

昨天用Open Office做了这样一个表格, 然后恍然大悟, 工作之外, 做回我自己, 梦想就在眼前.

突然觉得自己一无是处

August 25th, 2008

不知道为什么这样想, 不过好像的确这样, 从去年6月第工作到现在已经过去一年多了, 但实际上我没有创造一分钱的价值, 也就是说公司有我没我都一样, 或者说公司存不存在都没影响, 就是多了几个失业者.

突然一个词语在我眼前一闪, 井底之蛙, 是的, 感觉自己就像井底之蛙, 在这里我永远都看不到广阔的天空, 所以可能永远都没有机会变得更强.

这几天又失眠了, 总感觉自己又把自己给弄丢了, 到处找也找不回以前的我了, 这种感觉好奇怪.

时不时有轰鸣的引擎呼啸而过, 打破夜晚的宁静, 眼前总会浮现出一幕幕场景, 酒精, 机车, 美女. 我很羡慕这些人, 虽然他们可能处于这个社会的最底层, 也可能是混混, 流氓, 但是他们不用去考虑明天的生活, 他们不用担心明天要工作.

我感觉我们这代人压力很大, 要中考, 要高考, 要就业, 而就业压力最夸张因为我们就业的时候中国人口是13亿, 可能我从小就向往自由, 喜欢无拘无束, 所以还没等中考就爆发了, 什么都不学了, 现在想想可真后悔, 上学多好呀.

我想这份工作不会再持续太久了, 说不定明天早上心情不好就不来了. 因为有的时候仔细想想可能自己完全把自己卖了, 就为了那点工资把自己卖了, 但是辞掉有不忍心, 就是因为这里待遇比较好, 而且自己也不想再伸手向老妈要钱.

昨天有个朋友在这里留言说很期待我出新的作品, 一下子要我想起了好多的事情, 从前那些梦想, 那些追求. 我很感激, 感激还有人记得我是谁, 因为现在连我自己都不知道我是谁了.

这几天大学的一位老师给我推荐了一份新的工作, 地方比较远, 在肇庆, 我很向往南方, 但我不想去肇庆, 也不想放弃PHP去学什么ASP.NET, 我不知道为什么, 可能只是不想工作, 也可能是对自己没有信心什么的.

前一段时间一直抱怨, 抱怨工作累, 没前途, 准备改行, 后来想想可能是因为压力太大的缘故吧, 一时间说改行我还真不知道改哪里去. 就算真改了也是绕着网络转悠, 但就选不改行估计也需要转型, 而且早晚得转型, 转型做设计或者什么的, 否则一辈子就是代码工人.

说了半天也不知道自己在说什么了, 总结一下就是最近很不爽, 压力比较大, 心里乱糟糟.

令人发狂的项目经历

August 21st, 2008

最近发现自己对工作没有了激情, 不仅如此, 长期按别人思路进行开发让自己丧失了创造力和自主能力.

回忆了一下手头现在的项目, 真让人崩溃, 刚刚查看了一下项目的svn记录, 吓了自己一大跳, 3个相关项目的提交总数超过6700次, 我一个人提交了超过3100次, 因为大家都不在本地调试所以提交数比较夸张, 但从时间来算从4月末开始做到现在也已经差不多4个月了.

说一下大概过程吧, 需求是今年4月份日方提出的, 然后经理会去研究日方需求, 因为只有经理懂日语, 然后经理会把需求交给设计人员, 当时李哥接手了这个项目, 然后是一个漫长的确认需求的过程, 用了大概2-3周, 其中大部分时间在研究是否使用李哥开发的自动CRUD系统(一款根据数据库设置自动生成数据库crud的程序), 因为CRUD针对性较强, 所以做除基本功能之外的功能比较费力, 有些甚至完全不能做.

svn项目是4月30号建立的, 我的印象中那个时候需求还没有完全确定, 需求确定下来之后李哥设计加上搭建程序也就用了一周多一点, 搭建了一个将近30个表的基于CRUD的项目, 说起来的确不可思议, 虽然欠缺灵活性, 但是的确做到了.

5月19号, 我被从别的项目中调出来加入该项目的开发, 起初的第一个任务是建立一套可以精确到动作的权限系统, 然后是做所有crud不能做的功能, 接下来又要做统计, 做了一个极其不规则的复杂表格, 比较头痛的是这个表格还需要打印和导出. 又接下来日方提出要做在触摸屏上的前台, 于是重任又落在了我肩上, 全部后台代码还要套模板和写大量的js.

之后记得不大清楚了, 有一个阶段工作很琐碎, 不停的改进程序, 最让我抓狂的就是不给闲着的时间, 上午的时候这个项目新的测试结果没有出来之前要我去做别的项目, 然后做到一半这边要修改的东西出来了就再回来该这个项目, 大概有一到两周一直这样, 现在已经回忆不起来什么东西了, 只记得从一个项目换到另一个项目需要一个很长的过度时间, 大概一两个小时才能进入状态, 每天反复, 而且常常不记得上次被打断的时候在做什么, 然后有些东西就要从头来过.

后来有一段时间好像经过日方测试要求增加功能, 于是又增加了n个表, 但比较庆幸CRUD完全可以完成这些动能, 只要简单配置一下.

然后日方提出后台功能太多了, 很多没有用, 需要做一个简单一点的, 这个新项目的svn建立日期是6月27号, 之前经历了很长时间的需求确认. 于是又是漫长的开发阶段, 这次crud用的少多了, 新的权限系统, 新的构架.

新系统成型之后又对两套系统的兼容性进行了特殊处理, 因为日方要两套系统同时存在, 也就是说要用一套数据库, 一套上传目录, 但为了减少出错的可能性我们完全是按照两个项目来开发的.

再之后的日子里需求发生了很大的变动, 权限系统大改了3次, 说是大改, 还不如说是重写了3次, 不, 应该是两次, 因为最后一次的要求是不要精确权限控制了. 同时还删除了大量的代码, 因为日方发现当初很多要求只是一时冲动, 于是我亲手干掉了自己几周的工作成果, 同时还干掉了将近一半的数据表.

之后是漫长的测试阶段, 不知道为什么总是要赶到周五晚上下班打包给日本人测试, 除了上周末已经不知道多少个周五不能按时下班了, 做完上个月李哥被辞退, 于是这个项目完全落在我一个人身上, 奇怪的需求还在继续, 但最要命的不是需求, 而是我要去研究CRUD, 在这之前这套系统完全是由李哥一个人开发维护的.

没有什么比在项目之间跳来跳去更让人抓狂的了, 但贯穿整个项目, 我竟然同时还参与了另外3个项目的开发, 其中最头痛的那个历时几个月的项目最终被取消, 李哥走之后日方又要我们继续开发一个我刚刚来公司的时候由李哥设计的一个做了一半的项目.

回忆一下最近几个月我才发现每天都是接到任务完成任务, 不停的完成任务, 现在回家也没有什么学习的动力了, 几个月下来没学到什么新东西, 后来发现自己像一个代码工人, 而最神奇的不是自己成了代码工人, 而是一个有3个开发人员一个美工人员组成的开发小组里竟然有两个设计人员, 而且两个人从来不按一个思路设计, 也从来不同时设计一个项目.  而最让人难以理解的是在过去的一年里公司没有创造出一分钱的价值竟然还依然能发出工资, 没有创造价值不是没有做出东西, 而是日方提出需求我们开发完毕之后竟然没有人来用我们写的东西.

.

最近有了新的计划, 准备在自己完全丧失创造性和激情之前逃离这里, 越远越好, 能拯救自己的人只有我自己,  在这之前要攒一笔足够我跑很远的钱, GO!

人蚊奥运

August 12th, 2008

最近好累, 每天晚上不是被热醒就是被蚊子咬醒, 连续快两周了, 每天都睡不好.

该死的租来的房子里没有纱窗, 害我晚上不敢开窗户, 连卧室门都不敢开, 每天晚上都是热醒然后把被子踢掉, 然后被蚊子骚扰再盖上被子, 翻来覆去, 又或者跑到别人房间睡, 然后刚睡着又被蚊子赶回来…

昨天晚上终于爆发了, 没关卧室门, 于是战斗打响, 睡觉之前左手连中三招, 后半夜在被蚊子袭击过之后钻进被窝然后露出半个脑袋避难, n久之后…. 被蚊子击中眼睛, 现在还肿肿的….

Ext学习笔记(1

August 7th, 2008

昨天用了一下午学习Ext, 搞了一下午最后连个表格都没搞出来, 今天继续, 顺便记录一下.

中文在线手册 http://www.ajaxjs.com/docs/

这里请大家注意一下, 看手册一定要看源码包里的那个docs目录里的, Ext手册版本差异很大, 不一定最新的就一定适用。

使用Ext之前需要加载Ext库, 昨天直接加载核心, 竟然不好用, 最后看例子里面是加载了两个文件, 原因还没搞清楚, 但先记下来.

<script type=”text/javascript” src=”../ext-2.2/adapter/ext/ext-base.js”></script>
<script type=”text/javascript” src=”../ext-2.2/ext-all.js”></script>

最基础的

Ext.onReady(fn);

这个和Jquery的$(fn)是一样的, 就是页面加载完毕执行fn

Ext.get(‘idName’);

这个就是Jquery中的$(‘#idName’), 返回一个Ext的Element对象.

Element.dom是该对象的DOM节点, 其他内容看手册里的Element部分

Ext.select(‘p’)

这个类似Jquery中的$(‘p’), 但是Ext中没有each, Ext.select(‘p’).methodName()直接就作用在全部对象上.

事件绑定

Element.on(‘click’, fn);

获得事件句柄

clicked = function(e){

Ext.get(e.target).highlight();//e.target为触发该事件的对象id, highlight是高亮闪烁

}

Ext.select(‘p’).on(‘click’,clicked);

消息框

Ext.MessageBox为Ext的消息对象.

Ajax

ajax部分和Jquery非常相像了

Ext.get(‘msg’).load({
url: ‘http://test/ext/data.php’,
params: ‘name=1′,
text: ‘Updating…’
});