Рекурсия по объектам BOM в IE
if ($m.ie) {
elemsProtos = [];
(function recBOMS(el) {
if (el==document) return;
for (var i in Objectprototypeobject) if (!(i in el)) el[i] = Objectprototypeobject[i];
elemsProtos.push(el);
for (var i in el) if (elemsProtos.indexOf(el)==-1) recBOMS(el[i]);
})(window);
for (var i in Objectprototypeobject) Element.prototype[i] = document[i] = Objectprototypeobject[i];
}
По плану, в IE этот код должен рекурсивно устанавливать определённые методы (определены они в Objectprototypeobject) части BOM объектов. Только вот одна проблемка, не подскажете, почему это всё не работает |
Что, совсем никаких предположений?
|
nasqad,
Я не думал, что для вас сложно разобраться в 10 строках кода. Цитата:
Может с коментами понятнее будет..
if ($m.ie) {//Если IE (объект $m точно есть, и свойство ie в нём точно правильное)
elemsProtos = [];//кэш объектов
(function recBOMS(el) {//ф-ия с вызовом на месте (принимает объект, которому нужно выставить свойства)
if (el==document) return;//дальше document - нельзя, там DOM, он не нужен
/*
Objectprototypeobject - объект, в котором определены нужные методы.
Он точно есть и методы в нём точно есть.
Следующая строка кода просто переписывает методы из Objectprototypeobject в el, если их в нём ещё нет
*/
for (var i in Objectprototypeobject) if (!(i in el)) el[i] = Objectprototypeobject[i];
elemsProtos.push(el);//кидаем объект в кэш, чтобы лишни раз с ним не работать (к примеру window.top==window и может произойти зацикливание)
for (var i in el) if (elemsProtos.indexOf(el)==-1) recBOMS(el[i]);//а теперь побегаемся по всем свойствам объекта, и если их нет в кэше, производим рекурсию
})(window);
for (var i in Objectprototypeobject) Element.prototype[i] = document[i] = Objectprototypeobject[i];//эта строка работает, на неё не обращайте внимания
}
P.S. array.indexOf - точно есть (определена в прототипе) |
я конечно вижу что за код и что он делает, но вот понять его необходимость ну никак не могу...
а тут: if (elemsProtos.indexOf(el)>-1)может не больше -1 а равно -1 тоесть может надо так: if ( elemsProtos.indexOf(el) == -1 ) |
Цитата:
Вот только всё равно не работает :( |
Проблему понял
alert(window==document) Запустите это в IE7. Никто не подскажет, что это за бред.. :blink: Решение: alert(window===document) Так всё ок. Но всё же хочется понять, как можно так привести объект к объекту, что window=document |
потому что в ИЕ7
alert( window.toString() ); // [object] alert( document.toString() ); // [object]при двойном равенстве происходит сравнение типов а не ссылок на объект |
devote,
А где можно по подробней почитать про приведение типов при двойном равенстве?? |
Цитата:
|
Цитата:
|
| Часовой пояс GMT +3, время: 10:48. |