Использование JavaScript в теге JSP

Я видел этот вопрос, касающийся импорта js-файлов, связанных с содержимым тега сам. У меня аналогичная проблема, здесь у меня есть тег jsp, который генерирует некоторый HTML и имеет общую js-реализацию, которая обрабатывает поведение этого HTML. Кроме того, мне нужно написать несколько операторов инициализации, чтобы потом я мог использовать их через JavaScript. Чтобы можно было использовать этот «обработчик» в моем JavaScript, он должен быть каким-то образом доступен.

Вопрос в том ... Можно ли писать встроенные теги ‹script› вместе с моим HTML для создания экземпляров и целей инициализации (лично я не думаю, что это очень элегантно)? А что касается доступности для мира JS, должен ли я оставить глобальную переменную, ссылающуюся на мой объект-обработчик (я думаю, не очень элегантно), есть ли лучшие способы сделать это?


person Pablo Cabrera    schedule 23.10.2008    source источник


Ответы (4)


Вам следует стремиться к тому, чтобы javascript находился в его собственных файлах. Обычно это делается с помощью Progressive Enhancement. Но иногда у вас нет выбора, например, когда один и тот же 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-файле.

person Magnar    schedule 23.10.2008

Я не совсем уверен, о чем вы здесь спрашиваете, но я не вижу ничего плохого в том, чтобы включить теги <script> в JSP для создания экземпляра кода javascript. Я часто следую этой модели, пишу код библиотеки во внешних файлах javascript, а затем вызываю конструкторы моих объектов из тегов <script>.

Это упрощает отладку, поскольку вся логика находится во внешних файлах (и firebug, похоже, не может отлаживать встроенный код javascript). Библиотеки кэшируются, а данные, создающие их экземпляры, - нет (что является желаемым поведением).

Альтернативой является динамическое создание кода создания экземпляра во внешнем файле javascript или вызове AJAX. Я тоже это сделал, но с положительными результатами.

Я думаю, что решающим фактором является количество имеющихся у вас динамических данных. Если вам нужно представить большие структуры данных, я бы обслужил их с помощью вызова AJAX, который возвращает JSON. Если это простой вызов конструктора, поместите его в JSP.

Что касается глобальной переменной, у меня часто бывает глобальная для объекта верхнего уровня, который запускает все. Внутри находятся все остальные ссылки на вспомогательные объекты.

person pkaeding    schedule 23.10.2008

Хотя я согласен с тем, что это не совсем элегантно, я, как известно, делал это несколько раз при объединении серверных решений с интегрированной средой AJAX. Повторение встроенных тегов ‹script› для инициализации некоторых переменных - не страшная вещь, пока никто этого не видит.

Что касается лучших методов, я о них не знаю. Я делал это так редко, что не искал более элегантного или «правильного» решения.

person Community    schedule 23.10.2008

Допускается использование тегов <script> в соответствии с HTML. Бывают случаи, когда это необходимо, но насколько лучше я не знаю. Не усложняя ситуацию, проще использовать тег <script>, чем пытаться найти способ реализовать файлы js.

person Dennis    schedule 23.10.2008