原帖地址:http://space.flash8.net/space/?18713/viewspace-403152.html
原作者:我佛山人
//
用于特殊属性的setter和getter
Element.Properties = new Hash;
/*
style的getter和setter
可以使用element.set('style', value)来设置值
*/
Element.Properties.style = {
set: function (style) {
this .style.cssText = style;
},
get: function () {
return this .style.cssText;
},
erase: function () {
this .style.cssText = '' ;
}
};
/*
标签名的getter,注意没有setter,所以是只读属性,如:
element.get('tag');
*/
Element.Properties.tag = {get: function () {
return this .tagName.toLowerCase();
}};
/*
A的href的getter
虽然没有setter,但不代表是只读
因为是属性,所以可以直接 element.set('href', value)
之所以单独写,是因为默认取href属性值返回的是浏览器根据路径规则解释过的绝对地址
而我们通常要的是属性原值
*/
Element.Properties.href = {get: function () {
return ( ! this .href) ? null : this .href.replace( new RegExp( ' ^ ' + document.location.protocol + ' \/\/ ' + document.location.host), '' );
}};
// innerHTML的快捷方式,支持可变参数,能避免长串的字符串连接
Element.Properties.html = {set: function () {
return this .innerHTML = Array.flatten(arguments).join( '' );
}};
// 为Element、Window和Document添加扩展实现
Native.implement([Element, Window, Document], {
// 添加事件监听
addListener: function (type, fn) {
if ( this .addEventListener) this .addEventListener(type, fn, false );
else this .attachEvent( ' on ' + type, fn);
return this ;
},
// 移除事件监听
removeListener: function (type, fn) {
if ( this .removeEventListener) this .removeEventListener(type, fn, false );
else this .detachEvent( ' on ' + type, fn);
return this ;
},
// 获取已保存的临时对象实例,如果对象不存在,将引用指向dflt(如果提供此参数)
retrieve: function (property, dflt) {
var storage = Element.Storage.get( this .uid);
var prop = storage[property];
if ($defined(dflt) && ! $defined(prop)) prop = storage[property] = dflt;
return $pick(prop);
},
// 保存临时对象
store: function (property, value) {
var storage = Element.Storage.get( this .uid);
storage[property] = value;
return this ;
},
// 删除临时对象
eliminate: function (property) {
var storage = Element.Storage.get( this .uid);
delete storage[property];
return this ;
}
});
// Element的几类属性,只是素材的准备,下面就地执行的匿名函数会进行加工处理,以方便别处的调用
Element.Attributes = new Hash({
Props: { ' html ' : ' innerHTML ' , ' class ' : ' className ' , ' for ' : ' htmlFor ' , ' text ' : (Browser.Engine.trident) ? ' innerText ' : ' textContent ' },
Bools: [ ' compact ' , ' nowrap ' , ' ismap ' , ' declare ' , ' noshade ' , ' checked ' , ' disabled ' , ' readonly ' , ' multiple ' , ' selected ' , ' noresize ' , ' defer ' ],
Camels: [ ' value ' , ' accessKey ' , ' cellPadding ' , ' cellSpacing ' , ' colSpan ' , ' frameBorder ' , ' maxLength ' , ' readOnly ' , ' rowSpan ' , ' tabIndex ' , ' useMap ' ]
});
// 对Element的加工处理
( function (EA) {
var EAB = EA.Bools, EAC = EA.Camels;
// 将Bools转成Props的格式
EA.Bools = EAB = EAB.associate(EAB);
// 将Camels转成Props的格式,合并到Props
Hash.extend(Hash.combine(EA.Props, EAB), EAC.associate(EAC.map( function (v) {
return v.toLowerCase();
})));
// 删除Camels属性
EA.erase( ' Camels ' );
})(Element.Attributes);
Element.Properties = new Hash;
/*
style的getter和setter
可以使用element.set('style', value)来设置值
*/
Element.Properties.style = {
set: function (style) {
this .style.cssText = style;
},
get: function () {
return this .style.cssText;
},
erase: function () {
this .style.cssText = '' ;
}
};
/*
标签名的getter,注意没有setter,所以是只读属性,如:
element.get('tag');
*/
Element.Properties.tag = {get: function () {
return this .tagName.toLowerCase();
}};
/*
A的href的getter
虽然没有setter,但不代表是只读
因为是属性,所以可以直接 element.set('href', value)
之所以单独写,是因为默认取href属性值返回的是浏览器根据路径规则解释过的绝对地址
而我们通常要的是属性原值
*/
Element.Properties.href = {get: function () {
return ( ! this .href) ? null : this .href.replace( new RegExp( ' ^ ' + document.location.protocol + ' \/\/ ' + document.location.host), '' );
}};
// innerHTML的快捷方式,支持可变参数,能避免长串的字符串连接
Element.Properties.html = {set: function () {
return this .innerHTML = Array.flatten(arguments).join( '' );
}};
// 为Element、Window和Document添加扩展实现
Native.implement([Element, Window, Document], {
// 添加事件监听
addListener: function (type, fn) {
if ( this .addEventListener) this .addEventListener(type, fn, false );
else this .attachEvent( ' on ' + type, fn);
return this ;
},
// 移除事件监听
removeListener: function (type, fn) {
if ( this .removeEventListener) this .removeEventListener(type, fn, false );
else this .detachEvent( ' on ' + type, fn);
return this ;
},
// 获取已保存的临时对象实例,如果对象不存在,将引用指向dflt(如果提供此参数)
retrieve: function (property, dflt) {
var storage = Element.Storage.get( this .uid);
var prop = storage[property];
if ($defined(dflt) && ! $defined(prop)) prop = storage[property] = dflt;
return $pick(prop);
},
// 保存临时对象
store: function (property, value) {
var storage = Element.Storage.get( this .uid);
storage[property] = value;
return this ;
},
// 删除临时对象
eliminate: function (property) {
var storage = Element.Storage.get( this .uid);
delete storage[property];
return this ;
}
});
// Element的几类属性,只是素材的准备,下面就地执行的匿名函数会进行加工处理,以方便别处的调用
Element.Attributes = new Hash({
Props: { ' html ' : ' innerHTML ' , ' class ' : ' className ' , ' for ' : ' htmlFor ' , ' text ' : (Browser.Engine.trident) ? ' innerText ' : ' textContent ' },
Bools: [ ' compact ' , ' nowrap ' , ' ismap ' , ' declare ' , ' noshade ' , ' checked ' , ' disabled ' , ' readonly ' , ' multiple ' , ' selected ' , ' noresize ' , ' defer ' ],
Camels: [ ' value ' , ' accessKey ' , ' cellPadding ' , ' cellSpacing ' , ' colSpan ' , ' frameBorder ' , ' maxLength ' , ' readOnly ' , ' rowSpan ' , ' tabIndex ' , ' useMap ' ]
});
// 对Element的加工处理
( function (EA) {
var EAB = EA.Bools, EAC = EA.Camels;
// 将Bools转成Props的格式
EA.Bools = EAB = EAB.associate(EAB);
// 将Camels转成Props的格式,合并到Props
Hash.extend(Hash.combine(EA.Props, EAB), EAC.associate(EAC.map( function (v) {
return v.toLowerCase();
})));
// 删除Camels属性
EA.erase( ' Camels ' );
})(Element.Attributes);