首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >真的没有办法在IE (<8)中公开html元素的原型吗?

真的没有办法在IE (<8)中公开html元素的原型吗?
EN

Stack Overflow用户
提问于 2009-02-26 22:51:20
回答 3查看 4K关注 0票数 7

我设计了一个模式来使用它们的原型来创建和扩展html元素。这在非ie浏览器中很有魅力。示例代码可以找到@吉斯宾 (请参阅页源)

这种模式的优点应该是速度(方法在元素原型链中,因此它们被引用一次)。你猜对了.在IE <8中,html元素的原型是隐藏的/不可访问的,因此对于您创建的每个元素,您必须再次引用非标准方法(如果密集使用该模式,将留下大量指针)。我在网上寻找解决方案,但只找到了复杂的解决办法。真的没有办法访问IE中的HTML元素原型吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-26 22:59:37

不,也不能保证您可以在JavaScript中篡改DOM对象的原型。DOM对象不是ECMAScript规范的一部分;在任何浏览器中,它们都可能不是(传统上也不是)本地JavaScript对象。

这就是为什么框架往往有自己的“容器”包装类。

而且,即使‘t.el.constructor’是原生JS对象,也不能依赖它们。“构造函数”不是一个标准属性,在IE中是不可用的,即使在Mozilla中也不能执行您可能认为的那样。避免。

票数 12
EN

Stack Overflow用户

发布于 2009-02-26 22:55:37

是的,没有办法这样做。

IE元素是基于COM对象的,它们实际上不允许任意的成员被添加到它们的接口中(在COM中,接口是一个契约,不应该改变)。这些接口的实现不能由Javascript扩展,这些元素根本不是原型。

IE添加了一个特殊的接口,用于与Javascript一起工作,以允许在特定实例中添加新成员,但您不能向“类”添加新成员,因为没有需要修改的原型。

票数 4
EN

Stack Overflow用户

发布于 2011-11-16 13:53:33

下面是从文章HTMLElement在IE中不工作中剪切和粘贴的内容。示例在IE和Firefox中运行得很好。

代码语言:javascript
复制
<html>
<head>
    <script type="text/javascript" src="DOMElement.js"></script>
    <script type="text/javascript">

        var DOMElement =
        {
            extend: function(name,fn)
            {
                if(!document.all)
                    eval("HTMLElement.prototype." + name + " = fn");
                else
                {
                    //
                    //  IE doesn't allow access to HTMLElement
                    //  so we need to override
                    //  *document.createElement
                    //  *document.getElementById
                    //  *document.getElementsByTagName
                    //

                    //take a copy of
                    //document.createElement
                    var _createElement = document.createElement;

                    //override document.createElement
                    document.createElement = function(tag)
                    {
                        var _elem = _createElement(tag);
                        eval("_elem." + name + " = fn");
                        return _elem;
                    }

                    //take copy of
                    //document.getElementById
                    var _getElementById = document.getElementById;

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

                    //take copy of
                    //document.getElementsByTagName
                    var _getElementsByTagName = document.getElementsByTagName;

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

        DOMElement.extend("foo",function(){alert('bar')});
        DOMElement.extend("about","DOMElement v0.1")
        DOMElement.extend("contents",function(){return this.innerHTML})
        var elem = document.createElement("div");
        elem.foo();

        onload = function()
        {
            var elem2 = document.getElementById("myDiv");
            alert(elem2.about);

            var divs = document.getElementsByTagName("div");
            for(var i=0;i<divs.length;i++)
                alert(divs[i].contents())
        }

    </script>
</head>
<body>

    <div id="myDiv">hi</div>
    <div id="div2">there</div>

</body>
</html>

试试看

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/592815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档