资源描述
· Dojo学习笔记(1. 模块与包)
Intro:
Dojo是一种非常强大面向对象JavaScript工具箱,建议读者可以去补充一下JavaScript下如何
使用OO进行编程,这对于你后来阅读Dojo Source有很大用处.
请人们下载dojo 0.3.1,如下阐明均针对此版本
翻译自
Getting Started
1:把Dojo加入到咱们Web程序中
1. 标志
<script type="text/javascript">
djConfig = { isDebug:false };
</script>
djConfig是Dojo里一种全局对象,其作用就是为Dojo提供各种选项,isDebug是最惯用属性之一,
设立为True以便可以在页面上直接看到调试输出,固然其中尚有些属性与调试关于,这里就不罗索了
2. 引用 dojo 启动代码
<script type="text/javascript" src="/yourpath/dojo.js" />
这样你就引用了dojo代码,并可以直接使用其中某些惯用对象,下载下来dojo.js是压缩
(remove comments and space)后裔码,要阅读话,建议阅读dojo.js.uncompressed.js,dojo.js
大概有127K,而未压缩前有211K,ok,为什么会这样大呢,本来其已经把某些惯用模块整合进dojo.js里,
因而显得大了一点,build.txt里就阐明了默认dojo.js包括了哪些模块
3. 声明你所要用到包
<script type="text/javascript">
dojo.require("dojo.math");
dojo.require("dojo.io.*");
dojo.require("dojo.widget.*");
</script>
你就把这些代码当成是javaimport语句或C#中using语句同样,如果你不require话,而模块自身又
没有整合在dojo.js中,是会浮现脚本错误喔
2. 针对不同需求提供预整合包
Dojo自身是由许多模块所组合而成,但是由于顾客需求多样性,dojo针对不同需求而提供了不同
版本,顾客在下载dojo时候就看见可以选取诸多版本,例如Ajax版和Widget版,每个版本最重要区
别就在于dojo.js文献,但是除此之外,每一种版本都是全功能,dojo.js依照版本不同而整合进了不
同模块
3. 直接获取Dojo最新源代码
一方面你必要安装 Subversion,当Subversion在你电脑上可以正常工作后,你就可以通过如下命令下载
dojo源代码:
svn co
这会在你当前目录下创立一种 trunk 目录;如果你但愿直接Get到当前目录,用这个命令:
svn co
或者你但愿Get到当前目录下 MyDir 目录,用这个命令:
svn co
模块与包
模块
Dojo代码被划分为逻辑单元称之为模块,这有点类似于Java中package,除了dojo模块可以包括类
(类似于java中classes)和简朴函数
例如:模块"dojo.html"包括了一系列函数,例如dojo.html.getContentBox(),模块"dojo.dnd"包括
了一系列HtmlDragObject类
注意名称商定,函数首字母为小写字母,类首字母为大写
模块也可以称之为"命名空间"
包
在多数状况下,dojo模块只需要定义在一种文献就可以了,但有时,一种模块也许划分到各种文献,
例如:模块dojo.html,本来是定义在一种文献中,可是由于功能增强,文献逐渐变大,咱们不得不
将其拆分为各种文献,这重要是为性能考虑,以便浏览器可以只下载其需要用到代码,不幸是其
实现细节对于dojo顾客看起来不那么透明,你必要懂得你想要用到功能究竟是包括在哪个文献,
然后才干require并使用它
这样每一种文献都称之为一种包
dojo.require("dojo.html.extras")
将引用文献 src/html/extras.js,这将定义模块 dojo.html 若干(并非所有)函数
据我所知,尽管单个文献可以定义包里各种类,单个脚本文献不能定义各种模块 (在Java可以等效于
在一种文献中定义2个类),并且,包名称和模块名称可以不同,例如:包dojo.widget.Button定义
了dojo.widget.html.Button
基本上你应当这样以为,包和模块尽管密切有关,但是是两个完全不同实体
为什么会有模块和包这样概念?
为什么会有模块和包这样概念?为了满足你应用程序只需要加载其所用到东西需求,充分运用
模块化设计长处,dojo维护了最小足印以便仍能提供你所需要功能,为什么要你顾客挥霍时间
去下载用不到JavaScript,当一种包就是一种js文献时,一种模块本质上就是一种命名空间,例如:
dojo.style 或 dojo.html.extras
多数简朴状况下,一种包包括了一种模块,但更常用是,一种模块也许被拆分为几种包文献
运用包和模块,将能保证你可以交付最有关功能代码,最小限度减少代码膨胀和消除由此带来
不好顾客体验,这就是模块设计重要目的,通过模块化,你可以引入自定义模块(你自己拥有
JavaScript 工具),并且维护模块对于核心代码库基本不会产生什么影响
此外,Dojo模块系统也提供了内建机制来使用代码提供命名空间,例如,通过模块dojo.event定义
Dojo事件系统
如何引用
设立引用语句
你如何才干懂得该引用哪个包到dojo.require()?
1. 模块
一方面,拟定你要使用什么模块,这个例子咱们假定你要使用 dojo.lfx.html
2. 包
搜索代码后你发现dojo.lfx.html定义在2个文献:
src/lfx/html.js
src/lfx/extras.js
依照你要用到功能,你可以
dojo.require("dojo.lfx.html");
或
dojo.require("dojo.lfx.html");
dojo.require("dojo.lfx.extras");
通配符
新顾客也许会对dojo.lfx.*这样就可以代替上面2句而感到诧异,事实上,__package__.js 中已经定义
了通配符可以代替语句,并且这样可以让dojo依照当时环境而决定加载详细模块
/////////////////////////////////////////////////////////////////////////////////////////
Dojo学习笔记(2. djConfig解说)
djConfig是dojo内置一种全局设立对象,其作用是可以通过其控制dojo行为
一方面咱们需要在引用dojo.js前声明djConfig对象,以便在加载dojo.js时候才可以获得所设立值,
虽然在0.3版本后来dojo支持在加载后设立,但是强烈建议你把声明djConfig代码作为第一段script
一种完整djConfig对象定义如下(值均为dojo默认值)
<script type="text/javascript">
var djConfig = {
isDebug:false,
debugContainerId:"",
bindEncoding:"",
allowQueryConfig:false,
baseScriptUri:"",
parseWidgets:true
searchIds:[],
baseRelativePath:"",
libraryScriptUri:"",
iePreventClobber:false,
ieClobberMinimal:true,
preventBackButtonFix:true,
};
</script>
isDebug是一种很有用属性,顾名思义,如果设立为真,则所有dojo.Debug输出有效,开发时应当设立
为true,发布时应当设立为false
debugContainerId同样也是与调试关于,如果不指定话,调试信息将会直接运用 document.write输出,
这样也许会破坏页面整体布局,因此你可以指定任何一种可以作为容器html元素id作为调试信息输
出容器
allowQueryConfig,这个属性指明 dojo与否容许从页面url参数中读取djConfig中有关属性,当值为
true时,dojo会优先从url参数中读取djConfig其她属性,
例如:http://server/dojoDemo.htm?djConfig.debugContainerId=divDebug
baseScriptUri,普通不需要设立,dojo会自动依照你引用dojo.js途径设立这个值,例如,
<script type="text/javascript" src="../dojo/dojo.js"></script>,自动获取值便是 ../dojo/
ps:如果你有各种工程需要同步引用dojo.js话,建议也把dojo当作一种独立工程,引用时候采用
绝对途径就可以了
parseWidgets,这个是可以控制dojo与否自动解析具备dojoTypehtml元素为相应widget,如果你没有
使用任何Widget,建议设立为false以加快dojo加载速度
searchIds,这是一种字符串数组,定义了所有需要解析为widgethtml元素ID,如果ID不在其中html
元素是不会被解析,当数组为空数组时,则所有具备dojoType元素都会被解析
尚有一种bindEncoding,是用来设立默认bind祈求编码方式
至于其他属性,不是用处不大,就是不懂得有什么作用
在实际开发中,可以把djConfig定义放在一种js文献里,并将其作为第一种引用js文献,这样应当是
最以便。
////////////////////////////////////////////////////////////////////////////////////////
Dojo学习笔记(3. Dojo基本对象和办法)
这里所说基本对象和办法是指不Require任何包就可以调用对象和办法
匿名函数
在开始前,我想简介一下js里匿名函数,这个在阅读dojo源代码时候,会发现处处均有匿名函数
;(function(){
alert(123);
})();
//前面分号是一种空语句,是可以不要
匿名函数。一种匿名函数就是一种没有名字函数。
你可以以为她们是一次性函数。当你只需要用一次某个函数时,她们就特别有用。通过使用匿名函数,
没有必要把函数始终放在内存中,因此使用匿名函数更加有效率。
固然你也可以主线不定义函数,但是使用匿名函数可以把你代码分段,就像C#中#region同样
dojo.byId
非常有用一种办法,与prototype.js知名$同样
似乎此前版本尚有dojo.byIdArray,但是最新版本已经找不到这个函数了(除了src\compat\0.2.2.js)
如果有各种元素具备指定id,则返回是一种集合
Usage Example:
dojo.byId("divTest");
dojo.byId("divTest",document);
dojo.byId(document.getElementById("divTest"));
dojo.version
dojo版本,可以获得major,minor,patch,flag和revision
这个对象没什么太大用处,除非你要依照dojo版本选取执行你代码
dojo.raise
抛出一种异常
dojo.errorToString
将异常转换为字符串
Usage Example:
try
{
dojo.raise("打印失败",new Error("文献不存在"));
}
catch(e)
{
alert(dojo.errorToString(e));
}
dojo.render
系统环境对象
dojo.render.name 返回 browser ,阐明是工作在浏览器下
dojo.render.ver 返回 4 ,似乎没什么用
dojo.os.win 返回true阐明操作系统是Windows
dojo.os.linux 返回true阐明操作系统是Linux
dojo.os.osx 返回true阐明操作系统是MacOS
dojo.html.ie 返回true阐明浏览器是Internet Explorer
dojo.html.opera 返回true阐明浏览器是Opera
dojo.html.khtml 返回true阐明浏览器是Konqueror
dojo.html.safari 返回true阐明浏览器是Safari
dojo.html.moz 返回true阐明浏览器是Mozilla FireFox
dojo.svg.capable 返回true阐明浏览器支持svg
dojo.vml.capable 返回true阐明浏览器支持vml
dojo.swf.capable 返回true阐明浏览器支持swf
dojo.swt.capable 返回true阐明浏览器支持swt (IBM开发Standard Widget Toolkit)
如果dojo.html.ie为true话
dojo.html.ie50 返回true阐明浏览器是IE 5.0
dojo.html.ie55 返回true阐明浏览器是IE 5.5
dojo.html.ie60 返回true阐明浏览器是IE 6.0
dojo.html.ie70 返回true阐明浏览器是IE 7.0
dojo.addOnLoad
可以加载指定函数到window.load时执行,好处就是可以很以便在window.load时执行各种函数
Usage Example:
dojo.addOnLoad(init);//init是一种函数
dojo.addOnLoad(myObject,init);//init是myObject对象一种办法
dojo.require
如果你想调用一种模块对象时候,你应当一方面用dojo.require来祈求这个模块,dojo会依照你
祈求自动获得相应js文献,并加载到内存中,这样你才干调用或创立其中对象
dojo会自动维护已加载模块列表,因此是不会重复加载模块
Usage Example:
dojo.require("dojo.event");
dojo.requireIf=dojo.requireAfterIf
可以依照指定条件来决定与否加载指定模块
Usage Example:
dojo.requireIf(dojo.html.ie,"dojo.html");//如果dojo.html.ie为true,才会加载dojo.html模块
dojo.provide
除非你要开发自己模块,否则是用不到这个办法,你可以这句当作是向系统注册这个模块名称
Usage Example:
dojo.provide("dojo.custom");
dojo.exists
判断指定对象与否具备指定名称办法
Usage Example:
dojo.exists(dojo,"exists");//will return true
dojo.hostenv.getText
返回指定url内容
PS:由于浏览器安全限制,因而只能用于获得同域名url内容,否则会报告权限不够
Usage Example:
aSync = false;//同步,保证返回内容不为null
silent = true;//不抛出错误
s = dojo.hostenv.getText("",aSync,silent);//返回Google首页HTML
alert(s);
dojo.debug
输出调试信息,如果在djConfig中指定了debugContainerId,则输出到指定console容器中,否则
直接document.write
所有调试信息均以 DEBUG:开头
Usage Example:
dojo.debug("这是调试信息");
dojo.hostenv.println
与dojo.debug类似,不同是,输出内容没有 DEBUG:
Usage Example:
dojo.hostenv.println("这是普通输出信息");
dojo.debugShallow
输出指定对象所有信息(Shallow阐明并不会遍历到下一级别对象属性)以供调试
Usage Example:
dojo.debugShallow(dojo.render.html);
//////////////////////////////////////////////////////////////////////////////////////////
Dojo学习笔记(4. dojo.string & dojo.lang)
模块:mon / dojo.string
mon 和 dojo.string 是同样,只要require其中一种就可以使用如下办法
dojo.string.trim
去掉字符串空白
Usage Example:
s = " abc ";dojo.string.trim(s);//will return "abc"dojo.string.trim(s,0);
//will return "abc"dojo.string.trim(s,1);//will return "abc "dojo.string.trim(s,-1);
//will return " abc"
dojo.string.trimStart
去掉字符串开头空白
Usage Example:
s = " abc ";dojo.string.trimStart(s);//will return "abc "
dojo.string.trimEnd
去掉字符串结尾空白
Usage Example:
s = " abc ";dojo.string.trimEnd(s);//will return " abc"
dojo.string.repeat
生成由同一字符(串)重复构成字符串
Usage Example:
dojo.string.repeat("a",4);//will return "aaaa"dojo.string.repeat("1234",3,"-");
//will return "1234-1234-1234"
dojo.string.pad
使用字符补齐字符串
Usage Example:
dojo.string.pad("100",6);//will return "000100"dojo.string.pad("100",6,"0",1);
//will return "000100"dojo.string.pad("100",6,"0",-1);//will return "100000"
dojo.string.padLeft
使用字符补齐字符串开头
Usage Example:
dojo.string.padLeft("100",6);//will return "000100"
dojo.string.padRight
使用字符补齐字符串结尾
Usage Example:
dojo.string.padRight("100",6);//will return "100000"
模块:mon / dojo.lang
mon 和 dojo.lang 是同样,只要require其中一种就可以使用如下办法
dojo.lang.mixin
将一种对象办法和属性增长到另一种对象上
Usage Example:
var s1 = {name:"TestObj",test1:function(){alert("this is test1!");}}
var s2 = {value:1000,test2:function(){alert("this is test2!");}}
var d = {};dojo.lang.mixin(d,s1,s2);
//执行后d就具备了s1和s2所有属性和办法d.test1();
dojo.lang.extend
为指定类原型扩展办法与属性
Usage Example:
TestClass = function() {};
dojo.lang.extend(TestClass,{name:"demo",test:function(){alert("Test!");}});
var o = new TestClass();
//TestClass本来是没有test办法,但是extend后来就有test办法了o.test();
dojo.lang.find=dojo.lang.indexOf
查找指定对象在指定数组中位置
Usage Example:
var arr = [1,2,3,3,2,1];dojo.lang.find(arr,2);
//will return 1dojo.lang.find(arr,2,true);
//will return 1dojo.lang.find(arr,"2",true);
//will return -1dojo.lang.find(arr,"2",false);
//will return 1dojo.lang.find(arr,2,true,true);
//will return 4
dojo.lang.findLast=dojo.lang.lastIndexOf
查找指定对象在指定数组中位置,从后往前查
Usage Example:
var arr = [1,2,3,3,2,1];dojo.lang.findLast(arr,2);
//will return 4dojo.lang.findLast(arr,2,true);
//will return 4dojo.lang.findLast(arr,"2",true);
//will return -1dojo.lang.findLast(arr,"2",false);
//will return 4
dojo.lang.inArray
查找指定对象与否在指定数组中
Usage Example:
var arr = [1,2,3];dojo.lang.inArray(arr,1);
//will return truedojo.lang.inArray(arr,4);
//will return false
dojo.lang.isObject
判断输入类型与否为对象
Usage Example:
dojo.lang.isObject(new String());
//will return truedojo.lang.isObject("123"));
//will return false
dojo.lang.isArray
判断输入类型与否为数组
Usage Example:
dojo.lang.isArray({a:1,b:2});
//will return falsedojo.lang.isArray([1,2,3]);
//will return true
dojo.lang.isFunction
判断输入类型与否为函数
Usage Example:
dojo.lang.isFunction(function() {});
//will return true
dojo.lang.isString
判断输入类型与否为字符串
Usage Example:
dojo.lang.isString("");
//will return truedojo.lang.isString(0);
//will return false
dojo.lang.isAlien
判断输入类型与否为系统函数
Usage Example:
dojo.lang.isAlien(isNaN);//will return true
dojo.lang.isBoolean
判断输入类型与否为布尔类型
Usage Example:
dojo.lang.isBoolean(2>1);//will return true
dojo.lang.isNumber
判断输入类型与否为数值,依照注释所说,此函数使用不太可靠,但是可替代使用系统函数isNaN
也不太可靠
dojo.lang.isUndefined
判断输入与否为未定义,依照注释所说,此函数有也许会导致抛出异常,推荐使用
typeof foo == "undefined" 来判断
模块:dojo.lang.extras
dojo.lang.setTimeout
延迟指定期间后执行指定办法
Usage Example:
function onTime(msg){dojo.debug(msg)}dojo.lang.setTimeout(onTime,1000,"test");
//1秒后会输出调试信息"test"dojo.lang.setTimeout(dojo,"debug",1000,"test");
//1秒后会输出调试信息"test"
dojo.lang.getNameInObj
获得指定项目在指定对象中名称
Usage Example:
dojo.lang.getNameInObj(dojo,dojo.debug);//will return "debug"
dojo.lang.shallowCopy
返回指定对象浅表复制副本
Usage Example:
dojo.lang.shallowCopy({});//will return a 空对象
dojo.lang.firstValued
返回第一种存在定义参数
Usage Example:
var a;dojo.lang.firstValued(a,2,3);//will return 2
/////////////////////////////////////////////////////////////////////////////////////////////
Dojo学习笔记(5. dojo.lang.array & dojo.lang.func & dojo.string.extras)
模块:dojo.lang.array
dojo.lang.has
判断对象与否具备指定属性,但是这个办法有用吗,不如直接使用 if(name in obj)
Usage Example:
dojo.lang.has(dojo.lang,"has");//will return true
dojo.lang.isEmpty
判断对象或数组与否为空
Usage Example:
dojo.lang.isEmpty({a:1});//will return false
dojo.lang.isEmpty([]);//will return true
dojo.lang.map
调用指定办法解决指定数组或字符串
Usage Example:
dojo.lang.map([1,2,3,4,5],function(x) { return x * x;});
//will return [1,4,9,16,25]
dojo.lang.forEach
遍历指定数组或字符串,并对其中元素调用指定办法
Usage Example:
dojo.lang.forEach("abc",function(x) { alert(x);});
dojo.lang.every
检查指定数组与否所有满足指定办法条件
Usage Example:
dojo.lang.every([1,-2,3],function(x) { return x > 0;});
//指定数组不是全不不大于0,因而返回false
dojo.lang.some
检查指定数组与否某些满足指定办法条件
Usage Example:
dojo.lang.some([1,-2,3],function(x) { return x > 0;});
//指定数组有不不大于0元素,因而返回true
dojo.lang.filter
依照指定办法来过滤指定数组
Usage Example:
dojo.lang.filter([1,-2,3],function(x) { return x > 0;});//will return [1,3]
dojo.lang.unnest
把指定参数或数组转换为一维数组
Usage Example:
dojo.lang.unnest(1,2,3);//will return [1,2,3]
dojo.lang.unnest(1,[2,[3],[{4}]]);//will return [1,2,3,4]
dojo.lang.toArray
将输入转换为数组
Usage Example:
function test()
{
return dojo.lang.toArray(arguments,1);
}
test(1,2,3,4,5);//will return [2,3,4,5]
模块:dojo.lang.func
dojo.lang.hitch
将指定办法挂在指定对象下并返回该办法
Usage Example:
func = {test:function(s) {alert(s)}};
dojo.lang.mixin(func,{demo:dojo.lang.hitch(func,"test")});
func.demo("demo and test are same method");
dojo.lang.forward
返回自身对象指定名称办法引用
Usage Example:
func = {test:function(s) {alert(s)},demo:dojo.lang.forward("test")};
func.demo("demo and test are same method");
dojo.lang.curry
What is curry?请参阅这篇文章:
Usage Example:
function add(a,b)
{
return a + b;
}
dojo.lang.curry(null,add,2,3);//will return 5
dojo.lang.curry(null,add,2)(3);//will return 5
dojo.lang.curry(null,add)(2)(3);//will return 5
dojo.lang.curry(null,add)()(2)(3);//will return 5
dojo.lang.curryArguments
与dojo.lang.curry类似,但是可以选取忽视掉前n个参数
Usage Example:
function add(a,b)
{
return a + b;
}
dojo.lang.curryArguments(null,add,[1,2,3,4,5],2);//will return 5 (= 2 + 3)
dojo.lang.tryThese
测试参数指定所有函数,并返回第一种返回值不为0函数值
from seno:
dojo.lang.tryThese办法和prototype中Try.these()办法是同样,
xmlNode.text在某些浏览器中好用,但是xmlNode.textContent在另某些浏览器中正常工作。
使用Try.these()办法咱们可以得到正常工作那个办法返回值。
<script>
function getXmlNodeValue(xmlNode){
return Try.these(
function() {return xmlNode.text;},
function() {return xmlNode.textContent;)
};
}
dojo.lang.delayThese
function(/*Array*/farr,/*Function,optional*/cb,/*Integer*/delay,/*Function,optional*/onend)
依照delay指定延迟,依次调用farr里面办法,如果指定了cb,则调用完办法后调用cb。当farr中所有办法都调用了之后,调用onend。
模块:dojo.string.extras
dojo.string.substituteParams
类似C#中String.Format函数
%{name}要保证与传入对象名称大小写一致,否则会出异常
Usage Example:
dojo.string.substituteParams("%{0} - %{1} - %{2}","a","b","c");
//will return "a - b - c"
dojo.string.substituteParams("%{name}:%{value}",{name:"名称",value:"值"});
//will return "名称:值"
dojo.string.capitalize
把每一种单词首字母大写
Usage Example:
dojo.string.capitalize("show me love");//will return "Show Me Love"
dojo.string.isBlank
判断输入字符串与否为空或全是空白字符,如果传入对象为非字符串则也会返回true
Usage Example:
dojo.string.isBlank(" 1 ");//will return false
dojo.string.escape
参数1为type,可传值为:xml/html/xhtml,sql,regexp/regex,javascript/jscript/js,ascii
将按照所传type对字符串进行编码
Usage Example:
dojo.string.escape("html","<input type='text' value='' />");//will return "<input
type='text' value='' />"
dojo.string.encodeAscii
dojo.string.escapeXml
dojo.str
展开阅读全文