Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Определение приоритета при выполнении обработчиков DOMContentLoaded (https://javascript.ru/forum/events/71639-opredelenie-prioriteta-pri-vypolnenii-obrabotchikov-domcontentloaded.html)

fedushok 02.12.2017 09:53

Определение приоритета при выполнении обработчиков DOMContentLoaded
 
Приветствую!

Есть несколько элементов разметки (скажем элементы АБВ), ссылки на которые используются в нескольких модулях JS. Сейчас каждый раз для использования одного из этих элементов разметки в каком-либо модуле сначала выполняется поиск этого элемента и получение ссылки на него.
Полагаю более целесообразно организовать отдельный модуль JS (скажем модуль Б) для элементов АБВ, из которого брать ссылки на эти элементы. Ссылки на соответствующие элементы разметки получать при выполнении события DOMContentLoaded.
Вопрос в том, что есть модули JS, которые также участвуют в обработке события DOMContentLoaded и при этом используют ссылки на элементы АБВ. Может получится так, что обработчик события DOMContentLoaded модуля Б еще не будет выполнен и ссылки на АБВ еще не получены, но уже востребованы в прочих модулях. Как определить приоритет выполнения обработки события DOMContentLoaded в модуле Б по сравнению с прочими модулями?

Aetae 02.12.2017 11:52

Грузить его первым без асинхрона, кек.

Какой обработчик первым зарегистрирован тот первым и отработает.

fedushok 02.12.2017 13:53

То есть ставить модуль Б первым js файлом на странице.
А более академичный вариант есть?

Aetae 02.12.2017 21:47

Академично поставить его первым при сборке.)

Нет, серьёзно: модули на то и модули, что автономны. Если им надо ждать какой-то один - значит придётся ждать. Приоритет обработчиков событий определяется очерёдностью их установки и более никак.(и то спасибо развитию и стандартизации, когда-то это вообще рандом был)

Если очень хочется сделать пафосно, то можно в главном модуле налепить ленивых геттеров на нужные элементы, чтоб элемент получали с первым обращением. Примерно так:
...
get topElement(){
  delete this.topElement;
  return this.topElement = this.container.querySelector('.top-element')
},
...


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