Permalink
Browse files

update part of the code for version 1.6.0

1 parent 7d2714c commit e8b3cc9128b3eebf8a15957dabdf2463706c832b @ChineseDron ChineseDron committed Jan 3, 2012
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
*/
@@ -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机制完成;
@@ -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.