我相信人生是值得活的,尽管人在一生中必须遭受痛苦,卑劣,残酷,不幸和死亡的折磨,我依然深信如此.但我认为人生不一定要有意义,只是对一些人而言,他们可以使人生有意义. ---J 赫胥黎
简单介绍
本文介绍整理在JS开发中常见的工具和调试技巧,分为:
开发工具
Linux文本编辑器 能用VIM/EMACS的一般不是新手,配置JS就不用我多废话了.在这里简单介绍GEDIT的配置:
- 在Edit-->Preference-->Plugins里选上External tools,并选择"Configure plugin"
简介
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([1, 2]);
// 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/
摘要: 讲述如何定制YUI的paginator组件
阅读全文
摘要: Menu家族成员
YAHOO.widget.Menu
YAHOO.widget.Overlay
的子类,其他menu容器的超类. Menu类创建一个容器(Container)并放置一列垂直的列表.每项菜单称为MenuItem.YAHOO.widget.ContextMenuMenu的子类,创建一个菜单,能被某html元...
阅读全文
摘要: 序 和官网示例吹得天花乱坠不同,使用YUI是特别让人讨厌的经历,按照官方网指导有时候并不能得到正确的结果.本文记录了一些心得,顺手把官网文章翻译下来,以作备忘.正文出现的是翻译文字,个人见解用蓝色或红色字体标出.YUI使用常识篇1.必须引入一些js库和css,并且顺序很重要.顺序不对很可能得不到正确结果.2.debug版本js格式整齐,带所有log,通常用于开发阶段.min版本js将debug版本...
阅读全文
安装
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
<
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 :
<
input
type
="button"
id
="jsBtn"
value
="JS array"
/>
<
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
>
摘要: chapter1 javascript基础
1.1 变量类型和声明 javascript
里常用基本类型有:boolean,string 和
number,常用的类分别是:Boolean,String和Number,Array,Object.
声明变量用var,不能用关键字和保留字作变量名(关键字和保留字见附录A1).命名的最佳实践是使用匈牙利命名法. 基本类型的变...
阅读全文
安装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设备即可.