Javascript YUI 讀碼日記之 YAHOO.util.Dom - Part.3
更新時(shí)間:2008年03月22日 14:42:16 作者:
在 YAHOO.util.Dom 中能發(fā)現(xiàn)很多有趣的東西。下面先說下 toCamel 的函數(shù),感謝 小馬 幫助我理解了這個(gè)函數(shù)。toCamel 把指定名稱替換為駝峰寫法,比如把 border-width 替換為 borderWidth 。
var patterns = {
HYPHEN: /(-[a-z])/i,
ROOT_TAG: /^body|html$/i
};
var toCamel = function(property) {
// 如果沒有 -[a-z] 字母,則直接返回
if ( !patterns.HYPHEN.test(property) ) {
return property;
}
// 如果有緩存,直接返回替換后的值
if (propertyCache[property]) {
return propertyCache[property];
}
// 使用正則替換
var converted = property;
while( patterns.HYPHEN.exec(converted) ) {
converted = converted.replace(RegExp.$1,
RegExp.$1.substr(1).toUpperCase());
}
// 存入緩存
propertyCache[property] = converted;
return converted;
};在 YAHOO.util.Dom 中,getStyle 函數(shù)考慮了更多不同瀏覽器兼容性方面的問題,代碼如下
// 使用 W3C DOM 標(biāo)準(zhǔn)的瀏覽器,比如 Firefox、Opera、Safari
if (document.defaultView && document.defaultView.getComputedStyle) {
getStyle = function(el, property) {
var value = null;
// 重命名部分 CSS 樣式名
if (property == 'float') {
property = 'cssFloat';
}
// 獲取通過 CSS 加上去的屬性
var computed = document.defaultView.getComputedStyle(el, '');
if (computed) {
value = computed[toCamel(property)];
}
return el.style[property] || value;
};
// 如果是 IE 瀏覽器
} else if (document.documentElement.currentStyle && isIE) {
getStyle = function(el, property) {
switch( toCamel(property) ) {
// “轉(zhuǎn)換”名稱為 IE 可以認(rèn)識(shí)的
case 'opacity' :
var val = 100;
try {
val =
el.filters['DXImageTransform.Microsoft.Alpha'].opacity;
} catch(e) {
try {
val = el.filters('alpha').opacity;
} catch(e) {
}
}
// 百分比
return val / 100;
case 'float':
property = 'styleFloat';
default:
var value = el.currentStyle ? el.currentStyle[property] : null;
return ( el.style[property] || value );
}
};
} else {
// 獲取內(nèi)聯(lián)樣式
getStyle = function(el, property) { return el.style[property]; };
}另外,PPK 在他的 Blog 上的有關(guān) getStyle 的闡述,也很精彩,有興趣的可以去看下。
HYPHEN: /(-[a-z])/i,
ROOT_TAG: /^body|html$/i
};
var toCamel = function(property) {
// 如果沒有 -[a-z] 字母,則直接返回
if ( !patterns.HYPHEN.test(property) ) {
return property;
}
// 如果有緩存,直接返回替換后的值
if (propertyCache[property]) {
return propertyCache[property];
}
// 使用正則替換
var converted = property;
while( patterns.HYPHEN.exec(converted) ) {
converted = converted.replace(RegExp.$1,
RegExp.$1.substr(1).toUpperCase());
}
// 存入緩存
propertyCache[property] = converted;
return converted;
};在 YAHOO.util.Dom 中,getStyle 函數(shù)考慮了更多不同瀏覽器兼容性方面的問題,代碼如下
// 使用 W3C DOM 標(biāo)準(zhǔn)的瀏覽器,比如 Firefox、Opera、Safari
if (document.defaultView && document.defaultView.getComputedStyle) {
getStyle = function(el, property) {
var value = null;
// 重命名部分 CSS 樣式名
if (property == 'float') {
property = 'cssFloat';
}
// 獲取通過 CSS 加上去的屬性
var computed = document.defaultView.getComputedStyle(el, '');
if (computed) {
value = computed[toCamel(property)];
}
return el.style[property] || value;
};
// 如果是 IE 瀏覽器
} else if (document.documentElement.currentStyle && isIE) {
getStyle = function(el, property) {
switch( toCamel(property) ) {
// “轉(zhuǎn)換”名稱為 IE 可以認(rèn)識(shí)的
case 'opacity' :
var val = 100;
try {
val =
el.filters['DXImageTransform.Microsoft.Alpha'].opacity;
} catch(e) {
try {
val = el.filters('alpha').opacity;
} catch(e) {
}
}
// 百分比
return val / 100;
case 'float':
property = 'styleFloat';
default:
var value = el.currentStyle ? el.currentStyle[property] : null;
return ( el.style[property] || value );
}
};
} else {
// 獲取內(nèi)聯(lián)樣式
getStyle = function(el, property) { return el.style[property]; };
}另外,PPK 在他的 Blog 上的有關(guān) getStyle 的闡述,也很精彩,有興趣的可以去看下。
相關(guān)文章
javascript YUI 讀碼日記之 YAHOO.util.Dom - Part.4
YAHOO.util.Dom 中的 getXY 函數(shù)讓開發(fā)者充分體驗(yàn)到不同瀏覽器的 Hack 的樂趣。IE8 即將破殼而出,但愿下面的函數(shù)不會(huì)又多個(gè) if 判斷。getXY 函數(shù)使用 匿名函數(shù)執(zhí)行返回 函數(shù)(聽起來有點(diǎn)拗口,可以參考 圓心 Blog 上的一篇文章)。2008-03-03Ext第一周 史上最強(qiáng)學(xué)習(xí)筆記---GridPanel(基礎(chǔ)篇)
我不想教各位新手什么高級(jí)技術(shù),因?yàn)槲乙苍谘芯?,只是想教大家一個(gè)思考的方向,能夠具有舉一反三的能力,能夠真正學(xué)會(huì)Ext和開始深入了解。2008-12-12學(xué)習(xí)YUI.Ext第五日--做拖放Darg&Drop
學(xué)習(xí)YUI.Ext第五日--做拖放Darg&Drop...2007-03-03學(xué)習(xí)YUI.Ext 第六天--關(guān)于樹TreePanel(Part 2異步獲取節(jié)點(diǎn))
學(xué)習(xí)YUI.Ext 第六天--關(guān)于樹TreePanel(Part 2異步獲取節(jié)點(diǎn))...2007-03-03Ext.FormPanel 提交和 Ext.Ajax.request 異步提交函數(shù)的區(qū)別
Ext.FormPanel 提交和 Ext.Ajax.request 異步提交函數(shù)的區(qū)別小結(jié),需要的朋友可以參考下。2009-11-11使用EXT實(shí)現(xiàn)無刷新動(dòng)態(tài)調(diào)用股票信息
最近開始對(duì)ExtJS感興趣了,今天正好有空,花了點(diǎn)時(shí)間,寫了個(gè)基于Ext的例子。2008-11-11