Я видел, как этот вопрос регистрировал импорт js-файлов, связанных с самим содержимым тега. У меня аналогичная проблема, здесь у меня есть тег jsp, который генерирует некоторый HTML и имеет общую js-реализацию, которая обрабатывает поведение этого HTML. Кроме того, мне нужно написать несколько операторов инициализации, чтобы потом я мог использовать их через JavaScript. Чтобы можно было использовать этот «обработчик» в моем JavaScript, он должен быть каким-то образом доступен.
Вопрос в том ... Можно ли писать встроенные теги <script> вместе с моим HTML для создания экземпляров и целей инициализации (лично я не думаю, что это очень элегантно)? А что касается доступности для мира JS, должен ли я оставить глобальную переменную, ссылающуюся на мой объект-обработчик (я думаю, не очень элегантно), есть ли лучшие способы сделать это?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хотя я согласен с тем, что это не совсем элегантно, я, как известно, делал это несколько раз при объединении серверных решений с интегрированной средой AJAX. Повторение встроенных тегов <script> для инициализации некоторых переменных не страшно, если его никто не видит.
Что касается лучших методов, я о них не знаю. Я делал это так редко, что не искал более элегантного или «правильного» решения.
Я не совсем уверен, о чем вы здесь спрашиваете, но я не вижу ничего плохого в том, чтобы включить теги <script> в JSP для создания экземпляра кода javascript. Я часто следую этой модели, записывая код библиотеки во внешние файлы javascript, а затем вызывая конструкторы моих объектов из тегов <script>.
Это упрощает отладку, так как вся логика находится во внешних файлах (и firebug, похоже, имеет проблемы с отладкой встроенного кода javascript). Библиотеки кэшируются, а данные, создающие их экземпляры, - нет (что является желаемым поведением).
Альтернативой является динамическое создание кода создания экземпляра во внешнем файле javascript или вызове AJAX. Я тоже это сделал, но с положительными результатами.
Я думаю, что решающим фактором является то, сколько у вас динамических данных. Если вам нужно представить большие структуры данных, я бы подал их с помощью вызова AJAX, который возвращает JSON. Если это простой вызов конструктора, поместите его в JSP.
Что касается глобальной переменной, у меня часто есть глобальная переменная для объекта верхнего уровня, которая запускает все. Внутри находятся все остальные ссылки на вспомогательные объекты.
Это нормально с использованием тегов <script> в соответствии с HTML. Бывают случаи, когда это необходимо, но насколько лучше я не знаю. Не усложняя ситуацию, проще использовать тег <script>, чем пытаться найти способ реализовать файлы js.
Вам следует стремиться к тому, чтобы javascript находился в его собственных файлах. Обычно это делается с помощью Прогрессивное улучшение. Но иногда у вас нет выбора, например, когда один и тот же JSP отображает страницы на разных языках. Вот пример из реальной жизни:
JSP:
<script src = "/javascript/article_admin.js"></script>
<script type = "text/javascript">
NP_ArticleAdmin.initialize({
text: {
please_confirm_deletion_of: '<i18n:output text = "please.confirm.deletion.of"/>',
this_cannot_be_undone: '<i18n:output text = "this.cannot.be.undone"/>'
}
});
</script>
JavaScript (article_admin.js):
/*global NP_ArticleAdmin, jQuery, confirm */
NP_ArticleAdmin = function ($) {
var text;
function delete_article(event) {
var article = $(this).parents("li.article"),
id = article.attr("id"),
name = article.find("h3.name").html();
if (confirm(text.please_confirm_deletion_of + name + text.this_cannot_be_undone)) {
$.post("/admin/delete_article", {id: id});
article.fadeOut();
}
event.preventDefault();
return false;
}
function initialize(data) {
text = data.text;
$("#articles a.delete").click(delete_article);
}
return {initialize: initialize};
}(jQuery);
В этом примере единственный javascript в JSP-файле - это та часть, которая должна быть там. Основные функции разделены в отдельном js-файле.