Функция проверки 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? |
Цитата:
http://alljs.ru/articles/timeout/patterns.html |
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 ); то у меня выдаются числа. Совсем не могу понять, что за число, и откуда оно берется. |
Цитата:
Цитата:
Цитата:
Последний абзац. |
Спасибо, за ссылку. Но если я подставляю:
setTimeout ( function () { arguments.callee( callback ); }, 100);
То у меня возникает ошибка stack overflow. В итоге, если я ставлю тайм-аут с помощью arguments.callee, то передается функция вызвавшая себя, без параметра, а если вызываю с параметром, то у меня выдается stack overflow. |
Цитата:
Опишите внутри onDomReady безымянную функцию без параметров, её и вызывайте в таймауте. http://alljs.ru/articles/timeout/set...l.html#pattern |
В очередной раз, спасибо за ссылку.
Можно сделать через pattern: http://alljs.ru/articles/timeout/set...l.html#pattern А можно присвоить значение arguments.callee переменной: var self = arguments.callee, а потом в тайм-ауте вызвать с аргументом callback.
setTimeout ( function () { self ( callback ); }, 500 );
Все должно работать. |
| Часовой пояс GMT +3, время: 19:19. |