Не существует способа показать прототип элемента html в IE (<8)?
Я приготовил шаблон для создания и расширения элементов html, используя их прототип. Это работает как шарм в браузерах, отличных от ie. Пример кода можно найти @jsbin (см. Источник страницы)
Преимущество этого шаблона должно быть быстрым (методы находятся в цепочке прототипов элементов, поэтому они ссылаются один раз). Вы догадались правильно: IE не уходит. В IE < 8 прототип html-элементов скрыт/недоступен, поэтому для каждого создаваемого вами элемента вам нужно снова ссылаться на нестандартные методы (оставляя много указателей, если вы интенсивно используете шаблон). Я искал в Интернете решения, но нашел только сложные обходные пути. Нет ли способа доступа к прототипу элементов HTML в IE?
Ответы
Ответ 1
Нет, и не гарантируется, что вы можете возиться с прототипами объектов DOM в JavaScript в целом. Объекты DOM не являются частью спецификации ECMAScript; они могут не быть (и традиционно не являются) родными объектами JavaScript вообще, в любом браузере.
Вот почему фреймворки, как правило, имеют свои собственные классы контейнеров-контейнеров.
Также вы не можете полагаться на 't.el.constructor, даже если они являются родными объектами JS. 'Конструктор не является стандартным свойством, недоступен в IE, и даже в Mozilla он не делает то, что вы можете себе представить. Избегайте.
Ответ 2
Да, действительно нет способа сделать это.
Элементы IE основаны на COM-объектах, которые на самом деле не позволяют добавлять сторонние члены к своим интерфейсам (в COM интерфейсы являются контрактом и не должны меняться). Внедрение этих интерфейсов не может быть расширено Javascript, элементы просто не являются прототипами.
IE добавляет специальный интерфейс, предназначенный для работы с Javascript, чтобы добавить новых членов в конкретный экземпляр, но вы не можете добавить нового члена в класс, так как нет прототипа для скрипта.
Ответ 3
Ниже вырезано и вставлено из статьи 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>
Попробуйте
Отношения