Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.11.2010, 14:23
Интересующийся
Отправить личное сообщение для vandy3 Посмотреть профиль Найти все сообщения от vandy3
 
Регистрация: 28.10.2010
Сообщений: 14

Функция проверки onDomReady. Не могу разобраться с кодом
Здравствуйте.
Читаю книгу по JS. В книге есть пример написания метода проверки загружена дом модель или нет.

var $ = function() {};

$.prototype.onDomReady = function(callback){
    if (document.addEventListener) { 
        document.addEventListener("DOMContentLoaded", callback, false); 
    } else { 
        if(document.body && document.body.lastChild){ 
            callback(); 
        } else { 
            return setTimeout(arguments.callee, 0); 
        } 
    } 
} 

$ = new $(); 

$.onDomReady(function() { 
    alert("The DOM is ready!"); 
});

Слегка изменил код функции $.prototype.onDomReady:

$.prototype.onDomReady = function ( callback ) {
  if ( document.body && document.body.lastChild ) {
    callback();
 }
  else {
    alert ( "settimeout" );
    return setTimeout ( arguments.callee, 100 );
 }
}


Открывая страницу в FireFox, после одного или более alert "settimeout", FireBug выдает ошибку, что callback не является функцией, IE так же выдает ошибку, что необходим объект.

Не понимаю, почему в таймер не передается аргумент в виде ссылки на функцию callback?
Ответить с цитированием
  #2 (permalink)  
Старый 03.11.2010, 16:17
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от vandy3
Не понимаю, почему в таймер не передается аргумент в виде ссылки на функцию callback?
А должен?

http://alljs.ru/articles/timeout/patterns.html
Ответить с цитированием
  #3 (permalink)  
Старый 04.11.2010, 11:09
Интересующийся
Отправить личное сообщение для vandy3 Посмотреть профиль Найти все сообщения от vandy3
 
Регистрация: 28.10.2010
Сообщений: 14

arguments.callee allows anonymous functions to refer to themselves, which is necessary for recursive anonymous functions... (https://developer.mozilla.org/en/Jav...guments/callee)

За ссылку спасибо, но мне бы хотелось узнать почему именно не работает исправленный мною код?

Если в firefox я в блоке if ( document.body && ... ) пишу alert ( callback ); то у меня выдаются числа. Совсем не могу понять, что за число, и откуда оно берется.
Ответить с цитированием
  #4 (permalink)  
Старый 04.11.2010, 22:23
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от vandy3
arguments.callee allows anonymous functions to refer to themselves, which is necessary for recursive anonymous functions... (https://developer.mozilla.org/en/Jav...guments/callee)
А где здесь написано про аргументы. Одну и ту же функцию можно вызывать с разными аргументами.

Сообщение от vandy3
За ссылку спасибо, но мне бы хотелось узнать почему именно не работает исправленный мною код?
Потому что вы аргумент не передаёте, вот он и не приходит.

Сообщение от vandy3
Совсем не могу понять, что за число, и откуда оно берется.
http://alljs.ru/articles/timeout/overview.html
Последний абзац.
Ответить с цитированием
  #5 (permalink)  
Старый 05.11.2010, 22:07
Интересующийся
Отправить личное сообщение для vandy3 Посмотреть профиль Найти все сообщения от vandy3
 
Регистрация: 28.10.2010
Сообщений: 14

Спасибо, за ссылку. Но если я подставляю:
setTimeout ( function () { arguments.callee( callback ); }, 100);

То у меня возникает ошибка stack overflow. В итоге, если я ставлю тайм-аут с помощью arguments.callee, то передается функция вызвавшая себя, без параметра, а если вызываю с параметром, то у меня выдается stack overflow.
Ответить с цитированием
  #6 (permalink)  
Старый 05.11.2010, 22:10
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от vandy3
Но если я подставляю:
setTimeout ( function () { arguments.callee( callback ); }, 100);

То у меня возникает ошибка stack overflow.
Разумеется, функция у вас уже другая, объект arguments тоже другой.

Опишите внутри onDomReady безымянную функцию без параметров, её и вызывайте в таймауте.

http://alljs.ru/articles/timeout/set...l.html#pattern
Ответить с цитированием
  #7 (permalink)  
Старый 08.11.2010, 09:47
Интересующийся
Отправить личное сообщение для vandy3 Посмотреть профиль Найти все сообщения от vandy3
 
Регистрация: 28.10.2010
Сообщений: 14

В очередной раз, спасибо за ссылку.

Можно сделать через pattern: http://alljs.ru/articles/timeout/set...l.html#pattern
А можно присвоить значение arguments.callee переменной: var self = arguments.callee, а потом в тайм-ауте вызвать с аргументом callback.
setTimeout ( function () { self ( callback ); }, 500 );

Все должно работать.

Последний раз редактировалось vandy3, 08.11.2010 в 15:08.
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
One Click Upload не могу разобраться a.graphics jQuery 0 06.09.2010 13:16
Помогите разобраться с кодом. TheWanderer Общие вопросы Javascript 10 17.04.2010 13:41
не могу разобраться с массивом ! jenyokCoder Общие вопросы Javascript 2 29.03.2010 00:46
помогите с кодом разобраться olgatcpip Общие вопросы Javascript 1 02.10.2009 21:21
Не могу разобраться с туториалом mr.codec jQuery 0 23.03.2009 21:27