Вам нужно будет сохранить состояние, если пользовательское событие было запущено где-то. Одно хорошее место - Магазин Элементов .
Для пользовательских событий могут быть определены различные свойства. Одним из полезных свойств для этого случая является onAdd
, который в основном является функцией, которая вызывается, когда вы добавляете это событие к некоторому элементу DOM, вызывая <element>.addEvent(<name>, <fn>)
. Ваша функция для onAdd
будет вызвана и передана fn
в качестве параметра. Проверьте, было ли событие уже запущено, и если это так, немедленно вызовите fn
, иначе ничего не делайте. Подробнее о свойствах пользовательских событий читайте в разделе Hash: Element.Events в нижней части.
Element.Events.resourcesLoaded = {
onAdd: function(fn) {
if(window.retrieve('resourcesLoaded')) {
fn.call(this);
}
}
};
Когда вы впервые запускаете событие resourcesLoaded, также задайте логическое свойство для объекта window. onAdd
теперь может получить это значение, чтобы узнать, нужно ли немедленно запускать обработчики событий.
window.fireEvent('resourcesLoaded');
window.store('resourcesLoaded', true);
Это должно сделать это. Вот два тестовых сценария:
Ресурсы не были загружены , поэтому обратный вызов не должен запускаться немедленно.
window.addEvent('resourcesLoaded', function() { alert("should wait"); });
Ресурсы загружены , поэтому обратный вызов срабатывает немедленно.
window.addEvent('resourcesLoaded', function() { alert("shouldn't wait"); });
Я взял это из исходного кода MooTools. Вот как он обрабатывает событие domready
.
В дополнение к этому, одинаково легко реализовать события внутри ваших собственных пользовательских объектов, и вам не нужно полагаться на элементы DOM, такие как window, для выполнения работы, если событие не имеет ничего общего с DOM. *