星期一, 三月 09, 2009

Javascript: 打印对象

alert() 是我们调试阶段经常使用的方法,可以查看目标变量的值。但是,如果目标变量是对象,如:

var foo = {'key1': 'foo1', 'key2': 'foo2'};
alert(foo);

其显示结果是 [object Object]。这对于调试没有多大用处。再试下这个:

for(myKey in myObj){
alert ("myObj["+myKey +"] = "+myObj[myKey]);
}

虽然可以显示期待的结果,但有点麻烦(或者可以将上面的代码封装在一个方法里)。

对于 Gecko 内核的浏览器,可以使用对象的 toSource() 方法,这是其 Javascript 的一个特性。

alert(foo.toSource());

其打印结果是: ({key1:”foo1″, key2:”foo2″})。

最后,当然不能忘了 Firebug 这个利器:

console.log(foo);

其打印结果是:Object key1=foo1 key2=foo2

星期六, 三月 07, 2009

Vim: EnhancedCommentify,一个好用的注释插件

如果不习惯于“老老实实”地一行一行添加注释符的话,可以试下 EnhancedCommentify 这个 Vim 的插件。它对支持目前大多数文件格式的注释,如 PHP、Python、Java、C/C++ 等等。

下载地址

执行 :call EnhancedCommentify('yes','comment') 即对当前行进行注释;反之,执行 :call EnhancedCommentify('yes','decomment') 则对当前行进行反注释。

为了使用方便,可以对上面的命令进行键盘映射:

" 设置注释
map < F2> < ESC>< ESC>:call EnhancedCommentify('yes','comment')< CR>
" 取消注释
map < F2> < ESC>< ESC>:call EnhancedCommentify('yes','decomment')< CR>

具体的使用方法,可以查看插件里面的 doc。

Have fun :)

星期五, 三月 06, 2009

Dojo: Dialog 的 onClose 事件

对于dijit.Dial0g 为说,是没有 onClose 事件的,当你关闭它,只是将它隐藏而已。所以,应该用 hide 事件来代替。如:

var dialog = dijit.byId("fooDialog");
dialog.connect(dialog, "hide", function(e){
/* do every thing here */
});

当 dialog 调用 hide() 隐藏自身时,会触发事件。

星期二, 三月 03, 2009

Dojo: Layout 的问题

< id="wrap">  
< id="main" dojotype="dijit.LayoutContainer">
...

在 使用 Dojo 的 Layout(dijit.layout.xxxx),其 Wrap 容器必须设定其大小,如 style=”width:100px;height:100px;”。否则,将会显示空白页。在 1.2.3 和 1.3 都存在这个问题。如果其 Wrap 窗口是 Body,则将 Body 设为 style=”width:100%;height:100%;position:absolute” ;或者,将 Body 设为 style=”width:100%;height:100%;”, 将 #main 设为 style=”position:absolute”。

虽然不知道这是不是 Bugs,或者是不是一个正确的解决方法,但确实能解决目前问题:例如 《Book of Dojo》中的 Mail 应用例子。

星期五, 二月 27, 2009

CodeIgniter: is_ajax,判断 AJAX 请求

CakePHP 的 RequestHandler 组件,有一个方便的方法 isAjax ,可以判断当前的请求是否为 AJAX 请求。貌似 CodeIgniter(以下简称 CI) 没有)。不过不要紧, 可以自行对 CI 的类库进行扩展,添加上 is_ajax 方法(之所以用下划线分隔的方式命名而不是骆驼峰方式,是因为要迎合 CI 的开发规范)。

我们决定扩充 CI 的CI_Input 类,不赞成直接对核心代码的修改,既然 CI 提供了良好的扩充机制,为什么不用呢? :)

创建一个名为 MY_Input.php 的文件,放在自己的 App(默认是 aplication )/libraries 文件夹下。内容如下:


class MY_Input extends CI_Input {
function MY_Input() {
parent::CI_Input();
}

function isAjax() {
return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']=="XMLHttpRequest");
}
}
// END Input class

/* End of file Input.php */
/* Location: ./system/application/MY_Input.php */

注意:具体的文件名,要根据你在 config.php 中对 $config['subclass_prefix'] 的设置。默认是 $config['subclass_prefix'] = ‘MY_’;

下面,就可以在 Controller 里对 Input 类自行加载使用:

......

function foo() {
$this->load->library('input');
if ($this->input->is_ajax()) {
do_something();
....
}
}
......

神奇的浏览器嗅探代码

shortest way to test for IE 一文中, 讲述了20个方法嗅探 IE 浏览器 ,其中:

ie = '\v'=='v';

上面的代码是不是很神奇,但重要的是,它确实正确地判断出 IE 浏览器。这是利用浏览器的特性来作出判断的。其它的利用浏览器特性判断的 JS 代码:

ie = !!top.execScript;
ie = /*@cc_on!@*/!1;
ie8 = !!window.XDomainRequest;
IEVersion = 0/*@cc_on+ScriptEngineMajorVersion()@*/;
ff = /a/[-1]=='a';
ff3 = (function x(){})[-5]=='x';
ff2 = (function x(){})[-6]=='x';
safari=/a/.__proto__=='//';
chrome=/source/.test((/a/.toString+''));
opera=/^function \(/.test([].sort);

在 Mootools 1.2.1 里,也是利用浏览器的特性来作出嗅探的:

if (window.opera) Browser.Engine = {
name: 'presto',
version: (document.getElementsByClassName) ? 950 : 925};
else if (window.ActiveXObject) Browser.Engine = {
name: 'trident',
version: (window.XMLHttpRequest) ? 5 : 4};
else if (!navigator.taintEnabled) Browser.Engine = {
name: 'webkit',
version: (Browser.Features.xpath) ? 420 : 419};
else if (document.getBoxObjectFor != null) Browser.Engine = {
name: 'gecko',
version: (document.getElementsByClassName) ? 19 : 18};

Browser.Engine[Browser.Engine.name] =
Browser.Engine[Browser.Engine.name + Browser.Engine.version] = true;

星期五, 二月 20, 2009

cakePHP: 中文乱码问题

在默认的配置下,cakePHP 存取的中文字符可以在网页上正常显示,但是在 phpMyadmin 下中文会显示为乱码,已经将数据库、所有的表都设置为 UTF-8,一样无效。

想起平时在 PHP 里处理 MySQL 中文存取的方法,就是在数据库操作前执行一句:

mysql_->query('SET NAME "UTF8");
于是在自己的 controller 里添加上这一句,果然中文在 phpMyAdmin 里显示正常。但取出数据时显示乱码。看来得“修改” AppModel。在自己的 App 目录下添加 app_model.php 文件,内容如下:
class AppModel extends Model {
function __contruct() {
parent::__construct();
$this->query('SET NAMES "utf8"');
}
}

这样,中文乱码消失了。但究竟 cakePHP 有没有更简洁的解决方法呢?于是查看 App 的数据库配置文件(config/database.php),发现有一个 encoding 选项,设置其为 ‘UTF8′,记住!不能是’UTF-8′,否则无效,问题果然解决。

That’s all, have fun :)