百度首页 | 百度空间
 
查看文章
 
我修改的$函数
2007年06月18日 星期一 下午 05:03

大家都知道document.getElementById在ie和opera上面有错误的行为,会把input的name当做id来查找,$函数使用了getElementById所以自然在ie opera上可能和ff safari上面返回结果不一样,为了100%的cross-browser我写了个修正的$函数,为ie和opera各自写了个path,其实都是性能问题,不然$$("*[id="+id+"]").first()就解决了,$$的性能还是比不上native的函数的,ie的path比较复杂,初学不建议这么用,供大家参考吧

function $(element) {
   if (arguments.length > 1) {
     for (var i = 0, elements = [], length = arguments.length; i <
length; i++)
       elements.push($(arguments[i]));
     return elements;
   }
     if (typeof element == 'string')
           {
       var id=element;
       element = document.getElementById(element);
           var tmp=[];
           var t=document.getElementById(id);
           if (Prototype.Browser.IE)
           {
           while(t!=null && t.id!=id)
                   {
                         var e=t.outerHTML;
                         t.outerHTML=t.outerHTML.indexOf('name="')!=-1?
t.outerHTML.replace('name="'+t.name+'"','name="'+t.name
+'_tmp_"'):t.outerHTML.replace('name='+t.name,'name='+t.name+'_tmp_')
                         tmp.push([document.getElementById(t.name+"_tmp_"),e])
                         t=document.getElementById(id);
                   }
                 tmp.each(function(node){node[0].outerHTML=node[1]});
           }
           else if(Prototype.Browser.Opera)
           {
           while(t!=null && t.id!=id)
                   {
                         tmp.push([t,t.name])
                         t.name+="_tmp_";
                         t=document.getElementById(id);
                   }
                 tmp.each(function(node){node[0].name=node[1]});
           }
                 element=t;
           }
   return Element.extend(element);

}

类别:javascript&web2.0 | 添加到搜藏 | 浏览() | 评论 (4)
 
最近读者:
 
网友评论:
1
2007年06月18日 星期一 下午 05:58
此函数绝对不建议在项目当中使用,绝对只能学习来用,如果真想fix这个bug那$$("*[id="+element+"]").first()当然是最好的了,记住,代码只要看起来简洁,那一般情况下,工作起来也是不容易出毛病的
 
2
2007年06月18日 星期一 下午 06:29
忘掉这个函数吧,发现第一个重大bug,因为ie里面无法修改name属性,所以我重建了outerHTML,但是我没有注意到outerHTML修改后会生成一个新element原来所有的event都没了,重大bug,估计opera下面不会有,大家看着代码就当学习吧,千万别在工作中使用呀,出问题别找我,哈哈
 
3
2007年06月19日 星期二 下午 08:59
补充:关于outerHTML更新后event handlers丢失的解释,如果原对象是<input type=button onclick="alert('hello')" vaue="sss" id="test" />这样的对象,那修改outerHTML只要不去掉onclick标记和内容,那onclick事件不会丢失,打印outerHTML并不会因为onclick是event而不出现在outerHTML里面,但是动态添加的事件,比如$("test").onclick=function(){alert("hello")}这样的事件一定会丢失,因为修改outerHTML就是重新创建元素,只有outerHTML里面的html生效,动态加上去的一切无效,就算$("test").outerHTML=$("test").outerHTML也会导致动态事件全部丢失,outerHTML相当危险,最好别使用
 
4
2008年06月23日 星期一 下午 09:28
一个学会了批评和自我批评的人.
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu