Permalink
Browse files

update part of the code for version 1.6.0

  • Loading branch information...
ChineseDron committed Jan 3, 2012
1 parent 7d2714c commit e8b3cc9128b3eebf8a15957dabdf2463706c832b
View
@@ -1,4 +1,4 @@
Copyright (c) 2009, Baidu Inc.
Copyright (c) 2012, Baidu Inc.
All rights reserved.
Redistribution and use of this software in source and binary forms, with or
View
@@ -20,20 +20,20 @@
/**
* @namespace T Tangram七巧板
* @name T
* @version 1.5.1
* @version 1.6.0
*/
/**
* 声明baidu包
* @author: allstar, erik, meizz, berg
*/
var T,
baidu = T = baidu || {version: "1.5.1"};
baidu = T = baidu || {version: "1.5.0"};
//提出guid,防止在与老版本Tangram混用时
//在下一行错误的修改window[undefined]
baidu.guid = "$BAIDU$";
//Tangram可能被放在闭包中
//一些页面级别唯一的属性,需要挂载在window[baidu.guid]上
window[baidu.guid] = window[baidu.guid] || {};
baidu.$$ = window[baidu.guid] = window[baidu.guid] || {global:{}};
@@ -10,6 +10,7 @@
///import baidu.lang.createSingle;
///import baidu.lang.Event;
///import baidu.lang.Class.$removeEventListener;
/**
* 拖曳管理器
* @function
@@ -5,7 +5,6 @@
///import baidu.dom._g;
///import baidu.dom.getDocument;
///import baidu.browser.ie;
/**
* 获取目标元素的computed style值。如果元素的样式值不能被浏览器计算,则会返回空字符串(IE)
@@ -34,3 +33,5 @@ baidu.dom.getComputedStyle = function(element, key){
}
return '';
};
// 20111204 meizz 去掉一个无用的import baidu.browser.ie
@@ -29,6 +29,10 @@
*/
baidu.dom.hasClass = function (element, className) {
element = baidu.dom.g(element);
// 对于 textNode 节点来说没有 className
if(!element || !element.className) return false;
var classArray = baidu.string.trim(className).split(/\s+/),
len = classArray.length;
@@ -4,7 +4,7 @@
*
* path: baidu/event/getEvent.js
* author: xiadengping
* version: 1.1.0
* version: 1.6.0
* date: 2011/12/08
*/
View
@@ -9,8 +9,6 @@
*/
///import baidu.lang.guid;
///import baidu.lang._instances;
///import baidu.lang.isFunction;
/**
* Tangram继承机制提供的一个基类,用户可以通过继承baidu.lang.Class来获取它的属性及方法。
@@ -23,11 +21,13 @@
* @meta standard
* @see baidu.lang.inherits,baidu.lang.Event
*/
baidu.lang.Class = function(guid) {
this.guid = guid || baidu.lang.guid();
window[baidu.guid]._instances[this.guid] = this;
baidu.lang.Class = function() {
this.guid = baidu.lang.guid();
!this.__decontrolled && (baidu.$$._instances[this.guid] = this);
};
window[baidu.guid]._instances = window[baidu.guid]._instances || {};
baidu.$$._instances = baidu.$$._instances || {};
/**
* 释放对象所持有的资源,主要是自定义事件。
@@ -36,20 +36,35 @@ window[baidu.guid]._instances = window[baidu.guid]._instances || {};
* TODO: 将_listeners中绑定的事件剔除掉
*/
baidu.lang.Class.prototype.dispose = function(){
delete window[baidu.guid]._instances[this.guid];
delete baidu.$$._instances[this.guid];
// this.__listeners && (for (var i in this.__listeners) delete this.__listeners[i]);
for(var property in this){
if (!baidu.lang.isFunction(this[property])) {
delete this[property];
}
typeof this[property] != "function" && delete this[property];
}
this.disposed = true; // 20100716
};
/**
* 重载了默认的toString方法,使得返回信息更加准确一些。
* 20111219 meizz 为支持老版本的className属性,以后统一改成 __type
* @return {string} 对象的String表示形式
*/
baidu.lang.Class.prototype.toString = function(){
return "[object " + (this._className || "Object" ) + "]";
return "[object " + (this.__type || this._className || "Object") + "]";
};
/**
* 按唯一标识guid字符串取得实例对象
*
* @param {String} guid
* @return {object} 实例对象
*/
window["baiduInstance"] = function(guid) {
return baidu.$$._instances[guid];
}
// 2011.11.23 meizz 添加 baiduInstance 这个全局方法,可以快速地通过guid得到实例对象
// 2011.11.22 meizz 废除创建类时指定guid的模式,guid只作为只读属性
// 2011.11.22 meizz 废除 baidu.lang._instances 模块,由统一的global机制完成;
View
@@ -3,17 +3,15 @@
* Copyright 2009 Baidu Inc. All rights reserved.
*
* path: baidu/lang/Event.js
* author: meizz, erik, berg, linlingyu
* version: 1.1.1
* author: meizz, erik, berg
* version: 1.6.0
* date: 2009/11/24
* modify: 2010/04/19 berg
* modify: 2011/11/24 meizz
*/
///import baidu.lang.Class;
///import baidu.lang.guid;
///import baidu.lang.isFunction;
///import baidu.lang.isString;
///import baidu.lang.isObject;
/**
* 自定义的事件对象。
@@ -33,85 +31,20 @@ baidu.lang.Event = function (type, target) {
this.target = target || null;
this.currentTarget = null;
};
/**
* 注册对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。
* @grammar obj.addEventListener(type, handler[, key])
* @param {string} type 自定义事件的名称
* @param {Function} handler 自定义事件被触发时应该调用的回调函数
* @param {string} [key] 为事件监听函数指定的名称,可在移除时使用。如果不提供,方法会默认为它生成一个全局唯一的key。
* @remark 事件类型区分大小写。如果自定义事件名称不是以小写"on"开头,该方法会给它加上"on"再进行判断,即"click"和"onclick"会被认为是同一种事件。
*/
baidu.lang.Class.prototype.addEventListener = function (type, handler, key) {
if (!baidu.lang.isFunction(handler)) {
return;
}
!this.__listeners && (this.__listeners = {});
var t = this.__listeners, id;
if (typeof key == "string" && key) {
if (/[^\w\-]/.test(key)) {
throw("nonstandard key:" + key);
} else {
id = key;
}
}
type.indexOf("on") != 0 && (type = "on" + type);
typeof t[type] != "object" && (t[type] = {});
id = id || baidu.lang.guid();
!handler.hashCode && (handler.hashCode = {});
!handler.hashCode[type] && (handler.hashCode[type] = {});
handler.hashCode[type][id] = 1;
t[type][id] = handler;
};
/**
* 移除对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。
* @grammar obj.removeEventListener(type, handler)
* @param {string} type 事件类型
* @param {Function|string} handler 要移除的事件监听函数或者监听函数的key
* @remark 如果第二个参数handler没有被绑定到对应的自定义事件中,什么也不做。
*/
baidu.lang.Class.prototype.removeEventListener = function (type, handler) {
type.indexOf('on') != 0 && (type = 'on' + type);
!this.__listeners && (this.__listeners = {});
var t = this.__listeners, key, hashMap;
if(handler){
if(baidu.lang.isString(handler) && t.hasOwnProperty(type)){
key = handler;
handler = t[type][handler];
}
if(!baidu.lang.isFunction(handler)){
return;
}
}
if(!t[type] || (handler && !handler.hashCode)){return;}
if(key){
delete handler.hashCode[type][key];
delete t[type][key];
}else{
hashMap = handler ? handler.hashCode[type] : t[type];
for(guid in hashMap){
if(t[type][guid]){
delete t[type][guid].hashCode[type][guid];//delete handler hashCode
delete t[type][guid];//delete __listeners
}
}
}
};
/**
* 派发自定义事件,使得绑定到自定义事件上面的函数都会被执行。引入baiu.lang.Event后,Class的子类实例才会获得该方法。
* 派发自定义事件,使得绑定到自定义事件上面的函数都会被执行。引入baidu.lang.Event后,Class的子类实例才会获得该方法。
* @grammar obj.dispatchEvent(event, options)
* @param {baidu.lang.Event|String} event Event对象,或事件名称(1.1.1起支持)
* @param {Object} options 扩展参数,所含属性键值会扩展到Event对象上(1.2起支持)
* @remark 处理会调用通过addEventListenr绑定的自定义事件回调函数之外,还会调用直接绑定到对象上面的自定义事件。例如:<br>
myobj.onMyEvent = function(){}<br>
myobj.addEventListener("onMyEvent", function(){});
*/
baidu.lang.Class.prototype.fire =
baidu.lang.Class.prototype.dispatchEvent = function (event, options) {
if (baidu.lang.isString(event)) {
event = new baidu.lang.Event(event);
}
baidu.lang.isString(event) && (event = new baidu.lang.Event(event));
!this.__listeners && (this.__listeners = {});
// 20100603 添加本方法的第二个参数,将 options extend到event中去传递
@@ -120,18 +53,58 @@ baidu.lang.Class.prototype.dispatchEvent = function (event, options) {
event[i] = options[i];
}
var i, t = this.__listeners, p = event.type;
event.target = event.target || this;
event.currentTarget = this;
var i, n, me = this, t = me.__listeners, p = event.type;
event.target = event.target || (event.currentTarget = me);
p.indexOf("on") != 0 && (p = "on" + p);
// 支持非 on 开头的事件名
p.indexOf("on") && (p = "on" + p);
baidu.lang.isFunction(this[p]) && this[p].apply(this, arguments);
typeof me[p] == "function" && me[p].apply(me, arguments);
if (typeof t[p] == "object") {
for (i in t[p]) {
t[p][i].apply(this, arguments);
for (i=0, n=t[p].length; i<n; i++) {
t[p][i] && t[p][i].apply(me, arguments);
}
}
return event.returnValue;
};
/**
* 注册对象的事件监听器。引入baidu.lang.Event后,Class的子类实例才会获得该方法。
* @grammar obj.addEventListener(type, handler[, key])
* @param {string} type 自定义事件的名称
* @param {Function} handler 自定义事件被触发时应该调用的回调函数
* @return {Function} 将用户注入的监听函数返回,以便移除事件监听,特别适用于匿名函数。
* @remark 事件类型区分大小写。如果自定义事件名称不是以小写"on"开头,该方法会给它加上"on"再进行判断,即"click"和"onclick"会被认为是同一种事件。
*/
baidu.lang.Class.prototype.on =
baidu.lang.Class.prototype.addEventListener = function (type, handler, key) {
if (typeof handler != "function") {
return;
}
!this.__listeners && (this.__listeners = {});
var i, t = this.__listeners;
type.indexOf("on") && (type = "on" + type);
typeof t[type] != "object" && (t[type] = []);
// 避免函数重复注册
for (i = t[type].length - 1; i >= 0; i--) {
if (t[type][i] === handler) return handler;
};
t[type].push(handler);
// [TODO delete 2013] 2011.12.19 兼容老版本,2013删除此行
key && typeof key == "string" && (t[type][key] = handler);
return handler;
};
// 2011.12.19 meizz 很悲剧,第三个参数 key 还需要支持一段时间,以兼容老版本脚本
// 2011.11.24 meizz 事件添加监听方法 addEventListener 移除第三个参数 key,添加返回值 handler
// 2011.11.23 meizz 事件handler的存储对象由json改成array,以保证注册函数的执行顺序
// 2011.11.22 meizz 将 removeEventListener 方法分拆到 baidu.lang.Class.removeEventListener 中,以节约主程序代码
@@ -18,3 +18,5 @@
*/
window[baidu.guid]._instances = window[baidu.guid]._instances || {};
// [TODO] meizz 在2012年版本中将删除此模块
@@ -4,7 +4,8 @@
*
* @author: meizz
* @namespace: baidu.lang.createClass
* @version: 2010-05-13
* @version: 1.6.0
* @modify: 2011.11.24 meizz
*/
///import baidu.lang;
@@ -19,7 +20,7 @@
* @param {Function} constructor 类的构造器函数
* @param {Object} [options]
* @config {string} [className] 类名
* @config {string} [type] 类名
* @config {Function} [superClass] 父类,默认为baidu.lang.Class
* @version 1.2
* @remark
@@ -37,15 +38,25 @@ baidu.lang.createClass = /**@function*/function(constructor, options) {
// 创建新类的真构造器函数
var fn = function(){
var me = this;
// 20101030 某类在添加该属性控制时,guid将不在全局instances里控制
options.decontrolled && (me.__decontrolled = true);
// 继承父类的构造器
if(superClass != baidu.lang.Class){
superClass.apply(this, arguments);
}else{
superClass.call(this);
superClass.apply(me, arguments);
// 全局配置
for (i in fn.options) me[i] = fn.options[i];
constructor.apply(me, arguments);
for (var i=0, reg=fn["\x06r"]; reg && i<reg.length; i++) {
reg[i].apply(me, arguments);
}
constructor.apply(this, arguments);
};
// [TODO delete 2013] 放置全局配置,这个全局配置可以直接写到类里面
fn.options = options.options || {};
var C = function(){},
@@ -58,7 +69,9 @@ baidu.lang.createClass = /**@function*/function(constructor, options) {
// 继承传参进来的构造器的 prototype 不会丢
for (var i in cp) fp[i] = cp[i];
typeof options.className == "string" && (fp._className = options.className);
// 20111122 原className参数改名为type
var type = options.className || options.type;
typeof type == "string" && (fp.__type = type);
// 修正这种继承方式带来的 constructor 混乱的问题
fp.constructor = cp.constructor;
@@ -73,3 +86,5 @@ baidu.lang.createClass = /**@function*/function(constructor, options) {
return fn;
};
// 20111221 meizz 修改插件函数的存放地,重新放回类构造器静态属性上
Oops, something went wrong.

0 comments on commit e8b3cc9

Please sign in to comment.