Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция проверки onDomReady. Не могу разобраться с кодом (https://javascript.ru/forum/misc/12797-funkciya-proverki-ondomready-ne-mogu-razobratsya-s-kodom.html)

vandy3 03.11.2010 14:23

Функция проверки 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?

Kolyaj 03.11.2010 16:17

Цитата:

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

А должен?

http://alljs.ru/articles/timeout/patterns.html

vandy3 04.11.2010 11:09

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 ); то у меня выдаются числа. Совсем не могу понять, что за число, и откуда оно берется.

Kolyaj 04.11.2010 22:23

Цитата:

Сообщение от 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
Последний абзац.

vandy3 05.11.2010 22:07

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

То у меня возникает ошибка stack overflow. В итоге, если я ставлю тайм-аут с помощью arguments.callee, то передается функция вызвавшая себя, без параметра, а если вызываю с параметром, то у меня выдается stack overflow.

Kolyaj 05.11.2010 22:10

Цитата:

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

То у меня возникает ошибка stack overflow.

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

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

http://alljs.ru/articles/timeout/set...l.html#pattern

vandy3 08.11.2010 09:47

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

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

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


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