• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
works guo

成功的渴望与生俱来---- 成功是获得赞美与尊重的最有效的途径
博客园    首页    新随笔    联系   管理    订阅  订阅

getElementByID是怎样转换成$get()/$()

(1)Sys.UI.DomElment类及$get() (2)关于Script#中的$()

 

 不好意思今天才回你,因为前两天有一个重要的考试,先多谢谢关注!
 (1)ASP.Net AJAX的客户端框架一系列的对DOM对象的维护和操作,基本内容实现就在DomElement类中,其实DomElement类基本是独立的,就像组件样,他主要是可以放开发者无须编写复杂的组件可以容易的与DOM元素交互.
 DomElement类方法如下:

 Sys.UI.DomElement.getElementByID(id,element)
在element元素的子节点中通过id属性找到并创建相应Sys.UI.DomElement类,如不指定element参数,则默认从文档的根接点document开始搜索.
 
Sys.UI.DomElement.addCssClass(element,className)
为element元素添加名为className的CSS Class
 
Sys.UI.DomElement.removeCssClass(element,className)
判断 element元素中是否已经应用了名为className的CSS Class
 
Sys.UI.DomElement.toggleCssClass(element,className)
在element元素已经应用辽国名为className的CSS Class,则竟其移除,否则添加.
 
Sys.UI.DomElment.getBounds(element)
获取element元素的边界信息,返回值被封装成一个JSON对象,包括水平位置(X),垂直位置(Y),高度(height)和宽度(width)
 
Sys.UI.DomElment.getLocation(element)
获取element元素的位置信息,返回值被封装成一个JSON对象包括水平位置(X),垂直位置(Y)
 
Sys.UI.DomElment.setLocation(element,x,y)
设定element元素的位置信息,X表示水平位置,y表示垂直位置.

 (2)Sys.UI.DomElment类及$get()

本类的具体实现code:

  1//Sys.UI.DomElement Class implemented 
  2Sys.UI.DomElement.registerClass("Sys.UI.DomElement");
  3
  4//Sys.UI.DomElement.addCssClass method
  5Sys.UI.DomElement.addCssClass=function(a,b)
  6{
  7    if(!Sys.UI.DomElement.containsCssClass(a,b))
  8    if(a.className==="")
  9        a.className=b;else a.className+=" "+b}
;
 10
 11//Sys.UI.DomElement.containsCssClass method
 12Sys.UI.DomElement.containsCssClass=function(b,a)
 13{return Array.contains(b.className.split(" "),a)};
 14
 15//Sys.UI.DomElement.getBounds method
 16Sys.UI.DomElement.getBounds=function(a)
 17{
 18    var b=Sys.UI.DomElement.getLocation(a);
 19    return new Sys.UI.Bounds(b.x,b.y,a.offsetWidth||0,a.offsetHeight||0)
 20    
 21}
;
 22
 23//Sys.UI.DomElement.getElementById method
 24var $get=Sys.UI.DomElement.getElementById=function(f,e)
 25{
 26    if(!e)
 27    return document.getElementById(f);
 28    if(e.getElementById)return e.getElementById(f);
 29    var c=[],d=e.childNodes;
 30    for(var b=0;b<d.length;b++){var a=d[b];
 31    if(a.nodeType==1)c[c.length]=a}

 32    while(c.length)
 33    {a=c.shift();
 34    if(a.id==f)
 35    return a;d=a.childNodes;
 36    for(b=0;b<d.length;b++)
 37    {a=d[b];
 38    if(a.nodeType==1)
 39    c[c.length]=a}
}

 40    return null
 41}
;
 42//Sys.UI.DomElement method(对于不同浏览器的实现)
 43switch(Sys.Browser.agent)
 44{
 45case Sys.Browser.InternetExplorer:Sys.UI.DomElement.getLocation=function Sys$UI$DomElement$getLocation(a)
 46{
 47    if(a.self||a.nodeType===9)
 48        return new Sys.UI.Point(0,0);
 49        var d=a.getClientRects();
 50    if(!d||!d.length)
 51        return new Sys.UI.Point(0,0);
 52        var e=a.ownerDocument.parentWindow,g=e.screenLeft-top.screenLeft-top.document.documentElement.scrollLeft+2, h=e.screenTop-top.screenTop-top.document.documentElement.scrollTop+2, c=e.frameElement||null;
 53    if(c){
 54        var b=c.currentStyle;
 55        g+=(c.frameBorder||1)*2+(parseInt(b.paddingLeft)||0)+(parseInt(b.borderLeftWidth)||0)-a.ownerDocument.documentElement.scrollLeft;
 56        h+=(c.frameBorder||1)*2+(parseInt(b.paddingTop)||0)+(parseInt(b.borderTopWidth)||0)-a.ownerDocument.documentElement.scrollTop}

 57        var f=d[0];
 58        return new Sys.UI.Point(f.left-g,f.top-h)}
;
 59break;
 60
 61case Sys.Browser.Safari:Sys.UI.DomElement.getLocation=function(c)
 62{
 63    if(c.window&&c.window===c||c.nodeType===9)
 64        return new Sys.UI.Point(0,0);
 65        var g=0,h=0,j=null,f=null,b;
 66        for(var a=c;a;j=a,(f=b,a=a.offsetParent))
 67        {
 68            b=Sys.UI.DomElement._getCurrentStyle(a);
 69            var e=a.tagName;
 70            if((a.offsetLeft||a.offsetTop)&&(e!=="BODY"||(!f||f.position!=="absolute")))
 71            {g+=a.offsetLeft;h+=a.offsetTop}
 72        }

 73        b=Sys.UI.DomElement._getCurrentStyle(c);
 74        var d=b?b.position:null,k=d&&d!=="static";
 75    if(!d||d!=="absolute")
 76    for(var a=c.parentNode;a;a=a.parentNode)
 77    {
 78        e=a.tagName;
 79        if(e!=="BODY"&&e!=="HTML"&&(a.scrollLeft||a.scrollTop))
 80        {g-=a.scrollLeft||0;h-=a.scrollTop||0}
 81        b=Sys.UI.DomElement._getCurrentStyle(a);
 82        var i=b?b.position:null;
 83        if(i&&i==="absolute")
 84        break
 85    }

 86    return new Sys.UI.Point(g,h)}
;
 87break;
 88case Sys.Browser.Opera:Sys.UI.DomElement.getLocation=function(b)
 89{
 90    if(b.window&&b.window===b||b.nodeType===9)
 91        return new Sys.UI.Point(0,0);
 92        var d=0,e=0,i=null;
 93        for(var a=b;a;i=a,a=a.offsetParent)
 94        {
 95            var f=a.tagName;d+=a.offsetLeft||0;e+=a.offsetTop||0}

 96            var g=b.style.position,c=g&&g!=="static";
 97            for(var a=b.parentNode;a;a=a.parentNode)
 98            {    
 99                f=a.tagName;
100                if(f!=="BODY"&&f!=="HTML"&&(a.scrollLeft||a.scrollTop)&&(c&&(a.style.overflow==="scroll"||a.style.overflow==="auto")))
101                {d-=a.scrollLeft||0;e-=a.scrollTop||0}
102                var h=a&&a.style?a.style.position:null;c=c||h&&h!=="static"}

103                return new Sys.UI.Point(d,e)}
;
104break;
105default:Sys.UI.DomElement.getLocation=function(d)
106{
107    if(d.window&&d.window===d||d.nodeType===9)
108        return new Sys.UI.Point(0,0);
109        var e=0,f=0,i=null,h=null,b=null;
110        for(var a=d;a;i=a,(h=b,a=a.offsetParent))
111        {
112            var c=a.tagName;b=Sys.UI.DomElement._getCurrentStyle(a);
113            if((a.offsetLeft||a.offsetTop)&&!(c==="BODY"&&(!h||h.position!=="absolute")))
114                {e+=a.offsetLeft;f+=a.offsetTop}
115            if(i!==null&&b){if(c!=="TABLE"&&c!=="TD"&&c!=="HTML")
116                {e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0}
117            if(c==="TABLE"&&(b.position==="relative"||b.position==="absolute"))
118                {e+=parseInt(b.marginLeft)||0;f+=parseInt(b.marginTop)||0}}
}

119            b=Sys.UI.DomElement._getCurrentStyle(d);
120            var g=b?b.position:null,j=g&&g!=="static";
121            if(!g||g!=="absolute")
122                for(var a=d.parentNode;a;a=a.parentNode)
123                {
124                    c=a.tagName;
125                    if(c!=="BODY"&&c!=="HTML"&&(a.scrollLeft||a.scrollTop))
126                    {
127                        e-=a.scrollLeft||0;f-=a.scrollTop||0;b=Sys.UI.DomElement._getCurrentStyle(a);
128                        e+=parseInt(b.borderLeftWidth)||0;f+=parseInt(b.borderTopWidth)||0
129                    }

130                }

131                return new Sys.UI.Point(e,f)}
;
132break;
133}
;
134
135//Sys.UI.DomElement.removeCssClass method
136Sys.UI.DomElement.removeCssClass=function(d,c)
137{
138    var a=" "+d.className+" ",b=a.indexOf(" "+c+" ");
139    if(b>=0)d.className=(a.substr(0,b)+" "+a.substring(b+c.length+1,a.length)).trim()
140}
;
141
142//Sys.UI.DomElement.setLocation method
143Sys.UI.DomElement.setLocation=function(b,c,d)
144{
145    var a=b.style;a.position="absolute";
146    a.left=c+"px";a.top=d+"px"
147}
;
148
149//Sys.UI.DomElement.toggleCssClass method
150Sys.UI.DomElement.toggleCssClass=function(b,a)
151{
152    if(Sys.UI.DomElement.containsCssClass(b,a))
153        Sys.UI.DomElement.removeCssClass(b,a);
154    else Sys.UI.DomElement.addCssClass(b,a)
155}
;
156
157//Sys.UI.DomElement._getCurrentStyle method
158Sys.UI.DomElement._getCurrentStyle=function(a)
159{
160    var b=(a.ownerDocument?a.ownerDocument:a.documentElement).defaultView;
161    return b&&a!==b&&b.getComputedStyle?b.getComputedStyle(a,null):a.style
162}
;


 而$get()是code如下:
 

//Sys.UI.DomElement.getElementById method
var $get=Sys.UI.DomElement.getElementById=function(f,e)
{
 
if(!e)//从根节点开始搜索
 return document.getElementById(f);
 
//从指定节点开始搜索
 if(e.getElementById)return e.getElementById(f);
 
var c=[],d=e.childNodes;//获得后代集合
 for(var b=0;b<d.length;b++)
 
{ var a=d[b];
  
if(a.nodeType==1)//返回a所表示的节类型
  c[c.length]=a
 }

 
while(c.length)
 
{
  a
=c.shift();//删除原数组第一项,并返回删除元素的值
  if(a.id==f)
   
return a;d=a.childNodes;
  
for(b=0;b<d.length;b++)
  
{ a=d[b];
   
if(a.nodeType==1)
   c[c.length]
=a
  }

 }

 
return null
}
;

这样就是实现将document.getElementById()转成$get().接着再深入看一下,上面的代码是通过ScriptMananger引用到客户端浏览器上,让浏览器执行,所以在前端的.aspx网页上的时候,你查看代码时.你看不到js代码.(当然我想可能是通过render到客户端的).

$get()是Sys.UI.DomElement.getElementByID它的简写而Sys.UI.DomElement.getElementByID是对document.getElementById()的增强,值得注意的$get('是在client的id'),和这个在Sys.UI.Behavior类中的get_element()方法有不同的点,get_element()是可以用在只要使用ScriptMananger的页面上的任意Id,如果想在服务端怎样使用$get();只用向客户端注册脚本的方式.

//Sys.UI.Behavior.get_element() method
Sys.UI.Behavior=function(b)
{
Sys.UI.Behavior.initializeBase(
this);
this._element=b;var a=b._behaviors;
if(!a)b._behaviors=[this];
else a[a.length]=this}
;

get_element:
function()
{return this._element}

可以看出是直接返回的您传入的页面上对象的参数.

(3)关于Script#中的$()
而在Script#中是怎样实现的拉,这样实现的

//Script# $() method
function $(id)
{return document.getElementById(id);}

 

所以可以看出是得到Client端的标签的ID,

在Script#中它还支持Asp.net Ajax Runtime,主要支持的Atlas,而Atlas上面使用的还原来的那种方式$(),而C#是不支持的,所以通过写C#转换JavaScript时,这个特性就受到限制.所以其他Script#限制瞒多的,但我相信它用C#写client逻辑这个特性还是很吸引人的.

 

posted @ 2007-12-24 16:30  works guo  阅读(988)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3