Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   Рекурсия по объектам BOM в IE (https://javascript.ru/forum/css-html-internet-explorer/28082-rekursiya-po-obektam-bom-v-ie.html)

Раед 07.05.2012 00:48

Рекурсия по объектам 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 объектов.
Только вот одна проблемка, не подскажете, почему это всё не работает

Раед 07.05.2012 21:36

Что, совсем никаких предположений?

Раед 07.05.2012 21:59

nasqad,
Я не думал, что для вас сложно разобраться в 10 строках кода.

Цитата:

Сообщение от nasqad
Но вы можете расписать что это и как работает

Ну так в том то и проблема, что пока никак не работает.

Может с коментами понятнее будет..
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 - точно есть (определена в прототипе)

devote 07.05.2012 22:23

я конечно вижу что за код и что он делает, но вот понять его необходимость ну никак не могу...

а тут:
if (elemsProtos.indexOf(el)>-1)
может не больше -1 а равно -1
тоесть может надо так:
if ( elemsProtos.indexOf(el) == -1 )

Раед 07.05.2012 22:38

Цитата:

Сообщение от devote
может не больше -1 а равно -1

Ой, точно. Спасибо.
Вот только всё равно не работает :(

Раед 07.05.2012 23:10

Проблему понял
alert(window==document)

Запустите это в IE7. Никто не подскажет, что это за бред.. :blink:

Решение:
alert(window===document)

Так всё ок. Но всё же хочется понять, как можно так привести объект к объекту, что window=document

devote 07.05.2012 23:33

потому что в ИЕ7
alert( window.toString() ); // [object]
alert( document.toString() ); // [object]
при двойном равенстве происходит сравнение типов а не ссылок на объект

Раед 07.05.2012 23:51

devote,
А где можно по подробней почитать про приведение типов при двойном равенстве??

devote 08.05.2012 00:11

Цитата:

Сообщение от Раед
А где можно по подробней почитать про приведение типов при двойном равенстве??

боюсь что об этом вряд ли где прочтешь, это некий своеобразный баг в ИЕ7 который при сравнении объектов сравнивает не ссылки на объект а их значения.

Раед 08.05.2012 00:35

Цитата:

Сообщение от devote
это некий своеобразный баг в ИЕ7

А, ясно. Я то подумал, что это во всех браузерах.


Часовой пояс GMT +3, время: 12:00.