dojo学习

dojo学习笔记
1 Dojo学习笔记(转)
Dojo学习笔记(1.模块与包)

Intro:

Dojo是一个非常强大的面向对象的JavaScript的工具箱,建议读者能够去补充一下JavaScript下如何使用OO进行编程的,这对于你以后阅读DojoSource有很大的用处

请大家下载dojo0.3.1,以下的说明均针对此版本

翻译自 [url]http://manual.dojotoolkit.org/WikiHome/DojoDotBook/BookUsingDojo[/url]


GettingStarted

1:把Dojo加入到我们的Web程序中

1.标志

<scripttype="text/javascript">
djConfig={isDebug:false};
</script>
djConfig是Dojo里的一个全局对象,其作用就是为Dojo提供各种选项,isDebug是最常用的属性之一,设置为True以便能够在页面上直接看到调试输出,当然其中还有些属性与调试有关,这里就不罗索了

2.引用dojo的启动代码

<scripttype="text/javascript"src="/yourpath/dojo.js"/>
这样你就引用了dojo的代码,并可以直接使用其中部分常用的对象,下载下来的dojo.js是压缩(removecommentsandspace)后的代码,要阅读的话,建议阅读dojo.js.uncompressed.js,dojo.js大概有127K,而未压缩前有211K,ok,为什么会这么大呢,原来其已经把部分常用的模块整合进dojo.js里,因此显得大了一点,build.txt里就说明了默认的dojo.js包含了哪些模块

3.声明你所要用到的包

<scripttype="text/javascript">
dojo.require("dojo.math");
dojo.require("dojo.io.*");
dojo.require("dojo.widget.*");
</script>
你就把这些代码当成是java的import语句或C#中的using语句一样,如果你不require的话,而模块本身又没有整合在dojo.js中,是会出现脚本错误的喔

2.针对不同需求提供的预整合包

Dojo本身是由许多模块所组合而成的,但是由于用户需求的多样性,dojo针对不同的需求而提供了不同的版本,用户在下载dojo的时候就看见可以选择很多的版本,比如Ajax版和Widget版,每个版本最重要的区别就在于dojo.js文件,但是除此之外,每一个版本都是全功能的,dojo.js根据版本的不同而整合进了不同的模块

3.直接获取Dojo的最新源代码

首先你必须安装Subversion,当Subversion在你的电脑上能够正常工作后,你就可以通过如下命令下载dojo的源代码:

svnco [url]http://svn.dojotoolkit.org/dojo/trunk/[/url]
这会在你的当前目录下创建一个trunk的目录;如果你希望直接Get到当前目录,用这个命令:

svnco [url]http://svn.dojotoolkit.org/dojo/trunk/[/url].
或者你希望Get到当前目录下的MyDir目录,用这个命令:

svnco [url]http://svn.dojotoolkit.org/dojo/trunk/[/url]MyDir

模块与包

模块

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
作者: wjm251

2006-9-4 14:39   回复此发言

2 Dojo学习笔记(转)

基本上你应该这样认为,包和模块尽管密切相关,但是是两个完全不同的实体

为什么会有模块和包这样的概念?

为什么会有模块和包这样的概念?为了满足你的应用程序只需要加载其所用到的东西的需求,充分利用模块化设计的优点,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根据当时的环境而决定加载具体的模块

nottobecontinued...
**************************************************************************************************************************
Dojo学习笔记(2.djConfig详解)
Dojo学习笔记(2.djConfig详解)


djConfig是dojo内置的一个全局设置对象,其作用是可以通过其控制dojo的行为

首先我们需要在引用dojo.js前声明djConfig对象,以便在加载dojo.js的时候才能够取得所设置的值,虽然在0.3版本以后dojo支持在加载后设置,但是强烈建议你把声明djConfig的代码作为第一段script

一个完整的djConfig对象定义如下(值均为dojo的默认值)

<scripttype="text/javascript">
vardjConfig={
isDebug:false,
debugContainerId:"",
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的其他属性,比如: [url]http://server/dojoDemo.htm?djConfig.debugContainerId=divDebug[/url]

baseScriptUri,一般不需要设置,dojo会自动根据你引用dojo.js的路径设置这个值,比如,<scripttype="text/javascript"src="../dojo/dojo.js"></script>,自动获取的值便是../dojo/
ps:如果你有多个工程需要同时引用dojo.js的话,建议也把dojo当作一个独立的工程,引用的时候采用绝对路径就可以了
作者: wjm251

2006-9-4 14:39   回复此发言

3 Dojo学习笔记(转)

parseWidgets,这个是可以控制dojo是否自动解析具有dojoType的html元素为对应的widget,如果你没有使用任何Widget,建议设置为false以加快dojo的加载速度

searchIds,这是一个字符串数组,定义了所有需要解析为widget的html元素的ID,如果ID不在其中的html元素是不会被解析的,当数组为空数组时,则所有具有dojoType的元素都会被解析

至于其它的属性,不是用处不大,就是不知道有什么作用

在实际开发中,可以把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,则返回的是一个集合

��UsageExample:

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

��将异常转换为字符串

��UsageExample:

try
{
dojo.raise("打印失败",newError("文件不存在"));
}
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说明浏览器是InternetExplorer
dojo.html.opera返回true说明浏览器是Opera
dojo.html.khtml返回true说明浏览器是Konqueror
dojo.html.safari返回true说明浏览器是Safari
dojo.html.moz返回true说明浏览器是MozillaFireFox
dojo.svg.capable返回true说明浏览器支持svg
dojo.vml.capable返回true说明浏览器支持vml
dojo.swf.capable返回true说明浏览器支持swf
dojo.swt.capable返回true说明浏览器支持swt(IBM开发的StandardWidgetToolkit)
如果dojo.html.ie为true的话

dojo.html.ie50返回true说明浏览器是IE5.0
dojo.html.ie55返回true说明浏览器是IE5.5
dojo.html.ie60返回true说明浏览器是IE6.0
dojo.html.ie70返回true说明浏览器是IE7.0


dojo.addOnLoad

��可以加载指定函数到window.load时执行,好处就是可以很方便的在window.load时执行多个函数
作者: wjm251

2006-9-4 14:39   回复此发言

4 Dojo学习笔记(转)

UsageExample:

dojo.addOnLoad(init);//init是一个函数
dojo.addOnLoad(myObject,init);//init是myObject对象的一个方法


dojo.require

��如果你想调用一个模块的对象的时候,你应该首先用dojo.require来请求这个模块,dojo会根据你的请求自动取得相应的js文件,并加载到内存中,这样你才能调用或创建其中的对象

��dojo会自动维护已加载的模块列表,所以是不会重复加载模块的

UsageExample:

dojo.require("dojo.event");
dojo.requireIf=dojo.requireAfterIf

��可以根据指定的条件来决定是否加载指定的模块

��UsageExample:

dojo.requireIf(dojo.html.ie,"dojo.html");//如果dojo.html.ie为true,才会加载dojo.html模块


dojo.provide

��除非你要开发自己的模块,不然是用不到这个方法的,你可以这句看成是向系统注册这个模块名称

��UsageExample:

dojo.provide("dojo.custom");
dojo.exists

��判断指定对象是否具有指定名称的方法

��UsageExample:

dojo.exists(dojo,"exists");//willreturntrue


dojo.hostenv.getText

��返回指定url的内容

��PS:由于浏览器的安全限制,因此只能用于取得同域名的url的内容,否则会报告权限不够

��UsageExample:

aSync=false;//同步,确保返回内容不为null
silent=true;//不抛出错误
s=dojo.hostenv.getText(" [url]http://www.google.com/[/url]",aSync,silent);//返回Google的首页的HTML
alert(s);
dojo.debug

��输出调试信息,如果在djConfig中指定了debugContainerId,则输出到指定的console容器中,否则直接document.write

��所有的调试信息均以DEBUG:开头

��UsageExample:

dojo.debug("这是调试信息");


dojo.hostenv.println

��与dojo.debug类似,不同的是,输出内容没有DEBUG:

��UsageExample:

dojo.hostenv.println("这是一般的输出信息");


dojo.debugShallow

��输出指定对象的全部信息(Shallow说明并不会遍历到下一级别的对象属性)以供调试

��UsageExample:

dojo.debugShallow(dojo.render.html);


��以上全部是自己阅读源代码写的总结,如有错误,还请指明。

//**********************************************************************************************************************
Dojo学习笔记(4.dojo.string&dojo.lang)

模块:dojo.string.common/dojo.string
dojo.string.common和dojo.string是一样的,只要require其中一个就可以使用以下方法
dojo.string.trim
去掉字符串的空白
UsageExample:
s="abc";dojo.string.trim(s);//willreturn"abc"dojo.string.trim(s,0);//willreturn"abc"dojo.string.trim(s,1);//willreturn"abc"dojo.string.trim(s,-1);//willreturn"abc"

dojo.string.trimStart
去掉字符串开头的空白
UsageExample:
s="abc";dojo.string.trimStart(s);//willreturn"abc"
dojo.string.trimEnd
去掉字符串结尾的空白
UsageExample:
s="abc";dojo.string.trimEnd(s);//willreturn"abc"
dojo.string.repeat
生成由同一字符(串)重复组成的字符串
UsageExample:
dojo.string.repeat("a",4);//willreturn"aaaa"dojo.string.repeat("1234",3,"-");//willreturn"1234-1234-1234"
dojo.string.pad
使用字符补齐字符串
UsageExample:
dojo.string.pad("100",6);//willreturn"000100"dojo.string.pad("100",6,"0",1);//willreturn"000100"dojo.string.pad("100",-1);//willreturn"100000"
作者: wjm251

2006-9-4 14:39   回复此发言

5 Dojo学习笔记(转)
dojo.string.padLeft
使用字符补齐字符串开头
UsageExample:
dojo.string.padLeft("100",6);//willreturn"100000"
dojo.string.padRight
使用字符补齐字符串结尾
UsageExample:
dojo.string.padRight("100",6);//willreturn"100000"

模块:dojo.lang.common/dojo.lang
dojo.lang.common和dojo.lang是一样的,只要require其中一个就可以使用以下方法
dojo.lang.mixin
将一个对象的方法和属性增加到另一个对象上
UsageExample:

vars1={name:"TestObj",test1:function(){alert("thisistest1!");}}vars2={value:1000,test2:function(){alert("thisistest2!");}}vard={};dojo.lang.mixin(d,s1,s2);//执行后d就具备了s1和s2的所有属性和方法d.test1();
dojo.lang.extend
为指定类的原型扩展方法与属性
UsageExample:

TestClass=function(){};dojo.lang.extend(TestClass,{name:"demo",test:function(){alert("Test!");}});varo=newTestClass();//TestClass本来是没有test方法的,但是extend以后就有test方法了o.test();
dojo.lang.find=dojo.lang.indexOf
查找指定对象在指定数组中的位置
UsageExample:
vararr=[1,2,1];dojo.lang.find(arr,2);//willreturn1dojo.lang.find(arr,true);//willreturn1dojo.lang.find(arr,"2",true);//willreturn-1dojo.lang.find(arr,false);//willreturn1dojo.lang.find(arr,true,true);//willreturn4
dojo.lang.findLast=dojo.lang.lastIndexOf
查找指定对象在指定数组中的位置,从后往前查
UsageExample:
vararr=[1,1];dojo.lang.findLast(arr,2);//willreturn4dojo.lang.findLast(arr,true);//willreturn4dojo.lang.findLast(arr,true);//willreturn-1dojo.lang.findLast(arr,false);//willreturn4
dojo.lang.inArray
查找指定对象是否在指定数组中
UsageExample:
vararr=[1,3];dojo.lang.inArray(arr,1);//willreturntruedojo.lang.inArray(arr,4);//willreturnfalse
dojo.lang.isObject
判断输入的类型是否为对象
UsageExample:
dojo.lang.isObject(newString());//willreturntruedojo.lang.isObject("123"));//willreturnfalse
dojo.lang.isArray
判断输入的类型是否为数组
UsageExample:
dojo.lang.isArray({a:1,b:2});//willreturnfalsedojo.lang.isArray([1,3]);//willreturntrue
dojo.lang.isFunction
判断输入的类型是否为函数
UsageExample:
dojo.lang.isFunction(function(){});//willreturntrue
dojo.lang.isString
判断输入的类型是否为字符串
UsageExample:
dojo.lang.isString("");//willreturntruedojo.lang.isString(0);//willreturnfalse
dojo.lang.isAlien
判断输入的类型是否为系统函数
UsageExample:
dojo.lang.isAlien(isNaN);//willreturntrue
dojo.lang.isBoolean
判断输入的类型是否为布尔类型
UsageExample:
dojo.lang.isBoolean(2>1);//willreturntrue
dojo.lang.isNumber
判断输入的类型是否为数值,根据注释所说,此函数使用不太可靠,但是可替换使用的系统函数isNaN也不太可靠
dojo.lang.isUndefined
判断输入是否为未定义,根据注释所说,此函数有可能会导致抛出异常,推荐使用typeoffoo=="undefined"来判断
模块:dojo.lang.extras
dojo.lang.setTimeout
延迟指定时间后执行指定方法
作者: wjm251

2006-9-4 14:39   回复此发言

6 Dojo学习笔记(转)
UsageExample:
functiononTime(msg){dojo.debug(msg)}dojo.lang.setTimeout(onTime,1000,"test");//1秒后会输出调试信息"test"dojo.lang.setTimeout(dojo,"debug","test");//1秒后会输出调试信息"test"
dojo.lang.getNameInObj
获得指定项目在指定对象中的名称
UsageExample:
dojo.lang.getNameInObj(dojo,dojo.debug);//willreturn"debug"
dojo.lang.shallowCopy
返回指定对象的浅表复制副本
UsageExample:
dojo.lang.shallowCopy({});//willreturna空对象
dojo.lang.firstValued
返回第一个存在定义的参数
UsageExample:
vara;dojo.lang.firstValued(a,3);//willreturn2
以上全部是自己阅读源代码写的总结,如有错误,还请指明。

//********************************************************************************************************************
Dojo学习笔记(5.dojo.lang.array&dojo.lang.func&dojo.string.extras)


模块:dojo.lang.array

dojo.lang.has
判断对象是否具有指定属性,不过这个方法有用吗,不如直接使用if(nameinobj)
UsageExample:
dojo.lang.has(dojo.lang,"has");//willreturntrue

dojo.lang.isEmpty
判断对象或数组是否为空
UsageExample:
dojo.lang.isEmpty({a:1});//willreturnfalse
dojo.lang.isEmpty([]);//willreturntrue

dojo.lang.map
调用指定的方法处理指定的数组或字符串
UsageExample:
dojo.lang.map([1,4,5],function(x){returnx*x;});//willreturn[1,9,16,25]

dojo.lang.forEach
遍历指定的数组或字符串,并对其中的元素调用指定的方法
UsageExample:
dojo.lang.forEach("abc",function(x){alert(x);});

dojo.lang.every
检查指定的数组是否全部满足指定方法的条件
UsageExample:
dojo.lang.every([1,-2,3],function(x){returnx>0;});//指定的数组不是全大于0的,因此返回false

dojo.lang.some
检查指定的数组是否部分满足指定方法的条件
UsageExample:
dojo.lang.some([1,function(x){returnx>0;});//指定的数组有大于0的元素,因此返回true

dojo.lang.filter
根据指定的方法来过滤指定的数组
UsageExample:
dojo.lang.filter([1,function(x){returnx>0;});//willreturn[1,3]

dojo.lang.unnest
把指定的参数或数组转换为一维数组
UsageExample:
dojo.lang.unnest(1,3);//willreturn[1,3]
dojo.lang.unnest(1,[2,[3],[[[4]]]]);//willreturn[1,4]

dojo.lang.toArray
将输入转换为数组
UsageExample:
functiontest()
{
returndojo.lang.toArray(arguments,1);
}
test(1,5);//willreturn[2,5]

模块:dojo.lang.func
dojo.lang.hitch
将指定的方法挂在指定的对象下并返回该方法
UsageExample:
func={test:function(s){alert(s)}};
dojo.lang.mixin(func,{demo:dojo.lang.hitch(func,"test")});
func.demo("demoandtestaresamemethod");

dojo.lang.forward
返回自身对象的指定名称的方法引用
UsageExample:
func={test:function(s){alert(s)},demo:dojo.lang.forward("test")};
func.demo("demoandtestaresamemethod");

dojo.lang.curry
Whatiscurry?请参阅这篇文章: [url]http://www.svendtofte.com/code/curried_javascript/[/url]
UsageExample:
functionadd(a,b)
{
returna+b;
}
dojo.lang.curry(null,add,3);//willreturn5
dojo.lang.curry(null,2)(3);//willreturn5
作者: wjm251

2006-9-4 14:39   回复此发言

7 Dojo学习笔记(转)
dojo.lang.curry(null,add)(2)(3);//willreturn5
dojo.lang.curry(null,add)()(2)(3);//willreturn5

dojo.lang.curryArguments
与dojo.lang.curry类似,但是可以选择忽略掉前n个参数
UsageExample:
functionadd(a,b)
{
returna+b;
}
dojo.lang.curryArguments(null,[1,2);//willreturn5(=2+3)

dojo.lang.tryThese
测试参数指定所有函数,并返回第一个返回值不为0的函数值,没看懂这个函数哪里用得着
dojo.lang.delayThese
没看懂这个函数怎么用

模块:dojo.string.extras

dojo.string.substituteParams
类似C#中的String.Format函数
%{name}要保证与传入的对象的名称大小写一致,否则会出异常
UsageExample:
dojo.string.substituteParams("%{0}-%{1}-%{2}","a","b","c");//willreturn"a-b-c"
dojo.string.substituteParams("%{name}:%{value}",{name:"名称",value:"值"});//willreturn"名称:值"

dojo.string.capitalize
把每一个单词的首字母大写
UsageExample:
dojo.string.capitalize("showmelove");//willreturn"ShowMeLove"

dojo.string.isBlank
判断输入字符串是否为空或全是空白字符,如果传入对象为非字符串则也会返回true
UsageExample:
dojo.string.isBlank("1");//willreturnfalse

dojo.string.escape
参数1为type,可传值为:xml/html/xhtml,sql,regexp/regex,javascript/jscript/js,ascii
将按照所传type对字符串进行编码
UsageExample:
dojo.string.escape("html","<inputtype='text'value=''/>");//willreturn"<input
type='text'value=''/>"

dojo.string.encodeAscii
dojo.string.escapeXml
dojo.string.escapeSql
dojo.string.escapeRegExp
dojo.string.escapeJavaScript
dojo.string.escapeString
这些函数也就是dojo.string.escape所调用的,这里无需多说

dojo.string.summary
取得输入字符串的缩略版本
UsageExample:
dojo.string.summary("1234567890",5);//willreturn"12345..."

dojo.string.endsWith
判断输入字符串是否以指定的字符串结尾
UsageExample:
dojo.string.endsWith("abcde","E");//willreturnfalse
dojo.string.endsWith("abcde","E",true);//willreturntrue

dojo.string.endsWithAny
判断输入字符串是否以指定的任意字符串结尾
UsageExample:
dojo.string.endsWithAny("abcde","e");//willreturntrue

dojo.string.startsWith
判断输入字符串是否以指定的字符串开头
UsageExample:
dojo.string.startsWith("abcde","A");//willreturnfalse
dojo.string.startsWith("abcde","A",true);//willreturntrue

dojo.string.startsWithAny
判断输入字符串是否以指定的任意字符串开头
UsageExample:
dojo.string.startsWithAny("abcde","a");//willreturntrue

dojo.string.has
判断输入字符串是否含有任意指定的字符串
UsageExample:
dojo.string.has("abcde","1","23","abc");//willreturntrue

dojo.string.normalizeNewlines
按要求转换回车换行的格式
UsageExample:
dojo.string.normalizeNewlines("a\r\nb\r\n","\r");//willreturn"a\rb\r"

dojo.string.splitEscaped
将字符串按分隔符转换为数组
UsageExample:
dojo.string.splitEscaped("a\\_b_c",'_');//willreturn["a\\_b","c"]

//*****************************************************************************************************************
Dojo学习笔记(6.dojo.io.IO&dojo.io.BrowserIO)
作者: wjm251

2006-9-4 14:39   回复此发言

8 Dojo学习笔记(转)
作者:Icebird�来源:博客园综合区�原文地址�2006-8-7
模块:dojo.io.IO

dojo.io.bind


处理请求取回需要的数据并处理



这个函数是AJAX中最为重要和有用的函数,dojo.io.bind这个类是用来处理客户端与服务器间通讯的,需要通讯的参数由对象dojo.io.Request所定义,具体通讯的方法则由另外一个对象Transport所提供。



因此,我们如果需要与服务器通讯,则应该定义一个Request对象,其中包括服务器地址及回调函数,例子中Requset都是以匿名对象方式定义的


虽然我们可以定义一个自己的Transport,但是显然不如直接利用现成的Transport方便。


Dojo里提供了一个同时兼容IE和Firefox的dojo.io.XMLHTTPTransport,但是这个对象位于dojo.io.BrowserIO,因此,一般requiredojo.io.IO时,还应该requiredojo.io.BrowserIO



UsageExample:

dojo.io.bind({
url:" [url]http://localhost/test.html[/url]",//要请求的页面地址
mimetype:"text/html",//请求的页面的类型,应该设置为与你请求页面类型对应的mimetype,默认为"text/plain"
method:"GET",//默认为"GET"
sync:false,//默认为异步执行
useCache:false,//默认为不使用页面缓存,注意这里的缓存并不是浏览器的缓存,而是Dojo自身所维护的页面缓存
preventCache:false,//默认为启用浏览器缓存,否则将通过自动增加不同的参数来确保浏览器缓存失效
timeoutSeconds:3000,//3秒后超时,如果为0则永不超时

load:function(type,data,evt){alert(data);},//typeshouldbe"load",dataisthatwewanted
error:function(type,error){alert(error.message);},//errorisdojo.io.Error
timeout:function(type){alert("请求超时!");}
});


你也可以用一个handle来处理所有的事件



dojo.io.bind({
url:" [url]http://localhost/test.html[/url]",//请求的页面的类型,应该设置为与你请求页面类型对应的mimetype
timeoutSeconds:3000,//3秒后超时,如果为0则永不超时
handle:function(type,evt){
if(type=="load"){alert(data);}//dataisthatwewanted
elseif(type=="error"){alert(data.message);}//dataistheerrorobject
else{;}//othereventsmaybeneedhandled
}
});

如果没有在Request中指定所用的transport,则Dojo会自动的在已注册的transports中寻找能够处理这个Request的transport,如果不能找到,则返回指定的Request。下面是一个指定了transport的例子:


dojo.io.bind({
url:" [url]http://localhost/test.html[/url]",//3秒后超时,如果为0则永不超时
transport:"XMLHTTPTransport",

load:function(type,//errorisdojo.io.Error
timeout:function(type){alert("请求超时!");}
});


你还可以利用bind来得到一个JavaScript所定义的对象(注意mimetype必须要定义为"text/javascript")



testObj=dojo.io.bind({
url:" [url]http://localhost/test.js[/url]",//test.js里定义了一个对象
mimetype:"text/javascript",//3秒后超时,如果为0则永不超时
作者: wjm251

2006-9-4 14:39   回复此发言

9 Dojo学习笔记(转)
handle:function(type,evt){
if(type=="load"){alert(data);}//dataisaobjectorvalue
elseif(type=="error"){alert(data.message);}//dataistheerrorobject
else{;}//othereventsmaybeneedhandled
}
});

下面是一个Post的例子:

dojo.io.bind({
url:" [url]http://localhost/test.aspx[/url]",//要提交的页面地址
mimetype:"text/html",//3秒后超时,如果为0则永不超时
method:"POST",
formNode:dojo.byId("myForm"),//指定提交的Form名称

load:function(type,//errorisdojo.io.Error
timeout:function(type){alert("请求超时!");}
});



另一个Post的例子(withoutFormtopost):


dojo.io.bind({
url:" [url]http://localhost/test.aspx[/url]",
content:{a:1,b:2},//要提交的数据

load:function(type,//errorisdojo.io.Error
timeout:function(type){alert("请求超时!");}
});




dojo.io.queueBind


有时,我们需要一次发出多个网页请求,则应该使用dojo.io.queueBind,因为浏览器可能只允许同时发出有限个数的请求,如果是使用dojo.io.bind的话,则有可能会申请不到新的XMLHttp对象而导致出错。

用法与dojo.io.bind是一样的。




dojo.io.argsFromMap


用来把对象转换为URL的参数形式

UsageExample:


dojo.io.argsFromMap({a:1,b:2,c:3});//willreturn"c=3&b=2&a=1"
dojo.io.argsFromMap({name:"名称",value:"值"},"utf");//willreturn"value=%E5%80%BC&name=%E5%90%8D%E7%A7%B0",有中文的话应该指定utf格式,否则dojo.string.encodeAscii返回的编码是很怪异的
dojo.io.argsFromMap({a:1,c:3},"utf","c");//willreturn"b=2&a=1&c=3",最后一个参数可以控制指定名称的值出现在最后




dojo.io.setIFrameSrc


设置IFrame的Src

UsageExample:



dojo.io.setIFrameSrc(dojo.byId("myFrame")," [url]http://localhost/test.htm[/url]");//myFrame打开指定的网页
dojo.io.setIFrameSrc(dojo.byId("myFrame")," [url]http://localhost/test.htm[/url]",true);//myFrame打开指定的网页,并覆盖浏览器的历史记录 TODO:补充一个kwArgs的例子,我之前在网上看见过,可是现在无论如何也找不到相关的页面了,只好以后在举例了 模块:dojo.io.BrowserIO 基本上就提供了dojo.io.XMLHTTPTransport这个对象 XMLHTTPTransport一般能够满足我们的需求,但是其有几个限制:它不能传输文件,不能够成功执行跨域名的远程请求,并且不支持file://这样的协议 因此,根据应用要求,我们可能会需要选用其它的transport:dojo.io.IframeTransport,dojo.io.repubsubTranport,dojo.io.ScriptSrcTransport,ShortBusTransport dojo.io.IframeTransport,用法与xmlhttp是一样的,其优点就是可以跨域,不存在任何的安全问题 如果Request指定的mimetype是text或javascript,返回的内容应该是放在第一个textarea里的内容,如果指定的mimetype是html,则IFrame里的html则是需要的内容。因为浏览器兼容的原因,IframeTransport不能正确处理返回类型为XML的请求。 关于Rpc,这个类似于Remoting的东西,也将在以后对其进行介绍。 Icebird2006-08-0714:52发

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


我有一个网格,可以根据更大的树结构编辑小块数据.为了更容易知道用户保存了什么,我希望当用户第一次看到网格时,网格处于不可编辑状态.当用户准备好后,他们可以单击编辑按钮,这将使网格的某些部分可编辑.然后,有一个保存或取消按钮可以保存更改或还原.在大多数情况下它是有效的.但
我即将开始开发一款教育性的视频游戏.我已经决定以一种我可以轻松打包为Web,Mobiles和可能的Standalone版本的方式来实现这一目标.我不想使用Flash.因此,我确信(无论如何我会听取建议)使用JavaScript和SVG.我正在对这个问题进行大量研究,但我很难把各个部分放在一起.我知道Raphae
我正在使用带有Grails2.3.9的Dojo1.9.DojoNumberTextBox小部件–我在表单中使用–将固定格式(JavaScript基本格式)的实数值(例如:12.56)设置为HTML表单输入字段(但根据浏览器区域设置显示/编辑它们,所以用户总是看到格式正确的数字).另一方面,Grails期望输入字段根据浏览器
1.引言鉴于个人需求的转变,本系列将记录自学arcgisapiforjavaScript的学习历程,本篇将从最开始的arcgisapiforjavaScript部署开始,个人声明:博文不在传道受业解惑,旨在方便日后复习查阅。由于是自学,文章中可能会出现一些纰漏,请留言指出,不必留有情面哦!2.下载ArcGISforDe
我正在阅读使用dojo’sdeclare进行类创建的语法.描述令人困惑:Thedeclarefunctionisdefinedinthedojo/_base/declaremodule.declareacceptsthreearguments:className,superClass,andproperties.ClassNameTheclassNameargumentrepresentsthenameofthec
我的团队由更多的java人员和JavaScript经验丰富组成.我知道这个问题曾多次被问到,但为了弄清楚我的事实,我需要澄清一些事情,因为我在客户端技术方面的经验非常有限.我们决定使用GWT而不是纯JavaScript框架构建我们的解决方案(假设有更多的Java经验).这些是支持我的决定的事实.>
路由dojo/framework/srcouting/README.mdcommitb682b06ace25eea86d190e56dd81042565b35ed1Dojo应用程序的路由路由FeaturesRoute配置路径参数RouterHistoryManagersHashHistoryStateHistoryMemoryHistoryOutletEventRouterContextInjectionOutl
请原谅我的无知,因为我对jquery并不熟悉.是否有dojo.connect()的等价物?我找到了这个解决方案:http:/hink-robot.com/2009/06/hitch-object-oriented-event-handlers-with-jquery/但是没有断开功能!你知道jquery的其他解决方案吗?有jquery.connect但这个插件在我的测试中不起作用.
与java类一样,在dojo里也可以定义constructor 构造函数,在创建一个实例时可以对需要的属性进行初始化。//定义一个类mqsy_yjvar mqsy_yj=declare(null,{     //thedefaultusername    username: "yanjun",          //theconstructor   
我一直在寻找一些最佳实践,并想知道Dojo是否具有框架特定的最佳实践,还是最好只使用通用的Javascript标准?特别是我主要是寻找一些功能和类评论的指导方针?解决方法:对于初学者来说,这是项目的风格指南:DojoStyleGuide
我有’05/17/2010’的价值我想通过使用dojo.date.locale将其作为“2010年5月17日”.我尝试过使用dojo.date.locale.parse,如下所示:x='05/17/2010'varx=dojo.date.locale.parse(x,{datePattern:"MM/dd/yyyy",selector:"date"});alert(x)这并没有给我所需的日期
我正在尝试创建一个包含函数的dojo类,这些函数又调用此类中的其他函数,如下所示:dojo.provide("my.drawing");dojo.declare("my.drawing",null,{constructor:function(/*Object*/args){dojo.safeMixin(this,args);this.container=args[0];
我知道你可以使用jQuery.noConflict为jQuery做这件事.有没有办法与Dojo做类似的事情?解决方法:我相信你可以.有关在页面上运行多个版本的Dojo,请参阅thispage.它很繁琐,但似乎是你正在寻找的东西.一般来说,Dojo和jQuery都非常小心,不会破坏彼此或其他任何人的变量名.
我有一个EnhancedGrid,用户经常使用复杂的过滤器.有没有办法允许用户保存或标记过滤器,以便将来可以轻松地重新应用它?我知道我可以通过编程方式设置过滤器,但我无法预测用户想要的过滤器.谢谢!编辑:自己做了一些进展…使用grid.getFilter()返回过滤器的JSON表示,然后使用json.strin
我有这个代码:dojo.declare("City",null,{constructor:function(cityid,cityinfo){}});dojo.declare("TPolyline",GPolyline,{constructor:function(points,color){},initialize:function(map){});应该是什
我遇到的问题是我的所有javascript错误似乎来自dojo.xd.js或子模块.我正在使用chrome调试器和许多dijit功能,如dijit.declaration和dojo.parser.这有点烦人,因为它很难找到简单的错误或滑倒.我希望我可以添加一个选项,允许我的调试器在我的非dojo代码中显示选项会发生的位置.我是
我正在使用DojoToolkit数字/解析函数来处理格式化和使用ICU模式语法解析字符串.有没有人知道有可能采取任意ICU模式字符串并以某种方式使用Dojo(或其他)库将其分解为它的部分(例如,对于数字模式,它可以被分解为小数位数,数千个分组等…).我希望这样做,而不需要让我的代码密切了
我有两个看似相关的问题,访问在不同的地方定义的javascript函数.我遇到的第一个问题是调用我在firgbug或safari控制台中定义的函数.我定义了一个名为getRed的函数,如下所示:functiongetRed(row,col){//dosomethingstuffandreturntheredvalueasa
我想添加一个在Ajax调用中指定的外部样式表.我已经找到了一种方法来使用jQuery(参见下面的示例),但是我需要使该方法适应dojoJavaScript框架.JQuery示例$('head').append('<linkrel="stylesheet"type="text/css"href="lightbox_stylesheet.css">');谢谢.解决方法:一旦你
我正在尝试使用dojo.connect将onMouseDown事件连接到图像,如:dojo.connect(dojo.byId("workpic"),"onMouseDown",workpicDown);functionworkpicDown(){alert("mousedown");}类似的代码几行后,我将onMouse*事件连接到dojo.body确实完全正常工作.但是当我点击图像时