Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.05.2012, 00:48
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Рекурсия по объектам 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 в 22:40.
Ответить с цитированием
  #2 (permalink)  
Старый 07.05.2012, 21:36
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Что, совсем никаких предположений?
Ответить с цитированием
  #3 (permalink)  
Старый 07.05.2012, 21:59
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

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 - точно есть (определена в прототипе)

Последний раз редактировалось Раед, 07.05.2012 в 22:40.
Ответить с цитированием
  #4 (permalink)  
Старый 07.05.2012, 22:23
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

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

а тут:
if (elemsProtos.indexOf(el)>-1)
может не больше -1 а равно -1
тоесть может надо так:
if ( elemsProtos.indexOf(el) == -1 )
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine

Последний раз редактировалось devote, 07.05.2012 в 22:30.
Ответить с цитированием
  #5 (permalink)  
Старый 07.05.2012, 22:38
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от devote
может не больше -1 а равно -1
Ой, точно. Спасибо.
Вот только всё равно не работает
Ответить с цитированием
  #6 (permalink)  
Старый 07.05.2012, 23:10
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

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

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

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

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

Последний раз редактировалось Раед, 07.05.2012 в 23:15.
Ответить с цитированием
  #7 (permalink)  
Старый 07.05.2012, 23:33
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

потому что в ИЕ7
alert( window.toString() ); // [object]
alert( document.toString() ); // [object]
при двойном равенстве происходит сравнение типов а не ссылок на объект
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #8 (permalink)  
Старый 07.05.2012, 23:51
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

devote,
А где можно по подробней почитать про приведение типов при двойном равенстве??
Ответить с цитированием
  #9 (permalink)  
Старый 08.05.2012, 00:11
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

Сообщение от Раед
А где можно по подробней почитать про приведение типов при двойном равенстве??
боюсь что об этом вряд ли где прочтешь, это некий своеобразный баг в ИЕ7 который при сравнении объектов сравнивает не ссылки на объект а их значения.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #10 (permalink)  
Старый 08.05.2012, 00:35
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от devote
это некий своеобразный баг в ИЕ7
А, ясно. Я то подумал, что это во всех браузерах.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
RegExp очень нужна рекурсия и ссылочность scuter Общие вопросы Javascript 9 18.08.2011 19:27
Унаследовать без привязки к объектам TicTac Общие вопросы Javascript 6 08.07.2011 16:05
не срабатывают события к объектам созданым ajax пока не запустишь любое др событие Jonyst jQuery 0 08.05.2011 13:10
jQuery, функция animate(), рекурсия xintrea jQuery 12 03.01.2011 12:33
Обращение к объектам CSS Djumpen Общие вопросы Javascript 12 11.04.2010 11:47