В Meteor JS, как управлять порядком загрузки Javascript относительно порядка загрузки DOM? Для анимации
У меня есть шаблон, который я скачал:
http://halibegic.com/projects/merlin/
Я хочу использовать его в Метеоре, и у меня возникли серьезные проблемы с
<script src="assets/js/script.js"></script>
внизу строки 444 не загружается в правильном порядке. Когда страница загружается, ни одна из 4 функций, указанных в этом файле js, не работает.
initNavbar();
initPortfolio();
initAnimations();
initTwitterFeed();
У меня есть все файлы CSS, шрифты, изображения и JS в моем public
папку, и все они правильно указаны в HTML. Они не в lib
каталог, который загружается раньше всего.
Я думаю, это потому, что скрипт каким-то образом загружается до загрузки DOM, поэтому у него нет DOM, к которому можно что-то применить.
Вещи, которые я пробовал:
Когда я меняю имя
script.js
вmain.js
и измените строку 444 на<script src="assets/js/main.js"></script>
анимации все еще не работают.Когда я добавляю это в файл скрипта, он все равно загружается неправильно:
$(document).ready(function () { initNavbar(); initPortfolio(); initAnimations(); initTwitterFeed(); });
я могу сделать
Template.layout.rendered/created = function () { add in all the function code and call them here }
но это кажется невероятно, НЕВЕРОЯТНО грязным и неэффективным способом сделать это. Мне нужно указать порядок загрузки отдельных файлов, а не код. У меня есть около пяти файлов.js в этом шаблоне, и я не хочу вырезать их код и вставить все это в один
Template.layout.rendered/created
функция.
5 ответов
Все, что вам нужно сделать, это загрузить javascript после рендеринга шаблона.
Template.yourLayout.created = function() {
$('head').append('<script type="text/javascript" src="assets/js/script.js">');
}
Если у вас есть скрипты, загруженные в $ (window).load () или $ (document).ready (), не забывайте также об этом. Вы также можете запустить их в обещании $getScript. Это ваш случай:
$.getScript('assets/js/script.js', function() {
initNavbar();
initPortfolio();
initAnimations();
initTwitterFeed();
$(".loader .fading-line").fadeOut();
$(".loader").fadeOut("slow");
});
Ни один из приведенных выше ответов не работал для меня, поэтому я продолжал взламывать, пока, наконец, не сработало следующее:
Template.layout.rendered = function() {
// hack: these third party header animation scripts must be inserted at the bottom of body
$('body').append('<script type="text/javascript" src="assets/js/classie-main.js">');
$('body').append('<script type="text/javascript" src="assets/js/cbpAnimatedHeader.js">');
};
Я положил это в свой файл layout.js.
Спасибо Имславко за ответ!
На сервере функция будет запущена, как только процесс сервера завершится. На клиенте функция будет запущена, как только DOM будет готов.
Поэтому я положил это в мой клиент /views/application/layout.js. Он использует jQuery $.getScript, поэтому вы должны убедиться, что jQuery загружен, прежде чем пытаться это:
Meteor.startup( function () {
$.getScript("assets/js/jquery.min.js");
$.getScript("assets/js/bootstrap.min.js");
$.getScript("assets/js/isotope.pkgd.min.js");
$.getScript("assets/js/imagesloaded.min.js");
$.getScript("assets/js/jquery.scrollTo.min.js");
$.getScript("assets/js/jquery.nav.min.js");
$.getScript("assets/js/jquery.appear.min.js");
$.getScript("assets/js/twitterFetcher.min.js");
$.getScript("assets/js/script.js");
});
Таким образом, все эти файлы теперь будут загружаться ПОСЛЕ загрузки DOM, и, следовательно, анимация работает.
Отсюда ясно: Meteor Docs
Лучше всего написать приложение так, чтобы оно не зависело от порядка загрузки файлов, например, с помощью Meteor.startup или путем перемещения кода, чувствительного к порядку загрузки, в пакеты, которые могут явно контролировать порядок загрузки их содержимого и порядка их загрузки по отношению к другим пакетам. Однако иногда зависимости порядка загрузки в вашем приложении неизбежны.
Когда не используются специальные имена файлов и каталогов:
Файлы в подкаталогах загружаются до файлов в родительских каталогах, поэтому файлы в самом глубоком подкаталоге загружаются первыми, а файлы в корневом каталоге загружаются последними. - Внутри каталога файлы загружаются в алфавитном порядке по имени файла. Ниже приведен полный список специальных имен файлов и каталогов, которые контролируют порядок загрузки файлов:
Lib
После сортировки, как описано выше, все файлы в каталогах с именем lib перемещаются перед всем остальным, сохраняя их порядок.
главный.*
Все файлы, соответствующие main.*, Перемещаются после всего остального, сохраняя свой порядок.
Я использовал этот шаблон
Template.layout.created = function() {
var jsLibs = [
'vendors/Flot/jquery.flot.js',
'vendors/Flot/jquery.flot.pie.js',
'vendors/Flot/jquery.flot.pie.js',
'vendors/Flot/jquery.flot.pie.js',
'vendors/Flot/jquery.flot.pie.js',
'vendors/Flot/jquery.flot.pie.js',
'vendors/Flot/jquery.flot.pie.js',
'vendors/Flot/jquery.flot.pie.js',
'vendors/Flot/jquery.flot.time.js',
'vendors/Flot/jquery.flot.stack.js',
'vendors/Flot/jquery.flot.resize.js',
'js/flot/jquery.flot.orderBars.js',
'js/flot/curvedLines.js',
'js/flot/date.js',
'js/flot/jquery.flot.spline.js',
'js/flot/curvedLines.js',
'vendors/bootstrap/dist/js/bootstrap.min.js',
'vendors/bootstrap/dist/js/bootstrap.min.js',
'vendors/fastclick/lib/fastclick.js',
'vendors/nprogress/nprogress.js',
'vendors/Chart.js/dist/Chart.min.js',
'vendors/bernii/gauge.js/dist/gauge.min.js',
'vendors/bootstrap-progressbar/bootstrap-progressbar.min.js',
'vendors/iCheck/icheck.min.js',
'vendors/skycons/skycons.js',
'js/maps/jquery-jvectormap-2.0.3.min.js',
'js/moment/moment.min.js',
'js/datepicker/daterangepicker.js',
'build/js/custom.min.js',
'js/maps/jquery-jvectormap-world-mill-en.js',
'js/maps/jquery-jvectormap-us-aea-en.js',
'js/maps/gdp-data.js'
];
jsLibs.forEach((lib) => {
$('head').append(`<script type="text/javascript" src="${lib}">`);
});
}
Затем переместите все $(document).ready()
призывает в Template.layout.onRendered
и click
события в Template.layout.events({