Неужели нет способа выставить прототип html-элемента в IE (<8)? - PullRequest
7 голосов
/ 27 февраля 2009

Я подготовил шаблон для создания и расширения html-элементов, используя их прототип. Это работает как шарм в не-то есть браузерах. Пример кода можно найти @ jsbin (см. Страницу источника)

Преимуществом этого шаблона должна быть скорость (методы находятся в цепочке прототипов элементов, поэтому на них ссылаются один раз). Вы правильно догадались: IE не уходи. В IE <8 прототип html-элементов скрыт / недоступен, поэтому для каждого создаваемого вами элемента вам придется снова ссылаться на нестандартные методы (оставляя вам много указателей, если вы интенсивно используете шаблон). Я искал в Интернете решения, но нашел только сложные обходные пути. Неужели <em>на самом деле нет способа получить доступ к прототипу HTML-элементов в IE?

Ответы [ 3 ]

12 голосов
/ 27 февраля 2009

Нет, и при этом не гарантируется, что вы можете в целом работать с прототипами объектов DOM на JavaScript. Объекты DOM не являются частью спецификации ECMAScript; они могут вообще не быть (и традиционно не являются) нативными объектами JavaScript в любом браузере.

Вот почему фреймворки, как правило, имеют свои собственные классы-обертки-контейнеры.

Также вы не можете полагаться на t.el.constructor, даже если это были нативные объекты JS. «Конструктор» не является стандартным свойством, недоступен в IE, и даже в Mozilla не делает то, о чем вы думаете. Избегайте.

4 голосов
/ 27 февраля 2009

Да, действительно нет способа сделать это.

Элементы IE - это основанные COM-объекты, которые фактически не позволяют добавлять произвольные элементы к их интерфейсам (в COM интерфейсы являются контрактом и никогда не должны изменяться). Реализация этих интерфейсов не может быть расширена с помощью Javascript, элементы просто не являются прототипами.

IE добавляет специальный интерфейс, предназначенный для работы с Javascript, чтобы разрешить добавление новых членов в конкретный экземпляр, но вы не можете добавить новый член в 'class', так как нет прототипа, с которым можно было бы играть.

0 голосов
/ 16 ноября 2011

Следующая, вырезанная и вставленная из статьи 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>

Попробуй Привет

...