学习 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
}
};
})();
猜你喜欢
- 简介一款跨平台/无依赖的自动化测试工具,目测只能控制鼠标/键盘/获取屏幕尺寸/弹出消息框/截屏。安装pip install pyautogu
- PyQt5 MDI(多文档窗口)QMidArea简介一种同时显示多个窗口的方法是,创建多个独立的窗口,这些独立的窗口被称为SDI(Singl
- 1、读取方法有按行(单行,多行连续,多行不连续),按列(单列,多列连续,多列不连续);部分不连续行不连续列;按位置(坐标),按字符(索引);
- 本文实例讲述了PHP学习记录之面向对象(Object-oriented programming,OOP)基础。分享给大家供大家参考,具体如下
- 拿到需求之后,发现这两个网站的MYSQL数据库都不能远程访问(安全第一吧)。于是想起了 平时使用的CSV文件批量录入数据。于是 尝试使用CS
- UEditor效果图一、简介UEditor是一个开源免费的编辑器,由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,
- 一、实验目标1、使用 K-means 模型进行聚类,尝试使用不同的类别个数 K,并分析聚类结果。2、按照 8:2 的比例随机将数据划分为训练
- 本文实例讲述了Django利用cookie保存用户登录信息的方法。分享给大家供大家参考,具体如下:设置cookieresponse对象.se
- 小主我总结了一下,看官仅供参考。具体运行时间,要看电脑,程序复杂程度,截图大小,原本为四个方法,后面又发现了一种。补上运行熟练度等因素。方法
- 本文实例讲述了C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法。分享给大家供大家参考。具体如下:这个
- 游戏说明:一个考验您记忆力的游戏,只要两个方块的;图案能够凑成一对,最终翻开所有的图片,那么您就获胜,计算机将自动记录您的游戏时
- 学了python后,之前一些我们常用的方法,也可以换一种思路用python中的知识来解决。相信操作出来后,能收获一大批小粉丝们。就像我们没学
- 安装Pycharm2020.1无法启动安装完成后,打开就闪退卸载干净以前的版本如果 C:\Users\用户名字\.PyCharm2019.*
- 无论是对于刚接触编程的初学者,还是已经工作的程序员,哪一门编程语言更火,更有价值和前景,似乎是永远有争议的话题。下面来对比说以下python
- 前言: 经过前面文章学习,我们知道 binlog 会记录数据库所有执行的 DDL 和 DML 语句(除了数据查询语句select、
- 一、DataLoader理解在深度学习模型训练中,数据的预处理和读取是一个非常重要的问题。PyTorch作为深度学习框架之一,提供了Data
- 1. TVP, 表变量,临时表,CTE 的区别 TVP和临时表都是可以索引的,总是存在tempdb中,会增加系统数据库开销,而表变量和CTE
- python的matplotlib包支持我们画图,有点非常多,现学习如下。首先要导入包,在以后的示例中默认已经导入这两个包import ma
- 目录1,刚开始(可能会很low)2.单行消失3.优化后的单行消失总结1,刚开始(可能会很low)import timescale=10pri
- gob是Golang包自带的一个数据结构序列化的编码/解码工具。编码使用Encoder,解码使用Decoder。一种典型的应用场景就是RPC