学习 YUI3 中的沙箱机制
作者:blank 来源:怿飞blog 发布时间:2010-04-12 12:52:00
简化了一下 YUI3 中的沙箱实现 方式:
if (typeof Sandbox === 'undefined' || !Sandbox) {
测试页面:http://www.planabc.net/lab/yui/sandbox.html
Sandbox = function(o) {
var self = this;
if (!(self instanceof Sandbox)) { // 允许没有 new 操作符的实例化
return new Sandbox(o);
} else {
self._init();
self._config(o);
// 预加载某些指定模块
/* self._setup(); */
// 返回实例本身,支持链式模式
return self;
}
};
}
// Sandbox的(类)静态属性
Sandbox.Env = {
/* sidx: 0 , */
mods: {}
};
(function() {
var p, i,
SLICE = Array.prototype.slice,
/* instances = {}, */
time = new Date().getTime(),
win = window,
doc = document;
Sandbox.prototype = {
// 格式化配置参数
// NOTE:本着简单适用的原则,取消了原先 YUI 中对 loader 的支持
_config: function(o) {
var c = this.config, i, j, m, mods;
o = o || {};
// mods = c.modules;
for (i in o) {
if (i == 'win') {
c[i] = o[i].contentWindow || o[i];
c.doc = c[i].document;
} else {
c[i] = o[i];
}
}
},
/**
* 初始化沙箱实例
* @private
*/
_init: function() {
var self = this,
G_Env = Sandbox.Env,
Env = self.Env;
if(!Env) {
self.Env = {
mods: {},
_used: {},
_attached: {},
_loaded: {}
};
Env = self.Env;
/* if (G_Env && self !== Sandbox ) {
Env._sidx = ++ G_Env.sidx;
Env._guid = ('sandbox_' + Env._sidx + '_' + time).replace(/\./g, '_');
}
self.id = Env._guid;
instances[self.id] = self; */
}
self.constructor = Sandbox;
self.config = {
win: win || {},
doc: doc || {}
};
},
// 预留预加载某些指定模块,接口可根据实际需要扩展
/* _setup: function(o) {}, */
/**
* 添加模块
* @method add
* @param name {string} 模块名
* @param fn {Function} 模块对应的函数
* @param version {string}
* @param details 可选配置:
* requires - {array} 在本模块执行之前附加的必须的模块数组
* use - {array} 在本模块执行之后附加的模块数组
*
*/
add: function(name, fn, details) {
Sandbox.Env.mods[name] = {
name: name,
fn: fn,
details: details || {}
};
return this; // chain support
},
/**
* 执行与 Sandbox 实例相关联的模块:details.requires--》fn--》details.use
* @method _attach
* @param r {array} 模块列表数组
* @private
*/
_attach: function(r) {
var mods = Sandbox.Env.mods,
self = this,
attached = self.Env._attached,
i, l = r.length, name, m, fn, d, req, use;
for (i = 0; i < l; i = i+1) {
name = r[i];
m = mods[name];
if (!attached[name] && m) {
attached[name] = true;
fn = m.fn;
d = m.details;
req = d.requires;
use = d.use;
if (req) {
self._attach(req);
}
if (fn) {
fn(self);
}
if (use) {
self._attach(use);
}
}
}
},
/**
* 绑定模块至 Sandbox 实例
* @param modules* {string} 1-n 个模块 (uses arguments array)
* @param *callback {function} callback function 如果包括,必须是最后一个参数。
*
* Sandbox().use('planabc.net')
* Sandbox().use('planabc.net',function(){})
* Sandbox().use('planabc.net','planabc.com')
* Sandbox().use('planabc.net','planabc.com',function(){})
* Sandbox().use('*'); // use all available modules
*
*/
use: function() {
var self = this,
a = SLICE.call(arguments, 0),
mods = Sandbox.Env.mods,
used = self.Env._used,
loader,
firstArg = a[0],
callback = a[a.length-1],
k, i, l,
r = [],
process = function(name) {
// 添加模块至附加的模块列表
r.push(name);
// 一个模块仅附加一次
if (used[name]) {
return;
}
var m = mods[name], req, use, j, jl, t, tl,
d = m.details;
if (m) {
used[name] = true;
req = d.requires;
use = d.use;
}
// 附加上 requires 模块
if (req) {
for (j = 0,jl = req.length ; j < jl; j = j + 1) {
process(req[j]);
}
}
// 附加上 use 模块
if (use) {
for (t = 0, tl = use.length; t < tl; t = t + 1) {
process(use[t]);
}
}
},
onComplete;
if (typeof callback === 'function') {
a.pop();
} else {
callback = null;
}
onComplete = function() {
if (callback) {
callback(self);
}
};
// Sandbox().use('*');
if (firstArg === "*") {
a = [];
for (k in mods) {
if (mods.hasOwnProperty(k)) {
a.push(k);
}
}
if (callback) {
a.push(callback);
}
return self.use.apply(self, a);
}
l = a.length;
// 处理所有必须和附加的模块
for (i = 0; i < l; i = i + 1) {
process(a[i]);
}
self._attach(r);
onComplete();
return self; // chain support
}
};
})();
猜你喜欢
- Sitepoint有一个不错的针对Web开发者和设计者的参考手册网站,可以查询HTML、CSS和JavaScript的基本信息、兼容性和示例
- Q:Dreamweaver(简称DW)中如何输入空格?A:按下“Ctrl+Shift+空格键”或者在中
- 1、互动流通的活跃度是社区网站的关键,产品设计者大都需要在此猛下药。facebook有利用率最高的minifeed,myspace有“好友的
- asp代码 如下:读取注册表信息使用了对象WScript.Shell<%Dim strPath strP
- 首先,与其他语言不同,JS的效率很大程度是取决于JS engine的效率。除了引擎实现的优劣外,引擎自己也会为一些特殊的代码模式采取一些优化
- 滚动图片可以说是做网站经常会遇到的,特别是做企业网站,最常用的像产品展示,图片展示等,滚动的好处是吸引眼球,让人一下就注意到。之前本站发了一
- 见下表:序号列类型需要的存储量1TINYINT1 字节2SMALLINT2 个字节3MEDIUMINT3 个字节4INT4 个字节5INTE
- 启动mysql server 失败,查看/var/log/mysqld.err080329 16:01:29 [ERROR] Can'
- 内容摘要: 网页的色彩搭配往往是网友们感到头疼的问题,尤其是那些完全没有美术基础的网友。到底用
- 代码如下:---这是一个人事系统中的示例,要求记录一下员工的缺勤情况 ---1.要在表中记录一下缺勤计分,是对经常缺勤者的一种处
- 众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著。前些天我做自己
- 在HTML中,常见的URL有多种表示方式:相对URL: example.php demo
- 在进行数据库的查询时,会经常遇到这样的情况:例如想在一个用户数据库中查询他的用户名和他的密码,但恰好该用户使用的名字和密码中有特殊的字符,例
- 此文用来正式回复大辉同学的疑问。1、结论:固定宽度只适合功能型网站,不适合希望用户认真阅读的浏览型网站。UCD大社区是浏览型网站,它的定位是
- 读取binlog,方法有二:1.使用mysqlbinlog,详细用法,请参考MySQL手册2.使用MySQL的自带工具,SHOW BINLO
- 又有人说设session.timeout=99999。这种同样不行,session有最大时间限制。我经过测试发现最大值为24小时,也就是说你
- 在Internet上我们每天都会遇到数不清的表单,也看到其中大部分并没有限制用户多次提交同一个表单。缺乏这种限制有时候会产生某些预料不到的结
- 本文整理了3种鼠标经过图片,图片边框加粗或改变颜色的方法,希望大家喜欢。下面3中只是提供了一个方法,具体的鼠标经过图片的样式,你自己可以修改
- 代码如下:Class template Private c_Char, c_Path, c
- 前一段时间,一个流行的东方系列mv 《bad apple》 带来一股奇怪的风潮: 各种技术狂人纷纷把这段mv在一些匪夷