Я реализую эту тему Developr из темыforest в приложение Meteor.
В настоящее время я выполняю это, помещая соответствующие javascripts в /public
и добавляя их с помощью jQuery:
Meteor.startup(function() {
$('head').append('<script src="/template_stuff.js"></script>');
// .. all 7 scripts or so
});
Если требуемые сценарии помещаются в /client/js/
, кажется, что они либо запускаются слишком рано, либо до того, как DOM будет загружаться. Если они размещены непосредственно в заголовке основного файла html, они, похоже, будут работать одинаково.
Я что-то пропустил здесь - есть ли более элегантный способ загрузки скриптов после загрузки DOM?
Существует несколько способов ожидания загрузки DOM для ввода ваших скриптов:
$(function() {... })
Что касается элегантности, я использую помощник руля, поскольку он позволяет мне консолидировать код "после тела" в одном месте. Затем при необходимости используйте документ jQuery.
Например,
// in client/handlebars.js
Handlebars.registerHelper('afterBody', function(name, options) {
function isMobileSafari() {
return navigator.userAgent.match(/(iPod|iPhone|iPad)/) &&
navigator.userAgent.match(/AppleWebKit/)
}
if (isMobileSafari()) {
$(function () {
FastClick.attach(document.body)
})
}
//// load scripts however you want...
// $(function () {
// $.getScript as Daniel suggests
// $('body').append as you have
// pure js: document.createElement('script')
// })
})
// in client/main.html (using mini-pages router)
<template name="layout_no_header">
{{{yield}}}
{{afterBody}}
</template>
<template name="layout">
{{> header}}
{{{yield}}}
{{afterBody}}
</template>
Я думаю, у вас может быть другая проблема. Похоже, что сторонний код завернут в закрытие и работает некорректно. Попробуйте поместить их в папку client/compatibility
. Это предотвратит его закрытие в закрытии, которое может решить проблемы сторонних разработчиков. Убедитесь, что порядок загрузки внутри здесь правильный, он загружает файлы в алфавитном порядке внутри папки. (порядок загрузки)
Если это не сработает, узнайте, где выполняется код и закомментируйте вызов. Затем загрузите html внутри шаблона, даже если это всего лишь шаблон страницы со всем html. Создайте js
файл для шаблона и вызовите методы в обработанном шаблоном обратном вызове.
// Execute this function when myPage template is rendered
Template.myPage.rendered = function() {
stuff.init();
stuff2.run();
};
Обратите внимание, что для вызова stuff2
и т.д. Вам, скорее всего, понадобится сценарий в папке совместимости, чтобы вы могли достигнуть пространств имен из template_stuff.js
.
Использовать jQuery getScript()
(function ($) {
$.getScript("/template_stuff.js");
})(jQuery);
$.getScript()
api.jquery.com/jQuery.getScript