yunshichen

我相信人生是值得活的,尽管人在一生中必须遭受痛苦,卑劣,残酷,不幸和死亡的折磨,我依然深信如此.但我认为人生不一定要有意义,只是对一些人而言,他们可以使人生有意义. ---J 赫胥黎

Javascript 工具和调试篇


简单介绍

    本文介绍整理在JS开发中常见的工具和调试技巧,分为:
  • 开发工具篇
  • 调试篇

开发工具

Linux文本编辑器

  • VIM
  • EMACS
  • GEDIT
    能用VIM/EMACS的一般不是新手,配置JS就不用我多废话了.在这里简单介绍GEDIT的配置:
  • 在Edit-->Preference-->Plugins里选上External tools,并选择"Configure plugin"






posted @ 2008-11-05 12:05 Chenyunshi 阅读(180) | 评论 (0)编辑 收藏

YUI 第一篇 : Yahoo global object 翻译


简介

Yahoo global object 提供namespace机制和封装了一些好用的方法. js名称为yahoo.js ,使用YUI前必须先引入这个js,且应该最先加载.

源文件
<script type="text/javascript" src="http://yui.yahooapis.com/2.6.0/build/yahoo/yahoo-min.js" ></script>

常用方法列举如下:

YAHOO.namespace


避免js全局变量污染的好办法,用法如下:
// Creates a namespace for "myproduct1"
YAHOO.namespace ("myproduct1");
YAHOO.myproduct1.Class1 
= function(info) {
    alert(info);
};

// Creates a namespace for "myproduct2", and for "mysubproject1"
YAHOO.namespace ("myproduct2.mysubproject1");
YAHOO.myproduct2.mysubproject1.Class1 
= function(info) {
    alert(info);
};

YAHOO.lang


提供了一些简便易用方法,如下:

// true, an array literal is an array
YAHOO.lang.isArray([12]);

// false, an object literal is not an array
YAHOO.lang.isArray({"one""two"});

// however, when declared as an array, it is true
function() {
    
var a = new Array();
    a[
"one"= "two";
    
return YAHOO.lang.isArray(a);
}();

// false, a collection of elements is like an array, but isn't
YAHOO.lang.isArray(document.getElementsByTagName("body"));

// true, false is a boolean
YAHOO.lang.isBoolean(false);

// false, 1 and the string "true" are not booleans
YAHOO.lang.isBoolean(1);
YAHOO.lang.isBoolean(
"true");

// null is null, but false, undefined and "" are not
YAHOO.lang.isNull(null); // true
YAHOO.lang.isNull(undefined); // false
YAHOO.lang.isNull(""); // false

// a function is a function, but an object is not
YAHOO.lang.isFunction(function(){}); // true
YAHOO.lang.isFunction({foo: "bar"}); // false

// true, ints and floats are numbers
YAHOO.lang.isNumber(0);
YAHOO.lang.isNumber(
123.123);

// false, strings that can be cast to numbers aren't really numbers
YAHOO.lang.isNumber("123.123");

// false, undefined numbers and infinity are not numbers we want to use
YAHOO.lang.isNumber(1/0);

// true, objects, functions, and arrays are objects
YAHOO.lang.isObject({});
YAHOO.lang.isObject(
function(){});
YAHOO.lang.isObject([
1,2]);

// false, primitives are not objects
YAHOO.lang.isObject(1);
YAHOO.lang.isObject(
true);
YAHOO.lang.isObject(
"{}");

// strings
YAHOO.lang.isString("{}"); // true
YAHOO.lang.isString({foo: "bar"}); // false
YAHOO.lang.isString(123); // false
YAHOO.lang.isString(true); // false
 
// undefined is undefined, but null and false are not
YAHOO.lang.isUndefined(undefined); // true
YAHOO.lang.isUndefined(false); // false
YAHOO.lang.isUndefined(null); // false


YAHOO.lang.hasOwnProperty

检查某个对象是否有某属性

// this is what we are protecting against
Object.prototype.myCustomFunction = function(x) {
    alert(x);
}

var o = {};
o[
"foo"= "bar";
o[
"marco"= "polo";

// this is where we need the protection
for (var i in o) {
    
if (YAHOO.lang.hasOwnProperty(o, i)) {
        alert(
"good key: " + i);
    } 
else {
        alert(
"bad key: " + i);
    }
}

YAHOO.lang.extend

提供了继承机制.(译者注:js使用继承还是有一定风险,建议酌情使用.)

YAHOO.namespace("test");

YAHOO.test.Class1 
= function(info) {
    alert(
"Class1: " + info);
};

YAHOO.test.Class1.prototype.testMethod 
= function(info) {
    alert(
"Class1: " + info);
};

YAHOO.test.Class2 
= function(info) {
    
// chain the constructors
    YAHOO.test.Class2.superclass.constructor.call(this, info);
    alert(
"Class2: " + info);
};

// Class2 extends Class1.  Must be done immediately after the Class2 constructor
YAHOO.lang.extend(YAHOO.test.Class2, YAHOO.test.Class1);

YAHOO.test.Class2.prototype.testMethod 
= function(info) {
    
// chain the method
    YAHOO.test.Class2.superclass.testMethod.call(this, info);
    alert(
"Class2: " + info);
};

var class2Instance = new YAHOO.test.Class2("constructor executed");
class2Instance.testMethod(
"testMethod invoked");


YAHOO.lang.augment

将某个对象的prototype属性复制到另一个对象,代码重用的好方法.
<!-- debugger output for environments without "console" -->
<div id="consoleelement"> </div>

<script>
////////////////////////////////////////////////////////////////////////////
//
 The ConsoleProvider example will log to the console if available, or a 
//
 div with id="consoleelement" if the console is not available
//
//////////////////////////////////////////////////////////////////////////
YAHOO.example.ConsoleProvider = function() { };
YAHOO.example.ConsoleProvider.prototype 
= {
    log: 
function(msg) {
        
// use the error console if available (FF+FireBug or Safari)
        if (typeof console != "undefined") {
            console.log(msg);
        
// write the msg to a well-known div element
        } else {
            
var el = document.getElementById("consoleelement");
            
if (el) {
                el.innerHTML 
+= "<p>" + msg + "</p>";
            }
        }
    }
};

////////////////////////////////////////////////////////////////////////////
//
 Define a class that should be able to write debug messages
//
//////////////////////////////////////////////////////////////////////////
YAHOO.example.ClassWithLogging = function() { };
YAHOO.lang.augment(YAHOO.example.ClassWithLogging, YAHOO.example.ConsoleProvider);

////////////////////////////////////////////////////////////////////////////
//
 Try it out
//
//////////////////////////////////////////////////////////////////////////
var c = new YAHOO.example.ClassWithLogging();
c.log(
"worked");

</script>

YAHOO.log

log工具,使用之前要先引入logger控件,如果没有引入,那么浏览器会忽略这条log语句.用这个东西使你免陷于开发时加alert,发布时四处删除alert的窘境.(注:当然,用firebug调试也可以避免alert问题.).


其他

至于YAHOO.env 和 YAHOO.name 等,参考官方文档即可.

http://developer.yahoo.com/yui/yahoo/




posted @ 2008-10-09 17:25 Chenyunshi 阅读(979) | 评论 (3)编辑 收藏

实战YUI 的 patinator(datatable) 组件

     摘要: 讲述如何定制YUI的paginator组件  阅读全文

posted @ 2008-10-06 11:17 Chenyunshi 阅读(3496) | 评论 (22)编辑 收藏

实战YUI 的 Menu 组件

     摘要: Menu家族成员 YAHOO.widget.Menu YAHOO.widget.Overlay 的子类,其他menu容器的超类. Menu类创建一个容器(Container)并放置一列垂直的列表.每项菜单称为MenuItem.YAHOO.widget.ContextMenuMenu的子类,创建一个菜单,能被某html元...  阅读全文

posted @ 2008-10-02 01:07 Chenyunshi 阅读(1136) | 评论 (0)编辑 收藏

实战YUI的Layout Manager 组件

     摘要: 序 和官网示例吹得天花乱坠不同,使用YUI是特别让人讨厌的经历,按照官方网指导有时候并不能得到正确的结果.本文记录了一些心得,顺手把官网文章翻译下来,以作备忘.正文出现的是翻译文字,个人见解用蓝色或红色字体标出.YUI使用常识篇1.必须引入一些js库和css,并且顺序很重要.顺序不对很可能得不到正确结果.2.debug版本js格式整齐,带所有log,通常用于开发阶段.min版本js将debug版本...  阅读全文

posted @ 2008-10-01 21:27 Chenyunshi 阅读(1974) | 评论 (0)编辑 收藏

Ubuntu 8 配置 VIM

 安装
sudo apt-get install vim-gtk vim-doc cscope

创建目录

如果目录不存在,运行以下命令创建目录和文件:
mkdir ~/.vim
cd ~/.vim
mkdir plugin doc syntax
touch .vimrc

标准配置

打开.vimrc 文件,然后写入如下内容并保存:
set encoding=utf-8
syn on                  
" 打开语法高亮
set guifont=Luxi\ Mono\ 10 
" 设置字体,字体名称和字号
set tabstop
=4             " 设置tab键的宽度
set shiftwidth=4           
" 换行时行间交错使用4个空格
set autoindent             
" 自动对齐
set backspace=2           
" 设置退格键可用
set smartindent            
" 智能对齐方式
set ai!                   
" 设置自动缩进
set nu!                   
" 显示行号
set showmatch            
" 设置匹配模式,类似当输入一个左括号时会匹配相应的那个右括号
set ruler                 
" 在编辑过程中,在右下角显示光标位置的状态行
set incsearch              
" 查询时非常方便,如要查找book单词,当输入到/b时,会自动找到
                        
" 第一个b开头的单词,当输入到/bo时,会自动找到第一个bo开头的
                        
" 单词,依次类推,进行查找时,使用此设置会快速找到答案,当你
                        
" 找要匹配的单词时,别忘记回车
set vb t_vb=             
" vim进行编辑时,如果命令错误,会发出一个响声,该设置去掉响声

安装taglist插件

简单的说,该插件能让你根据函数名转到该函数定义,类似ide一样的功能

首先,先安装所需文件:
sudo apt-get install exuberant-ctags

然后下载taglist . http://vim-taglist.sourceforge.net/download.html

得到一个zip包,解压并将里面的doc和plugin复制到.vim目录

打开.vimrc 并增加如下内容:
map <C-t> :TlistToggle<CR>
imap <C-t> <Esc><C-t>i

打开一个c文件并按下CTRL+T,看看有什么效果?


感谢

网上无私的分享,本文参考资料如下:

http://blog.chinaunix.net/u1/55904/showart_435472.html




posted @ 2008-09-24 09:36 Chenyunshi 阅读(988) | 评论 (0)编辑 收藏

Django 1:安装配置运行1小时谈

     摘要: Django配置文档最精简版  阅读全文

posted @ 2008-09-12 16:35 Chenyunshi 阅读(975) | 评论 (0)编辑 收藏

YUI :一个autocomplete 组件的例子


< html >
<!-- CSS file (default YUI Sam Skin)  -->
< link  type ="text/css"  rel ="stylesheet"  href ="http://yui.yahooapis.com/2.5.2/build/autocomplete/assets/skins/sam/autocomplete-skin.css" >

<!--  Dependencies  -->
< script  type ="text/javascript"  src ="http://yui.yahooapis.com/2.5.2/build/yahoo-dom-event/yahoo-dom-event.js" ></ script >

<!--  OPTIONAL: Connection (required only if using XHR DataSource)  -->
< script  type ="text/javascript"  src ="http://yui.yahooapis.com/2.5.2/build/connection/connection-debug.js" ></ script >

<!--  OPTIONAL: JSON (enables JSON validation)  -->
< script  type ="text/javascript"  src ="http://yui.yahooapis.com/2.5.2/build/json/json-debug.js" ></ script >
<!--  Source file  -->
< script  type ="text/javascript"  src ="http://yui.yahooapis.com/2.5.2/build/autocomplete/autocomplete-debug.js" ></ script >

<!-- ================== Logger ====================  -->
< link  type ="text/css"  rel ="stylesheet"  href ="http://yui.yahooapis.com/2.5.2/build/logger/assets/skins/sam/logger.css" >
< script  type ="text/javascript"  src ="http://yui.yahooapis.com/2.5.2/build/logger/logger-debug.js" ></ script >

< style  type ="text/css" >
#myAutoComplete 
{
    width
: 15em ;   /*  set width here  */
    padding-bottom
: 2em ;
}
</ style >
< body  class =" yui-skin-sam" >
< div  id ="myLogger" ></ div >< br >
< hr >
Change datasource :
&nbsp;&nbsp;&nbsp; < input  type ="button"  id ="jsBtn"  value ="JS array"   />
&nbsp;&nbsp;&nbsp; < input  type ="button"  id ="funcBtn"  value ="JS function"   />
< br >< br >
< div  id ="myAutoComplete" >
    
< input  id ="myInput"  type ="text" >
    
< div  id ="myContainer" ></ div >
</ div >
< script  type ="text/javascript" >

// A JS array data source
var  testData = [ " fa " " fb " " fc " ];
//  A JavaScript Function DataSource
function  myFunction(sQuery) {
    aResults 
=  [];
    
if  (sQuery  &&  sQuery.length  >   0 ) {
        
var  charKey  =  sQuery.substring( 0 1 ).toLowerCase();
        
var  oResponse  =  dataset[charKey];
        
if  (oResponse) {
            
for  ( var  i  =  oResponse.length  -   1 ; i  >=   0 ; i -- ) {
                
var  sKey  =  oResponse[i].STATE;
                
var  sKeyIndex  =  encodeURI(sKey.toLowerCase()).indexOf(sQuery.toLowerCase());
                
if  (sKeyIndex  ===   0 ) {
                    aResults.unshift([sKey, oResponse[i].ABBR]);
                }
            }
            
return  aResults;
        }
    } 
else  {
        
for  ( var  letter  in  dataset) {
            
var  oResponse  =  dataset[letter];
            
for ( var  i  =   0 ; i  <  oResponse.length; i ++ ) {
                aResults.push([oResponse[i].STATE, oResponse[i].ABBR]);
            }
        }
        
return  aResults;
    }
}

var  dataset  =  {
    'a' : [{
" STATE "  :  " Alabama " " ABBR "  :  " AL " },
        {
" STATE "  :  " Alaska " " ABBR "  :  " AK " },
        {
" STATE "  :  " Arizona " " ABBR "  :  " AZ " },
        {
" STATE "  :  " Arkansas " " ABBR "  :  " AR " }],
    'b' : [ ],
    'c' : [{
" STATE "  :  " California " " ABBR "  :  " CA " },
        {
" STATE "  :  " Colorado " " ABBR "  :  " CO " },
        {
" STATE "  :  " Connecticut " " ABBR "  :  " CT " }],
     
//  Entire dataset not shown
};


// Init autocomplete component.
var  g_oAuto = new   function (){    
    
// ============ init logger
     this .logger  =   new  YAHOO.widget.LogReader( " myLogger " ); 
    
this .myDatasource  =   new  YAHOO.widget.DS_JSFunction(myFunction);
    
this .myAutoComp = new  YAHOO.widget.AutoComplete( " myInput " , " myContainer " this .myDatasource);
};

// Util functions.
function  changeDSToJsArray(){    
    g_oAuto.myAutoComp.dataSource
=   new  YAHOO.widget.DS_JSArray(testData);
    YAHOO.log(
" Changed data source to JS array " , " info " , this .toString());
};
function  changeDSToJsFunction(){
    g_oAuto.myAutoComp.dataSource
=   new  YAHOO.widget.DS_JSFunction(myFunction);
    
// Customize result view.
    g_oAuto.myAutoComp.formatResult  =   function (oResultItem, sQuery) {
        
var  sMarkup  =  oResultItem[ 0 +   "  ( "   +  oResultItem[ 1 +   " ) " ;
        
return  (sMarkup);
    };

    YAHOO.log(
" Changed data source to JS function " , " info " , this .toString());
};

// Set button event handlers.
var  btn  =  YAHOO.util.Dom.get( " jsBtn " );
btn.onclick
= changeDSToJsArray;

btn 
=  YAHOO.util.Dom.get( " funcBtn " );
btn.onclick
= changeDSToJsFunction;


</ script >

</ body >
</ html >

posted @ 2008-09-12 15:42 Chenyunshi 阅读(1364) | 评论 (0)编辑 收藏

简明Javascript教程

     摘要: chapter1 javascript基础 1.1 变量类型和声明    javascript 里常用基本类型有:boolean,string 和 number,常用的类分别是:Boolean,String和Number,Array,Object. 声明变量用var,不能用关键字和保留字作变量名(关键字和保留字见附录A1).命名的最佳实践是使用匈牙利命名法.        基本类型的变...  阅读全文

posted @ 2008-09-07 13:20 Chenyunshi 阅读(555) | 评论 (0)编辑 收藏

Ubuntu 8.04 安装Windows XP注意事项

安装Virtualbox

    暂时觉得1.66版最好用.到sun官网下载软件进行安装,也是一路yes即可。安装地址:http://www.virtualbox.org/wiki/Download_Old_Builds

    不推荐安装ubuntu源里的vb。
    安装完之后启动软件,创建虚拟机安装系统。过程很简单,不再赘述。

    安装完后执行命令将当前用户加到组:

    sudo adduser XXXX  vboxusers

    之后安装就算彻底完成了.

    vb的网络共享默认host-guest,如无意外,只要你的主机能上网,那你的虚拟机在安装好之后也可以马上上网,很酷很强大的软件。:》

设置主机和虚拟机的文件共享

1)在vb的菜单Devices里,有个“Install guest additions" , 点击安装之。

2)然后关闭vb,在命令行运行:
VBoxManage sharedfolder add guest_os -name "aname" -hostpath "apath"

         guest_os : 你在vb创建的虚拟机名称。
         aname : 共享名称,可以随意设置。
         apath : 共享文件夹路径,必须是绝对路径。

         例如,我的虚拟机名称是Win_XP,共享名称设定为sda2 ,路径为 /media/sda2 ,那么命令为:
         VBoxManage sharedfolder add "Win_XP" -name "sda2" -hostpath "/media/sda2"
    
 3)启动虚拟机进入xp。然后运行如下命令:
        
net use x: \\vboxsvr\data

        
虚拟机里使用USB

先新建一个usbfs组:

sudo groupadd usbfs 

将当前用户加入这个用户组:
sudo adduser $USER usbfs 

打开/etc/group文件
gedit /etc/group

查找usbfs,记下ID,如,我的情况是:usbfs:x:1002:yourname , 1002就是ID。

打开/etc/fstab文件:

sudo gedit /etc/fstab

在后面加一行:

none /proc/bus/usb usbfs devgid=1002,devmode=664 0 0

注意devgid=1002中的1002要改成你刚在group中查到的usbfs组的ID。保存文件。

设置完成。重启Ubuntu,然后启动VirtualBox中的Windows XP,在XP右下角托盘里右击鼠标,选择你想挂载的usb设备即可.


        


posted @ 2008-09-02 16:24 Chenyunshi 阅读(972) | 评论 (0)编辑 收藏

仅列出标题
共6页: 1 2 3 4 5 6 
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(7)

随笔分类

随笔档案

文章分类

相册

搜索

最新评论

阅读排行榜

评论排行榜