Get
子下两个重要方法:script和css,还有一个abort。两参
- url(s):可为数组,为数组时依次加载。
- opt:配置hash
opt选项很多,大概这么几个重要的
- onSuccess,onFailure
- attributes(为该节点添加一些属性)
- scope指定作用域
- 当然,少不了data。
- autopurge 默认script 为true,css为false。即js执行后就没了,css存在。
- 默认都是加载在head里,但一般我们想把script加载在某个节点前的话怎么办,用insertBefore,需要注意的是只要提供id就可以,不要写“#”
关于返回的这个对象,和事件对象一样,需要传递到opt的函数处理中。在opt中配置的一些玩意儿,比如data,就可以在这里从返回的这个对象上获取。它也有几个有用的,除了刚才的data
在GET方法源码中,就是在head中调用appendChild/或使用insertBefore来实现加载资源。(异步加载)
此外,也可以在YUI的config中调用script,主要是基于下面loader机制,实现了lazy loading机制,同时在页面载入中也解决了Blocking。比如这样
YUI({
charset: 'utf-8',
modules: {
'examjs': { fullpath: 'http://example.com/exam.js' }
}
}).use('node', function(Y, result){ …… })
更多就看官网了 , 这个例子非常值得一看。
Loader
有些方法和GET一样,在此略过,需要留意的是这些
- base 设置基本目录
- force:强制加载模块,以数组形式给出。例如['node', 'event']
- debug: 可以配合filter用于调试。
- require:以对象形式给出依赖的模块列表。
将参注册进Loader就搞定了。对自定义模块的配置:name,(full)path,type(默认js),requires(指明该模块依赖哪个内置模块)
在此注册后,还须显式声明调用该模块,否则只是注册,并不发起http请求。eg:
YUI({
base: 'http://example.com/yui/build/',
debug: true,
modules: {
jquery: {
fullpath: 'http://example.com/jquery/lib/jquery.js'
}
}
}).use('jquery', function(Y,result){
//result 保留着调用这些模块所返回的信息。
})
除了客户端引入方式,YUI还提供了server端php后台引入(未来会支持其他语言,不过暂时只关注php),实例化之后只需要调用loader(所需模块),然后echo tag()就可以了(如果想在不同的位置引入这些资源,分别调用css和script方法就可以了)。有几个参数比较有用(其实我想也是关键)
- allowRollups 捆佳节又重阳绑式引入文件
- combine 将所有模块合并至一个请求
同样支持自定义模块,传递给实例化的第三个参数即可(数组形式),eg
$myModule = array(
'extJs'=> array(
'type' => 'js', //必须指定,费解。
'fullpath' => 'http://www.json.org/json2.js'
),
//etc...
);
//同样需要在load函数里指明一下。
$loader = new YAHOO_util_Loader('3.0.0b1', 'Yleo', $myModule, false);
两者的结合,大大减少http请求数,优化页面载入时间当然最少也得两个(script & link)。为什么我引入css没有反应,显示调用也无果!再看看。
更多, Introducing PHP Loader
Attribute
都说yui的事件管理机制足够强大,尤其是自定义事件,从这里也能窥见一斑。Y.Attribute继承了EventTarge,自然也拥有了部分事件管理功能。
看官方给出的文档,给我初步的感觉类的扩充,与事件管理的融合,妙哉。
基础方法也就是最常见的取值器和赋值器。但是有点麻烦。因为在定义类值时,必须使用他们固定的格式
//我想是这样,再不需要在该属性上定义其他操作,比如验证。
myPro: 'just do it',
//但必须这样。如果只有一个赋值,我想它应该简化一下。
myPro: { value: 'must do like this'}
在上面这个大括号里,可以放很多东西,加 addAttr(s).,当然也可以使用属性内部的setter和getter为所欲为。顺序(val,name) (yui的参数顺序好像很多这样,感觉不习惯,大部分情况是name,val更符合习惯,包括each一样,记住)。
这里对属性的赋值时,有两个readOnly和writeOnce,知道下就行了。(虽然有这两个,不过通过_set依然可以绕过限制,但需要知道个原则,不要使用这些带下划线的方法!)
精彩的事件系统
同javascript事件系统一样,都将事件的绑定在on方法上。只不过这个事件类型形如这样 属性名+Change,文档上说支持监瑞脑消金兽听下几代元素值改变,同时也会"冒泡"在根属性上,此时,subAttrName指向所修改的孙子元素。
在事件处理上,e对象上有两个属性prevVal和newVal,一个指向老值,一个新值,其他和默认事件基本一样。对了,有个干的事一样但叫法不一样的:stopImmediatePropagation(知道 stopPropagation干什么就知道是干什么的)。
Base
和Attribute一样(必然的,A有它的血统),属性的值只能通过取值器和赋值器来操作。eg
function Yleo(){
Yleo.superclass.constructor.apply(this, arguments);
}
Yleo.ATTRS = {
//当然,针对每个属性,少不了setter和getter。
a: { value: 'bigA' }
};
var myExam = new Yleo();
// 不能通过myExam.a来获取,也不能通过myExam['a']来获取。
Y.log(myExam.get('a'));
别忘了,在oo的世界里,总是少不了construction和destruction,YUI自然有对应的实现。
Y.extend(Yleo, Y.Base, {
initializer: function(){}, //想干什么是你的,反正我必然会发生(new时)
destructor: function(){}; //调用destroy()时触发
});
Something else
- Base上有个build(),操作在类级别上,用来在已有类(构造函数)基础上扩充一个新的构造函数。
- YUI上的substitute函数,实现了YUI的小模板功能,使用时需装载substitute模块(YUI3的模块足够细化)
- ……保持更新
about Profiler
主要用于跟踪单元测试函数包括对象的执行时间,次数,效率,或者实例化等等。注册函数,对象需要提供作用域,全局时指定为window。
//同样的还有registerObject('Y.Node', Y.Node);
//如果是构造函数的话,registerConstructor
Y.Profiler.registerFunction(fun, scope);
匿名函数的话,
var instrumentFun = Y.Profiler.instrument('anonymous1', function(num1, num2){
return num1+num2;
});
得到方法调用次数: getCallCount, 要么getReport。
如果想获取某一段代码执行时间,设置一个标志位,通过start(str)和stop(str)。
Over. 不定期更新