2010-03-18 2 views
2

У меня есть несколько функций document.ready на странице, и я хочу, чтобы функция вызывалась, когда выполнялись все мои функции document.ready. Я просто хочу, чтобы функция вызывалась в самом конце, после выполнения всех других функций document.ready. Примером этого может быть то, что каждая функция document.ready увеличивает глобальную переменную, когда она была выполнена, а последней функции необходимо проверить значение этой переменной в самом конце.Как я могу вызвать функцию в самом конце document.ready

Любые идеи?

ответ

7

Этого будет достаточно:

$(function() { 
    window.setTimeout(function() { 
     // your stuff here 
    }, 0); 
}); 

Это откладывает выполнение вашей функции после всех остальных в документе готовой очереди выполняются.

+0

Вы можете протестировать его здесь: http://jsfiddle.net/65Ve5/3/ –

+0

чище, чем моя идея, мне нравится – markcial

+0

+1. Я не знал об этом. Я бы подумал, что JS-движок оптимизирует 'setTimeout (f, 0)' прочь. Это поведение указано где-то, или вы наткнулись на него сами? – janmoesen

1

Первая идея (для небольших приложений): Убирать

Вы можете просто положить все в одном $() готовый() вызов.. Это может привести к рефакторингу, но в большинстве случаев это правильно.

Вторая идея:. Медиатор [шаблон]

Создать класс-посредник, который будет регистрировать функции и вызывать ее регистр() вместо $() готов(). Когда все функции зарегистрированы, вы просто перебираете коллекцию и запускаете их в единственном и только $(). Ready(), и у вас есть точка в коде, которая только после того, как все выполнено.

В настоящее время я разрабатываю раму для приложений jquery, у которых есть посредник. Я могу придерживаться небольшой версии, включая посредника, если вам интересно.

0

Почему бы не просто назвать это после всех остальных?

$(function(){ 
    func1(); 
    ... 
    funcN(); 
    functionThatNeedsToBeCalledAfter(); 
}); 

Конечно вы должны очистки код иметь только 1 место, где используется функция готова документ ... но тогда ваш код будет более читабельным, так что стоит.

0

немного Hacky, но может работать, создать переменную внутри JQuery рамки, как этот

 
$.imDone = false 

затем создать функцию с SetTimeout называемой через короткий промежуток времени для поиска для переменной Ser к истинному

 
var theLastFunctionToCall = function(){ 
    alert('I m the last being called!') 
} 
var trigger = function(){ 
    $.imDone?theLastFunctionToCall():window.setTimeout(trigger,10); 
} 
trigger(); 

Я рекомендую это только тогда, когда у вас есть разные $ (document) .ready в разных больших js-файлах, но если вы можете реорганизовать, я искренне рекомендую оптимальное решение.

Смежные вопросы