Рекурсия по объектам 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, время: 12:00. |