难道真的没有办法在 IE 中暴露 html 元素的原型吗(<8)?

问题描述 投票:0回答:3

我编写了一个模式来使用其原型创建和扩展 html 元素。这在非 ie 浏览器中就像一个魅力。 示例代码可以在@jsbin1

找到

这种模式的优点应该是速度(方法在elements原型链中,所以被引用一次)。你猜对了:IE不行。在 IE 中< 8 the prototype of html elements is hidden/not accessible, so for every element you create, you have to reference the non standard methods again (leaving you with a lot of pointers if you use the pattern intensively). I have searched the web for solutions, but only found complex workarounds. Is there 真的无法在 IE 中访问 HTML 元素原型?

1 唉:jsbin 代码迷失在云端了。

javascript internet-explorer dom prototype-programming
3个回答
12
投票

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

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

此外,即使它们是原生 JS 对象,您也不能依赖“t.el.constructor”。 “构造函数”不是标准属性,在 IE 中不可用,甚至在 Mozilla 中也不会执行您可能认为它会执行的操作。避免。


4
投票

是的,确实没有办法做到这一点。

IE 元素是基于 COM 对象,实际上不允许将任意成员添加到其接口中(在 COM 中,接口是契约,永远不应该更改)。这些接口的实现无法通过 Javascript 进行扩展,这些元素根本就不是原型。

IE 添加了一个特殊的接口,旨在与 Javascript 配合使用,以允许向特定实例添加新成员,但您无法向“类”添加新成员,因为没有原型可以摆弄。


0
投票

以下内容是从文章 HTMLElement 在 IE 中不起作用 中剪切并粘贴的。示例在 IE 和 Firefox 中完美运行。

<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>

尝试一下 问候

© www.soinside.com 2019 - 2024. All rights reserved.