日期:2014-05-17  浏览次数:20738 次

IE中实现HTMLElement
本文转载自博客园http://www.cnblogs.com/LongWay/archive/2008/10/08/1305952.html
    在DOM标准中,每个HTML元素都是继承自HTMLElement。比如有如下代码:
window.onload = function(){
    alert(document.body instanceof HTMLElement);
}

     会弹出true,表明了HTML的元素是HTMLElement的实例

     实际上HTMLElement继承自Element,Element继承自Node,如图:



    知道了HTMLElement这个类,就可以很方便的用Prototype来扩展每个HTML元素的方法或者属性。

但是在IE中将这个类隐藏了,不能通过代码访问。为了达到同样的目的,可以通过如下代码来进行修复:
var DOMElement ={
    extend: function(name,fn){//添加名称为name的方法fn
   
        if(!document.all)//除了ie而外的浏览器都能够访问到HTMLElement这个类
            eval("HTMLElement.prototype." + name + " = fn");
        else{
            //    IE中不能访问HTMLElement这个类
            //    为了达到同样的目的,必须重写下面几个函数
            //    document.createElement
            //    document.getElementById
            //    document.getElementsByTagName
            //    这几个函数都是获得HTML元素的方法
            //    修改这些方法,使得通过这些方法获得的每个元素拥有名称为name的方法fn

            var _createElement = document.createElement;
            document.createElement = function(tag){
                var _elem = _createElement(tag);
                eval("_elem." + name + " = fn");//_elem[name] = fn;也可以达到同样的目的
                return _elem;
            }

            var _getElementById = document.getElementById;
            document.getElementById = function(id){
                var _elem = _getElementById(id);
                eval("_elem." + name + " = fn");
                return _elem;
            }

            var _getElementsByTagName = document.getElementsByTagName;
            document.getElementsByTagName = function(tag){
                var _arr = _getElementsByTagName(tag);
                for(var _elem=0;_elem<_arr.length;_elem++)
                    eval("_arr[_elem]." + name + " = fn");