if
( win ) {
win.scrollTo(
!top ? val : $( win ).scrollLeft(),
top ? val : $( win ).scrollTop()
);
}
else
{
this
[ method ] = val;
}
});
};
});
var
pseudoAdapter = window.VBArray && $.query && $.query.pseudoAdapter
if
(pseudoAdapter){
pseudoAdapter.hidden =
function
( el ) {
return
el.type ===
"hidden"
|| $.css( el,
"display"
) ===
"none"
;
}
}
function
getWindow( node ) {
return
$.type(node,
"Window"
) ? node : node.nodeType === 9 ? node.defaultView || node.parentWindow :
false
;
} ;
});
|
css模块依赖于node模块的cssName与cssMap,它们是框架支持CSS3新样式的关键。
css_fix模块源码(它是用于对旧式IE的支持——IE6-8)
//=========================================
// 样式补丁模块
//==========================================
define(
"css_fix"
, !!top.getComputedStyle,
function
(){
$.log(
"已加载css_fix模块"
);
var
adapter = $.cssAdapter = {},
ie8 = !!top.XDomainRequest,
rfilters = /[\w\:\.]+\([^)]+\)/g,
salpha =
"DXImageTransform.Microsoft.Alpha"
,
rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
rposition = /^(top|right|bottom|left)$/,
border = {
thin: ie8 ?
'1px'
:
'2px'
,
medium: ie8 ?
'3px'
:
'4px'
,
thick: ie8 ?
'5px'
:
'6px'
};
adapter[
"_default:get"
] =
function
(node, name){
//取得精确值,不过它有可能是带em,pc,mm,pt,%等单位
var
ret = node.currentStyle[name];
if
(( rnumnonpx.test(ret) && !rposition.test(ret))) {
//①,保存原有的style.left, runtimeStyle.left,
var
style = node.style, left = style.left,
rsLeft = node.runtimeStyle.left ;
//②由于③处的style.left = xxx会影响到currentStyle.left,
//因此把它currentStyle.left放到runtimeStyle.left,
//runtimeStyle.left拥有最高优先级,不会style.left影响
node.runtimeStyle.left = node.currentStyle.left;
//③将精确值赋给到style.left,然后通过IE的另一个私有属性 style.pixelLeft
//得到单位为px的结果;fontSize的分支见http://bugs.jquery.com/ticket/760
style.left = name ===
'fontSize'
?
'1em'
: (ret || 0);
ret = style.pixelLeft +
"px"
;
//④还原 style.left,runtimeStyle.left
style.left = left;
node.runtimeStyle.left = rsLeft;
}
if
( ret ==
"medium"
){
name = name.replace(
"Width"
,
"Style"
);
//border width 默认值为medium,即使其为0"
if
(arguments.callee(node,name) == "none
"){
ret = "
0px
";
}
}
//处理auto值
if(rposition.test(name) && ret === "
auto
"){
ret = "
0px
";
}
return ret === "
" ? "
auto
" : border[ret] || ret;
}
//========================= 处理 opacity =========================
adapter[ "
opacity:get
" ] = function( node ){
//这是最快的获取IE透明值的方式,不需要动用正则了!
var alpha = node.filters.alpha || node.filters[salpha],
op = alpha ? alpha.opacity: 100;
return ( op /100 )+"
";//确保返回的是字符串
}
adapter[ "
opacity:set
" ] = function( node, name, value ){
var currentStyle = node.currentStyle, style = node.style;
if(isFinite(value)){//"
xxx
" * 100 = NaN
return
}
value = (value > 0.999) ? 100: (value < 0.001) ? 0 : value * 100;
if(!currentStyle.hasLayout)
style.zoom = 1;//让元素获得hasLayout
var filter = currentStyle.filter || style.filter || "
";
//IE78的透明滤镜当其值为100时会让文本模糊不清
if(value == 100 ){ //IE78的透明滤镜当其值为100时会让文本模糊不清
// var str = "
filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100) Chroma(Color=
'#FFFFFF'
)
"+
// "
progid:DXImageTransform.Microsoft.Matrix(sizingMethod=
'auto expand'
,
"+
// "
M11=1.5320888862379554, M12=-1.2855752193730787, M21=1.2855752193730796, M22=1.5320888862379558)
";
value = style.filter = filter.replace(rfilters, function(a){
return /alpha/i.test(a) ? "
" : a;//可能存在多个滤镜,只清掉透明部分
});
//如果只有一个透明滤镜 就直接去掉
if(value.trim() == "
" && style.removeAttribute){
style.removeAttribute( "
filter
" );
}
return;
}
//如果已经设置过透明滤镜可以使用以下便捷方式
var alpha = node.filters.alpha || node.filters[salpha];
if( alpha ){
alpha.opacity = value ;
}else{
style.filter += (filter ? "
,
" : "
")+ "
alpha(opacity=
"+ value +"
)
";
}
}
//========================= 处理 user-select =========================
//auto——默认值,用户可以选中元素中的内容
//none——用户不能选择元素中的任何内容
//text——用户可以选择元素中的文本
//element——文本可选,但仅限元素的边界内(只有IE和FF支持)
//all——在编辑器内,如果双击/上下文点击发生在子元素上,改值的最高级祖先元素将被选中。
//-moz-none——firefox私有,元素和子元素的文本将不可选,但是,子元素可以通过text重设回可选。
adapter[ "
userSelect:set
" ] = function( node, name, value ) {
var allow = /none/.test(value) ? "
on
" : "
",
e, i = 0, els = node.getElementsByTagName('*');
node.setAttribute('unselectable', allow);
while (( e = els[ i++ ] )) {
switch (e.tagName.toLowerCase()) {
case 'iframe' :
case 'textarea' :
case 'input' :
case 'select' :
break;
default :
e.setAttribute('unselectable', allow);
}
}
};
//========================= 处理 background-position =========================
adapter[ "
backgroundPosition:get
" ] = function( node, name, value ) {
var style = node.currentStyle;
return style.backgroundPositionX +"
"+style.backgroundPositionX
};
});
|
做个小广告:
mass Framework是一个模块化的jQuery式框架,拥有jQuery 90%的常用方法,在语言处理,类,特效等方面都做了大量增强,是面向大规模开发的框架。现在jQuery也在做瘦身,把许多不常用的方法废弃掉,这样一来,大家在DOM处理上的API基本一致。mass Framework预计在年底完成升级,完成自己的MVVM框架与一个支持IE6的bootstrap式UI库。